浅谈Matlab中的快速傅里叶变换(fft)

  一直以来,笔者对Matlab程序关于快速傅里叶变换的定义不甚了解,只是大致明白利用该公式可以方便快速地实现数据在时域(时间域)和频域(频率域)之间的转换,但是对其中变换核的离散形式为什么这么定义却摸不着头脑。直到前一阵子笔者才弄明白(其实也不是很复杂的问题,只是一直没有深究下去......),现在和读者朋友们分享一下其中的意义。

首先看一下Matlab中关于fft是怎么定义的。下面是笔者电脑中安装的Matlab2014a中说明文档给出的定义。

浅谈Matlab中的快速傅里叶变换(fft)_第1张图片

       由于傅里叶正变换和逆变换形式上只差一个负号,这里仅对傅里叶变换做说明。定义中给出了Matlab对长度为N的向量x(j)做傅里叶变换的计算公式的离散形式。为简便起见,规定k和j的下标都从0开始,则傅里叶变换公式重新表示如下

浅谈Matlab中的快速傅里叶变换(fft)_第2张图片

而离散傅里叶变换的一般形式如下

浅谈Matlab中的快速傅里叶变换(fft)_第3张图片

比较发现,Matlab计算fft采用的变换核内的频率是归一化的(f=k/N)。

X(N-k)表示为



频率分量k和N-k=-k分别为x(j)的正负频率值,即当N为奇数时,k=1,2,3,...,(N-1)/2和N-k=N-1,N-2,N-3,...,(N+1)/2分别互为负频率值(当N为偶数时,Matlab规定正频率值和负频率值分别为1,2,3,...,N/2-1和N-1,N-2,N-3,...,N/2)。因此频率序列[0:N]按负频率到正频率顺序可排列为[-N/2:N/2-1],该功能可通过fftshift函数实现。

接下来说明当序列x(j)经fft变换到X(k)时,横坐标的具体物理量是多少。我们已经知道一个时间序列x(t)经过傅里叶变换后得到的X(f)表示其在频率域内不同频率对应的赋值,即该时间序列包含了多少个正弦信号,以及相应的频率是多少。那么Matlab中经过fft后得到的X(k)的下标k应该也是表示在频率域中对应的频率值,但是具体数值该怎么计算呢?从前面的分析我们已经发现,Matlab中计算fft采用的变换核内的频率是经过归一化了的,也就是说,频率的具体值应该由序列x(j)的采样率fs决定,即实际频率值可由下式计算


假设采样率fs=1000Hz,序列长度N=1000,则频率序列为[0,1,2,...,998,999]→[-500,-499,-498,...,-2,-1,0,1,2,...498,499],单位是Hz。为什么采样率是1000Hz的序列经过傅里叶变换后实际频率绝对值只计算到500Hz呢?学习过信号知识的读者应该知道奈奎斯特采样定理,该定理指出若需要完整精确地复原某个信号,则采样频率至少要达到该信号最大频率的两倍,换句话说,若用某一采样频率去对信号进行采样,则最多只能准确计算出频率最大到采样频率的一半的信号部分。因此Matlab规定序列X(k)的最大频率值为采样率的一半,这完全是符合奈奎斯特采样定理的要求的。

你可能感兴趣的:(Matlab)