1.已知一个有限长度为N的序列直接计算其离散傅立叶变换,并画出图形;
2.比较添零和增加取样点,对频谱的影响。
添零
补零使原来的X(k)起到做插值的作用,克服栅栏效应,使谱外观得到平滑。末尾补零,DFT处理的点数大于实际抽样的点数,这样使原来看不见的频谱线能被看到;在做DFT的时候人们常常在有效数据后面补一些零来达到频谱改善的效果,但是这并不会提高频率分辨率,因为补零不会增加有效数据!由于对数据截断后引起频谱泄露,有可能在频谱中出现一些难以确认的波峰,补零后消除这种现象。
3.将上面程序编成子函数的形式,思考如何采用计算DFT的子程序计算IDFT;
4.利用DFT子程序实现计算任意两个序列的卷积结果。
图1 原始信号与添零后的幅值谱、相位谱
图2 原始信号与增加取样点后的幅值谱、相位谱
图3 增加一倍频率分辨率后的幅值谱和相位谱
图4 利用IDFT后得到的还原波形
代码如下:
(1)dft子程序
%对应不同间隔和采样点的dft代码
% function [xk]=dft(xn,N)
% n=0:1:N-1;
% k=0:1:N-1;
% Wn=exp(2*pi*-1j/N).^(n'*k);
% [xk]=xn*Wn;
% end%原始与补零对应的dft
function [xk]=dft(xn,N)
n=0:0.1:N-0.1;
k=0:0.1:N-0.1;
Wn=exp(2*pi*-1j/N).^(n'*k);
[xk]=xn*Wn;
end%增加取样点对应的dft
% function [xk]=dft(xn,N)
% n=0:0.5:N-0.5;
% k=0:0.5:N-0.5;
% Wn=exp(2*pi*-1j/N).^(n'*k);
% [xk]=xn*Wn;
% end%增加取样点对应的dft
(2)idft子程序
% function [xn]=idft(xk,N)
% %IDFT
% %生成矩阵Wn
% n=0:0.5:2*N-0.5;
% k=0:0.5:2*N-0.5;
% Wn=exp(2*pi/N*sqrt(-1)*n'*k);
% %生成xn
% xn=xk*Wn*1/N;
function [xn]=idft(Xk,N)
n=0:1:N-1;
k=0:1:N-1;
Wn=exp(2*pi*j/N).^(n'*k);
[xn]=Xk*Wn/N;
end
(3)卷积子程序
function [yn]=juanji(x,h)
Lx=length(x);
M=length(h);
N=Lx+M-1;%求得最少卷积点数
x=[x,zeros(1,N-length(x))]; %将长度补至N点
h=[h,zeros(1,N-length(h))]; %将长度补至N点
Hk=dft(h,N);
Xk=dft(x,N);
YK=Hk.*Xk %将变换后的序列按序号相乘
yn=idft(YK,N) %求逆变换得到卷积结果
end
(4)测试代码1:
在如下代码中,取消相关注释并且与dft相对应,即可得到相应波形和幅值谱,相位谱。
% % 生成时间序列
% N=50;
% n=0:1:N-1;
% m=0:1:2*N-1;
% xn1=0.5*n.^2;%原始
% xn2=[xn1,zeros(1,N)];%补零
% xk1=dft(xn1,N);
% xk2=dft(xn2,2*N);
% %画图
% figure;
% subplot(2,3,1);stem(n,xn1),title('原始波形');xlabel('n');ylabel('幅度');
% subplot(2,3,2);stem(n,abs(xk1)),title('幅值谱');xlabel('n');ylabel('幅度');
% subplot(2,3,3);stem(n,angle(xk1)),title('相位谱');xlabel('n');ylabel('相位');
% subplot(2,3,4);stem(m,xn2),title('添零后波形');xlabel('n');ylabel('幅度');
% subplot(2,3,5);stem(m,abs(xk2)),title('添零后幅值谱');xlabel('n');ylabel('幅度');
% subplot(2,3,6);stem(m,angle(xk2)),title('添零后相位谱');xlabel('n');ylabel('相位');
N=50;
n=0:0.1:N-0.1;
xn3=0.5*n.^2;
xk3=dft(xn3,N);%增加取样点
%画图
figure;
subplot(1,3,1);stem(n,xn3),title('原始波形');xlabel('n');ylabel('幅度');
subplot(1,3,2);stem(n,abs(xk3)),title('增加取样点后幅值谱');xlabel('n');ylabel('幅度');
subplot(1,3,3);stem(n,angle(xk3)),title('增加取样点后相位谱');xlabel('n');ylabel('相位');
%
% N=50;
% n=0:0.5:N-0.5;
% xn3=0.5*n.^2;
% xk3=dft(xn3,N);%频率分辨率增加一倍
% %画图
% figure;
% subplot(1,3,1);stem(n,xn3),title('原始波形');xlabel('n');ylabel('幅度');
% subplot(1,3,2);stem(n,abs(xk3)),title('增加一倍频率分辨率后幅值谱');xlabel('n');ylabel('幅度');
% subplot(1,3,3);stem(n,angle(xk3)),title('增加一倍频率分辨率后相位谱');xlabel('n');ylabel('相位');
(5)测试代码2:
如下程序可以得到利用IDFT后得到的还原波形和得到的卷积结果。
N=50;
n=0:N-1;
k=0:N-1;
xn=0.5*n.^2;
Xk=dft(xn,N);
xn1=idft(Xk,N);%查看还原波形
xn2=cos(2*pi*n)+cos(3*pi*n);
y=juanji(xn,xn2)%进行卷积计算
figure();
subplot(4,1,1),stem(n,xn),title('采样波形');xlabel('n');ylabel('幅度');
subplot(4,1,2),stem(k,abs(Xk)),title('幅值谱');xlabel('n');ylabel('幅度');
subplot(4,1,3),stem(k,angle(Xk)),title('相位谱');xlabel('n');ylabel('相位');
subplot(4,1,4),stem(n,abs(xn1)),title('还原波形');xlabel('n');ylabel('幅度');