数据分析基础-FFT

415 阅读3分钟

数据分析基础-FFT


信号处理 傅里叶变换 IFFT


  傅里叶变换(FFT)可能是信号处理领域最为简单,应用最为广泛的信号处理工具,在matlab中fft变换也是信号处理工具箱中基本的工具函数之一,那么FFT又有哪些小技巧呢,同时fftshift函数又是什么函数,为什么ifft之前也需要ifftshift?

1.matlab fft函数
2.matlab fftshift函数
3.FFT 频谱与频率分量的对应

1.matlab fft函数分析
  通过输入在命令界面输入help fft 可以查看工具箱中的fft函数介绍,如下图1所示,fft函数的基本用法就三种,第一种:普通式用法;第二种:添加了fft变换的长度,如果数据不够通过补零达到想要的长度;第三种:选择数据的纬度,进行fft。在平时工作中最为常用的就是第一种和第二种,即选择fft变换长度或者使用数据长度。

image-2.png


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

image-3.png

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

fs = 1e3; % 采样频率1000Hz
f1 = 100; % 信号频率100Hz

t_total = 1; % 信号长度1s
ts = 1/fs;
tt = 0:ts:t_total-ts;

data = cos(2*pi*f1.*tt);

figure
plot(tt,data);ylim([-1.5 1.5]);title('时域数据');xlabel('时间/s'); grid on

figure
plot(abs(fft(data)));

FFT结果图.jpg

时域图.jpg

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

FFT结果图1.jpg

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