信號與系統基礎之卷積定理:頻域乘積相當于時域卷積,千萬不要問我什么,可以去看看教材上的公式推導。
運算效率對比分析,使用FFT快速卷積法(實線)明顯比時域卷積乘法次數要少,一般而言64點以上,FFT法就具有優勢。
FFT卷積基本過程描述:設信號x長度n,卷積系數h長度為k,則時域卷積結果長度為L=n+k-1,為了采用高效的基2型FFT算法,需要將信號和系數均在末尾補零擴展到最接近的2的N次方長度m(比如n=32,k=16,則L=32+16-1=47,最近的2的N次方為64),然后分別做m點FFT變換到頻域后再復乘,最后IFFT變回時域。
從上理論就講說這么多,更詳細的可看看相關專著書籍,接下來用matlab仿真來看看運算過程的中間環節是什么樣;
clc;
clear;
%%設定信號參數
T=10e-6; %信號長度:us
f0=3e6; %信號1:3MHz
f1=8e6; %信號2:8MHz
fs=80e6; %信號采樣率:MHz
t=-T/2:1/fs:T/2-1/fs; %時間序列
%加載fdatool設計的濾波器FIR系數
load("coef.mat");
%濾波器頻率響應
freqz(coef,1,200,fs);
%低通濾波器參數:3MHz帶寬,截止頻率4MHz,帶外抑制80dbc
信號和變量長度
信號長度800,系數長度134,則卷積結果長度為800+134-1=933,因此需要補零擴展到1024點;
%生成信號:模擬采樣過程
if_sig=cos(2*pi*f0*t)+cos(2*pi*f1*t);
%加入白噪聲SNR=30dB
if_sig=awgn(if_sig,30,'measured');
% if_sig=round(8192*if_sig); %中頻信號
plot(if_sig);title('原始信號');
plot(coef);title('濾波器系數的時域');
coef_fft = fft(coef,1024);
len=length(coef_fft);
f_x=(0:len-1)*fs/len;%頻率序列
f_x=f_x/1e6;
plot(f_x(1:len/2+1),10*log10(abs(coef_fft(1:len/2+1))));
title('濾波器系數的頻域');
xlabel('頻率/MHz');ylabel('幅度/dB');
此處留一個坑,下回繼續
sig_fft = fft(if_sig,1024);
plot(f_x,20*log10(abs(sig_fft)));
title('原始信號做1024點FFT');
xlabel('頻率/MHz');ylabel('幅度/dB');
%頻域相乘,注意此處為復數乘法
conv_fft = sig_fft.*coef_fft;
plot(f_x,20*log10(abs(conv_fft)));
title('信號和系數頻域乘積后');
xlabel('頻率/MHz');ylabel('幅度/dB');
上圖為頻域濾波后結果,可以看到8MHz的帶外信號被濾除,剩下3MHz的帶內信號;接下來就是變換回時域波形。
%IFFT變換還原到時域
fft_filter_out = ifft(conv_fft);
plot(fft_filter_out);
title('FFT卷積頻域濾波后的信號波形');
為了方便對比,下邊給出通過時域卷積方式的運算結果
%時域卷積方式濾波
conv_filter_out = conv(if_sig,coef);
plot(conv_filter_out);xlim([1,1200]);
title('時域卷積方式濾波后的信號波形');
從上面時域處理、頻域處理的結果可以看到,兩者處理后時域處理的結果和頻域處理后的前933個點的結果相同。
-
低通濾波器
+關注
關注
14文章
474瀏覽量
47455 -
FFT
+關注
關注
15文章
436瀏覽量
59425 -
信號處理器
+關注
關注
1文章
254瀏覽量
25303 -
MATLAB仿真
+關注
關注
4文章
176瀏覽量
19945 -
fir濾波器
+關注
關注
1文章
95瀏覽量
19056
發布評論請先 登錄
相關推薦
評論