|
- import numpy as np
- from scipy.fftpack import fft, ifft, fftshift
- import scipy.signal
- from matplotlib.pylab import mpl
- import matplotlib.pyplot as plt
- mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
- mpl.rcParams['axes.unicode_minus'] = False # 显示负号
- # LFM信号经过中放的匹配滤波(时域卷积计算方式)的仿真
- T = 10e-6 # 脉宽
- B = 25e6 # 带宽
- K = B/T # 调频斜率
- Fs = 200e6 # 采样频率
- Ts = 1/Fs
- N = int(T/Ts)
- print("脉宽内采样的周期数=", N)
- t = np.linspace(-T/2, T/2, N)
- # St = np.exp(j*np.pi*K*t**2) 用欧拉公式展开
- St = np.exp(1j * np.pi * K * t**2)
- print("成功构建了复数回波LFM信号:", type(St), St.shape, St.dtype, St[:5])
- # a.real, a.imag, a.conjugate()
- print("复数的共轭:", St.conjugate())
- # Ht = np.exp(-j*np.pi*K*t**2) 匹配滤波器 冲击响应函数
- # 欧拉公式展开 exp(jx) = cos(x) + sin(x)j
- Ht = np.exp(-1j * np.pi * K * t**2)
- # Ht = St.conjugate()
- print("构建了匹配滤波器信号(设t0=0 共轭):是否相等=", any(Ht == St.conjugate()))
- # 匹配滤波后的线性调频信号 为什么是做一维卷积操作?
- # scipy的signal模块经常用于信号处理,卷积、傅里叶变换、各种滤波、差值算法等
- # 卷积定理:时域卷积 相当于 频域相乘
- # 脉冲压缩的DSP处理方法有时域卷积或频域相乘。
- # 对于点数较多的回波信号,采用频域相乘方法可以获得较快的运算速度
- Sot = scipy.signal.convolve(St, Ht)
- # scipy.signal.convolve2d()
- # 卷积运算大致可以分成3步,首先先翻转 然后作平移 作乘积求和
- # 卷积运算可以用来做大整数的乘法(数组表示数的乘法)
- '''
- 两个一维信号卷积
- >>> import numpy as np
- >>> x=np.array([1,2,3])
- >>> h=np.array([4,5,6])
- >>> import scipy.signal
- >>> scipy.signal.convolve(x,h) #卷积运算
- array([ 4, 13, 28, 27, 18])
- '''
- # 画图
- plt.figure(figsize=(16, 12))
- plt.subplot(211)
- # 为何乘以1e6 时间的单位变了(由秒 变 U秒)
- plt.plot(t*1e6, St, linestyle='-', color='blue')
- plt.xlabel('Time [u sec]', fontsize=16)
- plt.xticks()
- # Amplitude 振幅
- plt.ylabel('Amplitude', fontsize=16)
- plt.title("线性调频信号(LFM Chirp)", fontsize=16)
- plt.subplot(212)
- # 这里为什么要2*N-1 是因为前面做了一维卷积 数组长度变长了
- t1 = np.linspace(-T, T, 2*N-1)
- t1 = t1 * B # 时间×带宽 统一扩大了B倍
- Z = np.abs(Sot) # 振幅
- Z = Z / np.max(Z) # 归一化
- # 真值与分贝值的转换 20log10() 电流 电压 幅值
- # 功率=电流×电压 只有功率是10log10()
- Z = 20 * np.log10(Z + 1e-6)
- # sinc函数也做到了 和 匹配滤波后的线性调频信号 类似的东东 不完全一样
- Z1 = np.abs(np.sinc(t1)) # sinc函数 与 Sot的对比
- # 辛克(sinc)函数
- Z1 = 20 * np.log10(Z1 + 1e-6)
- plt.plot(t1, Z, linestyle='-', color='blue', label='仿真', linewidth=1)
- # 将'o'代替'-'的示例 画点 散点图
- # plot()的markersize设为4.0,和scatter()的s设为16.0,画出的点大小相同
- plt.plot(t1, Z1, "o", markersize=4., color='red', label='sinc')
- # plt.scatter(t1, Z1, s=16., color='red', label='sinc')
- # 限定坐标轴的范围
- plt.axis([-15, 15, -50, 1])
- plt.xlabel('Time [sec] * B', fontsize=16)
- plt.ylabel('幅值是20倍,db', fontsize=16)
- plt.title("匹配滤波后的线性调频信号", fontsize=16)
- plt.legend()
- plt.show()
复制代码
|
|