📄 dft.m
字号:
%DFT的MATLAB实现
%xn: input length_limited sequence
%N: length of sequence
%XK: DFT coefficients for xn
function[XK]=dft(xn,N)
n=[0:N-1]
k=[0:N-1]
wnk=exp(-j*2*pi/N).^(n’*k);
XK=xn*wnk
%在序列两点之间插入r-1个零
n=[0:1:19];
xn=exp(-0.4*n);
gn=[xn,zeros(1,20)];
N=length(n);
fn=zeros(1,2*N);
for i=1:length(n)
fn(2*i-1)=xn(i);
end
m=N+20;
Xk=fft(xn,20);
Gk=fft(gn,40);
Fk=fft(fn,40);
subplot(3,1,1);
stem(n,abs(Xk));
axis([0,40,0,4]);
subplot(3,1,2);
stem(m,abs(Gk));
subplot(3,1,3);
stem(m,abs(Fk));
%fftseq的源程序
function [M,m,df]=fftseq(m,ts,df)
% fftseq 产生序列m的快速傅立叶变换M
% 序列m用0填充以满足所需要的的频率分辨率df
% ts是采样间隔,输出df是最终的频率分辨率
% 输出m是输入m填充0后的值
fs=1/ts;
if nargin==2
n1=0;
else
n1=fs/df;
end
n2=length(m);
n=2^(max(nextpow2(n1),nextpow2(n2)));
M=fft(m,n);
m=[m,zeros(1,n-n2)];
df=fs/n;
%x(t)=2sin(4πt)+5cos(8πt),求N点DFT的幅度谱和相位谱。
N=64;
n=0:63;
t=0.01*n;
q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
%生成信号序列
y=fft(x,N);
subplot(3,1,1);
plot(t,x);
title('source signal');
%绘制源曲线信号
subplot(3,1,2);
plot(q,abs(y)); %幅度普
title('magnitude');
subplot(3,1,3);
plot(q,angle(y)); %相位谱
title('phase');
%比较原序列与经过FFT和IFFT变换后的序列
t=(0:1/255:1);
x=sin(2*pi*120*t);
y=real(ifft(fft(x)));
subplot(2,1,1)
plot(t,x);
title('o signal');
subplot(2,1,2);
plot(t,y);
title('r signal');
%频谱泄漏现象及改善
n=[0:1:99];
xn=cos(3*pi/59*n);
Xk=fft(xn);
kx=[0:1:length(Xk)-1];
subplot(2,1,1);
stem(n,xn);
subplot(2,1,2);
stem(kx,abs(Xk));
m=[0:1:149];
yn=cos(3*pi/59*m);
Yk=fft(yn);
ky=[0:1:length(Yk)-1];
subplot(2,1,2);
subplot(2,1,2);
stem(ky,abs(Yk));
title('n=150')
wn=kaiser(length(xn),5.658);
hn=xn.*wn';
Hk=fft(hn);
kh=[0:1:length(Hk)-1];
subplot(2,2,4);
stem(kh,abs(Hk));
title('kaiser window');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -