import numpy as np import matplotlib.pyplot as plt import seaborn as sns import numpy as np def wgn(signal, snr=0): signal_power = np.mean(signal ** 2) noise_power = signal_power / (10 ** (snr / 10)) noise = np.random.normal(0, np.sqrt(noise_power), len(signal)) return noise def hilbert(signal, num_hilbert=11): n = np.arange(-num_hilbert // 2, num_hilbert // 2 + 1) hilbert_transformer = np.where(n % 2 != 0, 2j / (np.pi * n), 0) hilbert_transformer[num_hilbert // 2] = 1 return np.convolve(signal, hilbert_transformer, mode='same') def pulse_compress(signal_src, signal_ref): # 计算所需的FFT长度 fft_len = 2 * len(signal_src) - 1 fft_len = int(2 ** np.ceil(np.log2(fft_len))) # 对参考信号进行共轭翻转 signal_ref = np.conj(np.flip(signal_ref)) # 对信号进行Hamming窗加权 window = np.hamming(len(signal_ref)) signal_ref *= window # 对输入信号和参考信号进行零padding signal_src = np.pad(signal_src, (0, fft_len - len(signal_src)), 'constant') signal_ref = np.pad(signal_ref, (0, fft_len - len(signal_ref)), 'constant') # 进行FFT和卷积 signal_src_fft = np.fft.fft(signal_src, fft_len) signal_ref_fft = np.fft.fft(signal_ref, fft_len) signal_dst_fft = signal_src_fft * signal_ref_fft # 执行IFFT得到脉冲压缩信号 signal_dst = np.fft.ifft(signal_dst_fft, fft_len) return signal_dst def lfm(tau, fs, fl, bw): times = np.linspace(0, tau - 1 / fs, int(tau * fs)) phase = 2 * np.pi * fl * times + np.pi * bw / tau * times ** 2 signal = np.exp(1j * phase) return signal signal = np.real(lfm(7e-6, 20e6, 222e6, 6e6)) noise_samples = [] for _ in range(100): noise = wgn(signal, 0) noise = hilbert(noise) noise = pulse_compress(noise, noise) noise_samples.extend(noise) xpower = np.sum(signal ** 2) / len(signal) npower = np.sum(np.abs(noise_samples) ** 2) / len(noise_samples) noise_samples = np.abs(noise_samples) mean = np.mean(noise_samples) var = np.var(noise_samples) print(mean, var) print(xpower, npower) print(np.max(noise_samples)) # 概率密度函数(PDF)图 plt.figure() sns.kdeplot(noise_samples, bw_adjust=0.5) plt.title('Probability Density Function (PDF)') plt.savefig('./img/noise_pdf.png') # 累积分布函数(CDF)图 plt.figure() sns.ecdfplot(noise_samples) plt.title('Cumulative Distribution Function (CDF)') plt.savefig('./img/noise_cdf.png') # 箱线图(Box Plot) plt.figure() sns.boxplot(x=noise_samples) plt.title('Box Plot') plt.savefig('./img/noise_boxplot.png') # 显示所有图像 plt.show()