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

        在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点数增多,不会对图形形成有影响,会使频谱的分辨率提升,相当于在频域的采样点数增多。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佩里朴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值