对固定长度序列进行不同长度下的FFT变换的区别

  • Post author:
  • Post category:其他


在matlab中函数fft负责对信号序列进行离散傅里叶变换,Y = fft(X)表示为对输入序列X进行离散傅里叶变化,Y为变化后的频域序列。

Y = fft(X)中未对“采用几点fft”进行说明,其默认为对X进行length(X)长度的fft,输出的频域序列有length(Y) = length(X)。

但如果我们采用Y = fft(X,n),假设X为1维数组,函数中参数n即我们要对X采用的fft的点数,我们知道:当n大于length(X)时,fft变换缺少的部分会用0进行补充,当n小于length(X)时,fft变换会截取X前n个序列值作为fft变换的序列。

如果n>length(X),则length(Y)≠ length(X),n<length(X)是也是一样,但length(Y)始终等于Y = fft(X,n)中n的大小。


如果fft变换中,需要变换的序列长度与我们要进行的n点fft变换点数不同会出现什么现象?

首先我们要知道,fft变换后的频谱分辨率为Fs/n,即变换后得到的相邻频域数据之间的频率间隔为Fs/n,Fs为采样速率,即我们输入的相邻时域序列时间间隔的倒数,n为fft变换的采用点数。


下面我们用Matlab进行描述:

1.首先构造模拟函数

Fs = 1000 ;
N = 1/(1/Fs);   % 1s的采样时间
n = 0:N-1;                   
t = n/Fs;       % 时间序列   
f1 = 140;  f2 = 150 ;
A1 = 2;  A2 = 1 ;
S = A1*sin(2*pi*f1*t) + A2*sin(2*pi*f2*t) ;     %构造模拟函数
figure(1);
plot(t,S);
title('时域序列');

构造的模拟信号为 S(t) = A1sin(2πf1t)+A2sin(2πf2t)

采样频率为 1000Hz

采样时间为 1s

采样点数为 1000

构造的模拟信号为幅值分别为2、1和频率分别为140、150的正弦信号的叠加

时域序列如下图所示:

2. 进行不同点数的FFT

我们依次进行800、1000、1024、1256、2000点FFT,采用的Matlab程序如下:

figure(2);
% 800 = nfft
nfft = 800;
subplot(511);
p = fft(S,nfft);  
P = fftshift(p);
P1 = abs(P);
F = n*(Fs/nfft)-Fs/2;          
% plot(F(N/2:N-1),P1(N/2:N-1));
plot(F(1:800),P1)                %注意需要修改
axis([0 500 min(P1)-5 max(P1)+5]); 
title('NFFT = 800');

% 1000= nfft
nfft = 1000;
subplot(512);
p = fft(S,nfft);  
P = fftshift(p);
P1 = abs(P);
F = n*(Fs/nfft)-Fs/2;             %频率序列 
% plot(F(N/2:N-1),P1(N/2:N-1));
plot(F,P1(1:1000))
axis([0 500 min(P1)-5 max(P1)+5]); 
title('NFFT = 1000');

% 1024 = nfft
nfft = 1024;
subplot(513);
p = fft(S,nfft);  
P = fftshift(p);
P1 = abs(P);
F = n*(Fs/nfft)-Fs/2;           %频率序列
% plot(F(N/2:N-1),P1(N/2:N-1));
plot(F,P1(1:1000))
axis([0 500 min(P1)-5 max(P1)+5]);        
% 0 500 这里取的范围不是序列的个数范围,而是实际对应频率的范围
title('NFFT = 1024');

% 1256 = nfft
nfft = 1256;
subplot(514);
p = fft(S,nfft);  
P = fftshift(p);
P1 = abs(P);
F = n*(Fs/nfft)-Fs/2;           %频率序列 
% plot(F(N/2:N-1),P1(N/2:N-1));
plot(F,P1(1:1000))
axis([0 500 min(P1)-5 max(P1)+5]); 
title('NFFT = 1256');

% 2000 = nfft
nfft = 2000;
subplot(515);
p = fft(S,nfft);  
P = fftshift(p);
P1 = abs(P);
% F = n*(Fs/nfft)-Fs/2;           %频率序列 
F = 1:1:2000;
FF = F*(Fs/nfft)-Fs/2;
% plot(F(N/2:N-1),P1(N/2:N-1));
plot(FF,P1)
axis([0 500 min(P1)-5 max(P1)+5]); 
title('NFFT = 2000');

得到的结果如下图所示:

通过对上图结果分析可知,当输入序列一定时,fft点数增多,不会对图形形成有影响,会使频谱的分辨率提升,相当于在频域的采样点数增多。



版权声明:本文为weixin_43169476原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。