数据分析基础-FFT
信号处理 傅里叶变换 IFFT
傅里叶变换(FFT)可能是信号处理领域最为简单,应用最为广泛的信号处理工具,在matlab中fft变换也是信号处理工具箱中基本的工具函数之一,那么FFT又有哪些小技巧呢,同时fftshift函数又是什么函数,为什么ifft之前也需要ifftshift?
1.matlab fft函数分析
通过输入在命令界面输入help fft 可以查看工具箱中的fft函数介绍,如下图1所示,fft函数的基本用法就三种,第一种:普通式用法;第二种:添加了fft变换的长度,如果数据不够通过补零达到想要的长度;第三种:选择数据的纬度,进行fft。在平时工作中最为常用的就是第一种和第二种,即选择fft变换长度或者使用数据长度。

2.matlab fftshift函数
matlab函数中除了fft之外,还有一个与fft长的比较相像的函数fftshift,那么fftshift又是做什么用的呢?同样通过输入help ifft可以打开ifft的帮助文档,官网的说法是:将零频分量移到频谱中心,重新排列傅里叶变换。也就是说是将数组进行重新排列

同样通过输入help ifft可以打开ifft的帮助文档,官网的说法是:将零频分量移到频谱中心,重新排列傅里叶变换,也就是说是将数组进行重新排列,那为什么需要调用fftshift函数来获得我们比较常见的频谱图呢,我们可以做一个小实验来仿真一下fftshift的作用。
假设一个100Hz的正弦信号,在采样频率1000Hz的采样下进行fft的程序如下所示:
clc
clear all
close all
fs = 1e3
f1 = 100
t_total = 1
ts = 1/fs
tt = 0:ts:t_total-ts
data = cos(2*pi*f1.*tt)
figure
plot(tt,data)
figure
plot(abs(fft(data)))


经过FFT变换后的数据呈现左右对称的形式,与我们的预期结果一致,但是仔细分析我们就会发现问题:两根谱线的位置比较靠近两端,如果按照正常的频谱图来分析,两端的位置是频率的最大位置,也就是采样频率的一半。那么谱线在这个位置是不对的。我们按照fftshift中的说明,对于fft后的数据重新进行处理再绘制fft图。

这次与我们期待的零频在中间的结果一致!
3.FFT 频谱与频率分量的对应
在绘制完谱线得到正确的分布图后,我们需要计算下面对应的频率信息,因为预知频谱是按照零频在中间的形式,所以我们按照以下程序计算频率信息:
ff = (0:1:length(data)-1)/length(data)*fs - fs/2;
即频率从-fs/2开始到fs结束,步长为fs/length(data)。