数字信号处理实验(二) —— 利用FFT实现快速卷积

前言

由第一个实验,我们大致知道了,可以通过卷积脉冲响应的方式,得到输出,得到经过一个系统处理过后的输出。如果这个系统是数字滤波器,那么输出就是滤波后的结果

所以 这一节介绍的FFT实现快速卷积意义不小,这意味着DSP的很多应用,比如快速滤波,快速陷波,都是可以实现的。

实践

数字滤波器脉冲响应为 h ( n ) = ( 1 2 ) n R N 2 ( n ) h(n)=(\frac{1}{2})^nR_{N_2}(n) h(n)=(21)nRN2(n) N 1 = 16 , N 2 = 17 N_1=16 ,N_2=17 N1=16,N2=17,输入序列有如下几种情况,我们要设计matlab程序得到滤波后的结果(就是和滤波器脉冲响应卷积后的结果)

  • x ( n ) = R N 1 ( n ) x(n)=R_{N_1}(n) x(n)=RN1(n)
  • x ( n ) = c o s ( 2 π N 1 n ) R N 1 ( n ) x(n)=cos(\frac{2\pi}{N_1}n)R_{N_1}(n) x(n)=cos(N12πn)RN1(n)
  • x ( n ) = ( 1 3 ) n R N 1 ( n ) x(n)=(\frac{1}{3})^nR_{N_1}(n) x(n)=(31)nRN1(n)

第一题

x ( n ) = R N 1 ( n ) , N 1 = 16 x(n)=R_{N_1}(n) , N1=16 x(n)=RN1(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实现快速卷积_第1张图片
第一第二个分别就是源信号以及脉冲响应,后两个的对比,我们可以发现利用FFT进行的卷积和之前直接卷积的效果几乎相同
数字信号处理实验(二) —— 利用FFT实现快速卷积_第2张图片

第二题

% 修改序列长度 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]);

数字信号处理实验(二) —— 利用FFT实现快速卷积_第3张图片
数字信号处理实验(二) —— 利用FFT实现快速卷积_第4张图片

第三题

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


数字信号处理实验(二) —— 利用FFT实现快速卷积_第5张图片
数字信号处理实验(二) —— 利用FFT实现快速卷积_第6张图片

你可能感兴趣的:(DSP,卷积,数据结构,matlab)