數字信號處理實驗(二) —— 利用FFT實現快速卷積

前言

由第一個實驗,我們大致知道了,可以通過卷積脈衝響應的方式,得到輸出,得到經過一個系統處理過後的輸出。如果這個系統是數字濾波器,那麼輸出就是濾波後的結果

所以 這一節介紹的FFT實現快速卷積意義不小,這意味着DSP的很多應用,比如快速濾波,快速陷波,都是可以實現的。

實踐

數字濾波器脈衝響應爲h(n)=(12)nRN2(n)h(n)=(\frac{1}{2})^nR_{N_2}(n)N1=16,N2=17N_1=16 ,N_2=17,輸入序列有如下幾種情況,我們要設計matlab程序得到濾波後的結果(就是和濾波器脈衝響應卷積後的結果)

  • x(n)=RN1(n)x(n)=R_{N_1}(n)
  • x(n)=cos(2πN1n)RN1(n)x(n)=cos(\frac{2\pi}{N_1}n)R_{N_1}(n)
  • x(n)=(13)nRN1(n)x(n)=(\frac{1}{3})^nR_{N_1}(n)

第一題

x(n)=RN1(n),N1=16x(n)=R_{N_1}(n) , N1=16

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]);


在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章