mafan88的个人空间 https://blog.eetop.cn/162539 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

浅谈FFT实现

已有 482 次阅读| 2011-12-15 18:35 |个人分类:数字信号处理

【转】浅谈FFT实现

FFT(Fast Fourier Transform. )快速傅里叶变换

算法的输入示时域待处理信号,输出为频域信号

1. 频率轴

输入时域信号,输出频域信号。输出信号的自变量是频率,因变量是幅值。

假设输入时间序列长度为N(即包含N个数据点),两点间隔为Ts,也就是输入信号的采样频率为Fs,则有Ws=2*pi*Fs

频率轴则表示为:Ws*(-N/2:N/2-1)/N  

至于为什么要除以N?

我是从不定原理不(Uncertainty Principle):对于任意一个信号,时间分辨率*频率分辨率>=1/2,当且仅当信号为高斯信号时取等。此原理说明,时域分辨率和频率分辨率是相互制约的。其中一个变大,另一个则变小。

对于傅里叶变换,时域信号具有最好的时间分辨率,频域信号具有最好的频率分辨率。

时域把时间长度为t的信号分为N点,相当于时间缩小了t/Ts=N倍,则频域相当于放大了N倍。所以频率轴是除以N的。

换种理解角度,耐奎斯特采样定律说采样频率fs必须是>=2倍信号频率,信号才能理论上从频域逆变换出完整的时域信号。

2.负频率

负频率究竟有无实际物理意义,这一直是人们讨论的问题。

这个论坛上有个帖子说的蛮好http://www.chinavib.com/forum/thread-51199-1-1.html

3.对于Matlab里的fft

Matlab里有fft快速算法的实现,可惜看不到源代码。

fft()是做DFT

fft(x,N)是做N点FFT,当x的数据长度小于N是,则补零;当x的数据长度大于N,则截断。

蝶形算法 假设前提N是2的幂次,但是Maltab里的fft没有此限制,很想看到Maltab里fft函数的源代码是怎么处理的。。。()

4.放一段Matlab里实现fft的小例子

clear all;
N=2048;
t=linspace(0,20,N);
x=sin(2*pi*4*t);
figure,plot(t(1:50),x(1:50)/10000);
Ts=t(2)-t(1);
Ws=2*pi/Ts;
F=fft(x);
Fc=fftshift(F)*Ts;
W=Ws*(-N/2:(N/2)-1)/N;
figure,plot(W,abs(Fc));


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 6

    粉丝
  • 0

    好友
  • 15

    获赞
  • 6

    评论
  • 105786

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-23 15:33 , Processed in 0.019509 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部