前言
由第一個實驗,我們大致知道了,可以通過卷積脈衝響應的方式,得到輸出,得到經過一個系統處理過後的輸出。如果這個系統是數字濾波器,那麼輸出就是濾波後的結果
所以 這一節介紹的FFT實現快速卷積意義不小,這意味着DSP的很多應用,比如快速濾波,快速陷波,都是可以實現的。
實踐
數字濾波器脈衝響應爲,,輸入序列有如下幾種情況,我們要設計matlab程序得到濾波後的結果(就是和濾波器脈衝響應卷積後的結果)
第一題
n=[0:1:16];
m=[0:1:17];
N1=length(n);
N2=length(m);
%輸入Xn Hn
Xn=ones(1,N1);
Hn=0.5.^m.*ones(1,N2);
%修剪序列長度
N=N1+N2-1;
XK=fft(Xn,N);
HK=fft(Hn,N);
YK=XK.*HK;
Yn=ifft(YK,N);
if all(imag(Xn)==0)&(all(imag(Hn)==0))
Yn=real(Yn);
end
%修剪橫座標序列長度
y=0:N-1;
h=0:N2-1;
x=0:N1-1;
subplot(1,4,1);
stem(x,Xn,'r*');
title({ '$$ Xn = R_{N1}(n) $$' },'Interpreter','latex');
axis([0,length(x),0,1.1]);
subplot(1,4,2);
stem(h,Hn,'r*');
title({ '$$ Hn $$' },'Interpreter','latex');
axis([0,length(h),0,1.1]);
subplot(1,4,3);
stem(y,Yn,'r*');
title({ '$$ Yn $$' },'Interpreter','latex');
axis([0,length(y),0,2.1]);
subplot(1,4,4);
Yline=conv(Xn,Hn);
stem(y,Yline,'r*');
title({ '$$ Xn*Hn $$' },'Interpreter','latex');
axis([0,length(y),0,2.1]);
第一第二個分別就是源信號以及脈衝響應,後兩個的對比,我們可以發現利用FFT進行的卷積和之前直接卷積的效果幾乎相同
第二題
% 修改序列長度 N1=16 N2=17
n=[0:1:16];
m=[0:1:17];
N1=length(n);
N2=length(m);
% Xn Hn表達
Xn=cos(2*pi*n/N1);
Hn=0.5.^m.*ones(1,N2);
%修剪序列長度
N=N1+N2-1;
XK=fft(Xn,N);
HK=fft(Hn,N);
YK=XK.*HK;
Yn=ifft(YK,N);
%實序列的循環卷積 = 實序列
if all(imag(Xn)==0)&(all(imag(Hn)==0))
Yn=real(Yn);
end
%修剪橫座標序列長度
y=0:N-1;
h=0:N2-1;
x=0:N1-1;
subplot(1,4,1);
stem(x,Xn,'r*');
title({ '$$ Xn = cos(\frac{2\pi}{N1}n) R_{N1}(n) $$' },'Interpreter','latex');
axis([0,length(x),-1.1,1.1]);
subplot(1,4,2);
stem(h,Hn,'r*');
title({ '$$ Hn $$' },'Interpreter','latex');
axis([0,length(y),0,1.1]);
subplot(1,4,3);
stem(y,Yn,'r*');
title({ '$$ Yn $$' },'Interpreter','latex');
axis([0,length(h),-2.1,2.1]);
subplot(1,4,4);
Yline=conv(Xn,Hn);
stem(y,Yline,'r*');
title({ '$$ Xn*Hn $$' },'Interpreter','latex');
axis([0,length(h),-2.1,2.1]);
第三題
clear all;
n=[0:1:16];
m=[0:1:17];
N1=length(n);
N2=length(m);
%生成Xn Hn
Xn=(1/3).^n;
Hn=0.5.^m.*ones(1,N2);
%修剪序列長度
N=N1+N2-1;
XK=fft(Xn,N);
HK=fft(Hn,N);
YK=XK.*HK;
Yn=ifft(YK,N);
%實序列的循環卷積 = 實序列
if all(imag(Xn)==0)&(all(imag(Hn)==0))
Yn=real(Yn);
end
y=0:N-1;
h=0:N2-1;
x=0:N1-1;
subplot(1,4,1);
stem(x,Xn,'r*');
title({ '$$ Xn = (\frac{1}{3})^n R_{N1}(n) $$' },'Interpreter','latex');
axis([0,length(x),0,1.1]);
subplot(1,4,2);
stem(h,Hn,'r*');
title({ '$$ Hn $$' },'Interpreter','latex');
axis([0,length(y),0,1.1]);
subplot(1,4,3);
stem(y,Yn,'r*');
title({ '$$ Yn $$' },'Interpreter','latex');
axis([0,length(h),0,1.1]);
subplot(1,4,4);
Yline=conv(Xn,Hn);
stem(y,Yline,'r*');
title({ '$$ Xn*Hn $$' },'Interpreter','latex');
axis([0,length(h),0,1.1]);