97 lines
2.6 KiB
Python
97 lines
2.6 KiB
Python
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()
|