phytium-vsipl/script/testThreshold.py

97 lines
2.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()