Python实现《合成孔径雷达成像——算法与实现》图3.13。
import matplotlib.pyplot as plt
import numpy as np
import math
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#信号持续时间T=7.24us,信号带宽B=5.8MHz,将过采样率设为5是为了更清晰地观测信号波形
T = 10e-6 # 脉冲持续时间
B = 15e6 # 脉冲带宽
K = B/T # 调频率
ratio = 5 # 过采样率
Fs = ratio*B # 采样频率
dt = 1/Fs # 采样间隔
N = math.ceil(T/dt) # 采样点数
t = np.arange((0-N/2)/N*T,(N-N/2)/N*T,dt) # 时间轴
st0 = np.exp(1j*math.pi*K*np.multiply(t-T/5, t-T/5)) # 生成基本信号
space1 = np.zeros(round(N/5)) # 生成空信号
space2 = np.zeros(N) # 生成空信号
st = [space1,st0,space2,st0,space2,st0,space1] #实际信号
st = [y for x in st for y in x]
N1 =len(st)
f = np.linspace((0-N1/2)/N1*Fs,(N1-N1/2)/N1*Fs,N1) # 频率轴
space = np.zeros(N1-len(st0))
Sf = np.fft.fftshift(np.fft.fft(st)) # FFT
a = np.conj(np.flip(st0))
b = space
e = [a,b]#补0
e = [y for x in e for y in x]
Hf1 = np.fft.fftshift(np.fft.fft(e)) # 方式1的匹配滤波器:时间反褶后取复共轭,计算N点补零DFT
a = st0
b = space
e = [a,b]#补0
e = [y for x in e for y in x]
Hf2 = np.fft.fftshift(np.conj(np.fft.fft(e))) # 方式2的匹配滤波器:补零后计算DFT,对结果取复共轭
Hf3 = np.exp(1j*math.pi*np.multiply(f,f)/K) # 方式3频域匹配滤波器
Out1 = np.fft.ifft(np.fft.ifftshift(Sf*Hf1))
Out2 = np.fft.ifft(np.fft.ifftshift(Sf*Hf2))
Out3 = np.fft.ifft(np.fft.ifftshift(Sf*Hf3))
plt.figure(1)
plt.subplot(4,1,1)
plt.plot(np.real(st))
plt.axis('tight')
plt.title('(a)输入阵列信号的实部')
plt.ylabel('幅度')
plt.subplot(4,1,2)
plt.plot(np.abs(Out1))
plt.axis('tight')
plt.title('(b)方式1的匹配滤波输出')
plt.ylabel('幅度')
plt.subplot(4,1,3)
plt.plot(np.abs(Out2))
plt.axis('tight')
plt.title('(c)方式2的匹配滤波输出')
plt.ylabel('幅度')
plt.subplot(4,1,4)
plt.plot(np.abs(Out3))
plt.axis('tight')
plt.title('(d)方式3的匹配滤波输出')
plt.xlabel('时间(采样点)')
plt.ylabel('幅度')
plt.show()