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點補零DFTa = 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()