以FFT计算线性卷积

clear;clc;

xn = sin(0.4*[1:15]);
hn = 0.9.^(1:20);
%%
%线性卷积
yn = conv(xn,hn);

figure(1);
subplot(3,1,1);
stem(1:15,xn);
title('x(n)');
subplot(3,1,2);
stem(1:20,hn);
title('h(n)');
subplot(3,1,3);
stem(2:35,yn);
%%
%循环卷积定理:有限长序列x(n),h(n)做循环卷积的DFT结果等于x(n),h(n)分别做DFT后,相乘。
%圆周卷积和线性卷积的关系:当圆周卷积的点数L大于线性卷积结果长度时,圆周卷积的结果就是线性卷积补0的结果
%举例:x(n)长度是m,h(n)长度是n,其卷积结果y(n) = x(n)*h(n),y(n)长度为m+n-1,
%当我们做L点圆周卷积,且L %一致,余下位补0.
%也就是说,针对线性卷积速度过慢的问题,通过综合使用 循环卷积定理以及循环卷积和线性卷积的关系,
%就可以快速计算线性卷积的结果。
%对x(n)做FFT,对h(n)做FFT,二者结果相乘,由循环卷积定理知,等于x(n)和h(n)循环卷积结果的FFT,对此结果再做IFFT
%所得即是x(n),h(n)做圆周卷积的结果,再由圆周卷积和线性卷积的关系,很容易就可以知道,在恰当选取FFT点数的情况下
%所得圆周卷积结果即为线性卷积的结果,从而减少了计算机的运算量。
%循环卷积
L=pow2(nextpow2(15+20-1));
Xk = fft(xn,L);
Hk = fft(hn,L);
Yk = Xk.*Hk;
yn = ifft(Yk);
figure(2);
subplot(3,1,1);
stem(1:15,xn);
title('x(n)');
subplot(3,1,2);
stem(1:20,hn);
title('h(n)');
subplot(3,1,3);
stem(yn);

以FFT计算线性卷积_第1张图片
以FFT计算线性卷积_第2张图片

 

以FFT计算线性卷积_第3张图片

 

 

你可能感兴趣的:(以FFT计算线性卷积)