声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2058|回复: 10

[FFT] FFT出现频率畸变 求解释

[复制链接]
发表于 2013-10-16 20:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我取得采样时间是10ms,1000个数据,补零到100000做FFT,得到频率为184Hz(真实值是189Hz)
求解释,这是怎么情况,这就是传说中的频率畸变(由于频率分辨率导致的)?

Fs=100000;
Nt=1000;  
N=100000;
t=(0:Nt-1)/Fs;
x=sin(2*pi*189*t);
tic;
y=2*abs(fft(x,N))/Nt;
f=(0:N/2-1)/N*Fs;
toc;
figure;
plot(f,y(1:end/2),'*');
axis([0 500 0 1.5]);



点评

反对: 4.0
为什么补零?增加频率分辨率不是通过补零实现吧?个人认为补零纯粹是为了增加窗内数据的数量,这是FFT算法的要求:数据的长度需要是2的幂指数倍。那么,你窗函数的长度是100000?  发表于 2013-10-19 19:33
畸变?以什么确定是畸变?补零和不补零前后做出来结果的比较?  发表于 2013-10-19 19:30
反对: 4
不太了解这个内容,补零太多了吧!这个问题有专门讨论:补零只是能够数字上增加频率分辨率,并不能从理论上解决这个问题。另外补零是为了窗函数里的数据不够,但是FFT算法需要一定长度的数据。  发表于 2013-10-17 09:17
回复
分享到:

使用道具 举报

 楼主| 发表于 2013-10-19 20:07 | 显示全部楼层
我说详细一点吧



补零的基本目标是,希望能够知道Fs/N意外频率点上的频谱值。

对离散傅里叶比较了解的人,就会知道补零相当于:如果频率分辨率是10,那么直接用FFT只能得到10,20,30Hz上的频谱值,补零可以任何频率对应的频谱值。

你说的补零只是FFT内部算法的需求,跟我这个补零无关。
发表于 2013-10-19 20:18 | 显示全部楼层
发表于 2013-10-19 20:24 | 显示全部楼层
本帖最后由 yghit08 于 2013-10-19 20:45 编辑

如果补零能达到理论上无限程度的频域分辨率,那么你让那些做系统数据延拓、做模型的人干啥去!
这样做只是异想天开。1000个原始数据点竟然通过加9900个零增加所谓的数据点数达到分辨率的提高,这种做法本身就是错误的。有这时间还不如用AR模型、SVM等算法做模型预测做数据预测补充有用的数据,至少还利用了原始那1000个数据点,还利用了原始系统的信息。
 楼主| 发表于 2013-10-19 20:45 | 显示全部楼层
yghit08 发表于 2013-10-19 20:24
如果补零能达到理论上无限程度的频域分辨率,那么你让那些做系统数据延拓、做模型的人干啥去!
这样做只是 ...

我什么时候说过,补零能够提高分辨率了?补零怎么可能提高分辨率??这点常识就不要拿出来说事了。

我说的只是,在现有的数据下,补零相当于求更多频率点的频谱值而已,又没说这些频谱值就是真值。

点评

赞成: 4.5
赞成: 5
  发表于 2013-11-14 12:33
赞成: 4
那到这我也没啥说的了,其实就是频率分辨率的问题:更多频点上值,这里就是频率分辨率的问题。不补零可达到的视觉上的分辨率小(频点少),补零使得视觉上频率分辨率提高(频点多)  发表于 2013-10-19 20:50
 楼主| 发表于 2013-10-19 20:48 | 显示全部楼层
yghit08 发表于 2013-10-19 20:24
如果补零能达到理论上无限程度的频域分辨率,那么你让那些做系统数据延拓、做模型的人干啥去!
这样做只是 ...

你自己仿真过没有啊,你自己说的“即使几乎是没有完成一个周期,FFT分析的结果亦会是非常好的189Hz。”麻烦您自己亲手试一下下,就知道不是189Hz了。

谢谢你给我发的帖子,我看了,解决不了我的问题。
 楼主| 发表于 2013-10-19 20:52 | 显示全部楼层
sunyuxinhe 发表于 2013-10-19 20:48
你自己仿真过没有啊,你自己说的“即使几乎是没有完成一个周期,FFT分析的结果亦会是非常好的189Hz。”麻 ...

你直接复制一下吧:
该信号还不只包含一个周期,包含了1.88个周期
Fs=100000;
Nt=1000;  
t=(0:Nt-1)/Fs;
x=sin(2*pi*189*t);
tic;
y=2*abs(fft(x))/Nt;
f=(0:Nt/2-1)/Nt*Fs;
toc;
figure;
plot(f,y(1:end/2),'*');
发表于 2013-10-19 20:54 | 显示全部楼层
sunyuxinhe 发表于 2013-10-19 20:52
你直接复制一下吧:
该信号还不只包含一个周期,包含了1.88个周期
Fs=100000;

做了,确实没能到189Hz,所以我修改了我的回复。那么事实上通过补零对你的目标也是没有用处的。
 楼主| 发表于 2013-10-19 20:55 | 显示全部楼层
sunyuxinhe 发表于 2013-10-19 20:45
我什么时候说过,补零能够提高分辨率了?补零怎么可能提高分辨率??这点常识就不要拿出来说事了。

我 ...

最后请教你一个问题,如果数据量比较少,包含所测信号1-2周期,请问怎么才能准确测出该频率。直接FFT肯定不行的,因为频率分辨率低。这个问题也就是等同于我给你发的代码。
 楼主| 发表于 2013-10-19 20:56 | 显示全部楼层
yghit08 发表于 2013-10-19 20:54
做了,确实没能到189Hz,所以我修改了我的回复。那么事实上通过补零对你的目标也是没有用处的。

这正是我的问题呀,请提供建议

点评

不知道背景只能瞎说:瞬时频率;降低采样频率重做实验(馊主意);数据预测(简单算例结果好,复杂系统不保证结果)  发表于 2013-10-19 20:58
 楼主| 发表于 2013-10-19 21:03 | 显示全部楼层
sunyuxinhe 发表于 2013-10-19 20:56
这正是我的问题呀,请提供建议

谢谢你提供的建议, 有些话不方便说。我很高兴你觉得我的问题很幼稚,因为我很高兴看到它可以被解决。

点评

讽刺?好吧,我认了。 单纯想从fft做出来189Hz的话,加窗函数可能能解决,不过可能需要自己设计一个窗函数(愚见)。欢迎有解决方案后回来分享  发表于 2013-10-19 21:21
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-4-29 05:55 , Processed in 0.084333 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表