matlab中值得注意的FFT知识点

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:53   1101   0

整理一下需要注意的FFT知识点,主要来源:https://blog.csdn.net/czyt1988/article/details/84995295

FFT公式

Y = fft(signal,N)

其中signal为时域信号,N为FFT长度。当N大于signal长度,则要补零到N个点,当N小于signal长度,就截取前N个点。注意,N一般设置为2的幂次方,以便改善FFT性能。可采用nextpow2函数求N的值

N = 2^nextpow2(length(signal));

FFT的结果Y是一个N个值的复数,满足以下规律:

  • 第0和N/2的两个值虚数部分为0,是对称的直流分量。
  • 下标为i和N-i的两个复数是共轭的,所以有用的信息储存在0到N/2+1个值中。

频谱分辨率

\Delta f=\frac{fs}{N}

其中fs是采样率,N是FFT点数。N个点中每个点的分辨率均为\Delta f。则N个点对应的频段向量fre=(1:N)*\Delta f

直流分量

直流信号代表与基准0的偏移量。

FFT后的复数模-幅度

  • 第一个点(i=0)和最后一个点的模(i=N/2)除以N
  • 其余点的模除以N/2

原因

这是因为傅里叶级数对应时域幅值,其中已经包含了1/N项,而fourier变换中没有该系数, 所以,进行完FFT变换后需除以N/2才能与时域对应上。(这里还不是很清楚)

F(n)= \sum_{i=0}^{N-1}{x_ie^{ \frac{-2\pi j}{N}ni}}

全世界绝大部分的FFT算法计算出来后都需要进行幅度的转换的,为何要这样设计,因为傅里叶变换在很多场合是不需要求幅度的,而只需要分贝就可以,因此,如果傅里叶变换做了乘以2除以n的处理反而在许多场合是多余的,就像求距离,好多情况只需要x^2 + y ^2就可以了,并不需要\sqrt{ {x^2} + {y^2}}
幅值根据需求有不同需求,具体见下节

幅度谱,幅值谱?Magnitude,Amplitude?

  • 幅值 Amplitude
    幅值就是对于波形的幅值来说的,上面一节说的转换就是把fft计算的结果转化为幅值,英文叫Amplitude
    在工程中还经常看到分贝纵坐标的频谱,带分贝的频谱,使用分贝数的好处是,用较小的坐标可以描述很宽的范围。工程上会取20log(Amplitude)转变为分贝。
    幅值第n(其中n!=1)点处的fft计算的结果是复数a+bi,模值A=sqrt(a2+b2),那么实际信号的幅值是2*A/N;
    当n=0时(0Hz),也就是第一个点就是直流分量,它的模值就是直流分量的N倍,实际信号的幅值是A/N,注意N是采样点而不是进行FFT的点数

  • 幅度 Magnitude
    若对fft的结果不做任何处理,直接取模,那么这个值叫幅度,英文上叫Magnitude,

于是对fft计算的复数结果,其实数和虚数对应如下:

名称计算公式
幅度(Magnitude)\sqrt{Re^2+Im^2}
幅值(Amplitude)i=(0,\frac{n}{2}) ,A=\frac{\sqrt{Re^2+Im^2}}{n};otherwise, A=\frac{2\sqrt{Re^2+Im^2}}{n}
dB20log(Amplitude)

根据这个表,就可以很明白FFT之后需要进行什么样的处理了。

其实还有:

  • 截断加窗问题

  • 加窗频谱幅值修正问题

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP