FFT
参考链接
- 为什么要进行傅立叶变换
- Python科学计算——复杂信号FFT
STFT可以简单的理解为窗形式的FFT - PYTHON SCIPY 计算短时傅里叶变换(SHORT-TIME FOURIER TRANSFORMS)
- 短时傅里叶变换原理解
- Short Time Fourier Transform using Python and Numpy
- 1.4. Short-Time Fourier Transformation
- 公开课讲解STFT
- 频谱幅度值与原始信号幅度值之间的关系
- 直观解释FFT的变化过程以及fftshift:How to Interpret FFT results – complex DFT, frequency bins and FFTShift
以下两blog是验证傅里叶变换对频谱的分析作用
TIMIT原始数据未必是wav格式的文件,可能需要转换一下
暂时不理解的
为什么 FFT变换后幅值与时域幅值 不相等 为什么要除N/2???
未抽出时间来看的链接
- Understanding the FFT Algorithm
- Understanding the FFT Algorithm jupyter notebook版
- Fast Fourier Transform Example
- Digital Signal Processing 在线书籍
- 我所理解的快速傅里叶变换(FFT):提到了几种窗函数的图
- Understanding The Discrete Fourier Transform
- FFT详解:赞比较多
- matlab fft example
FFT重要概念以及知识点
傅立叶原理:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。
根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、 振幅和相位。
和傅立叶变换算法对应的是反傅立叶变换算法,该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。
四种傅里叶变换形式 :
- 非周期性连续信号 傅立叶变换(Fourier Transform)
- 周期性连续信号 傅立叶级数(Fourier Series)
- 非周期性离散信号 离散时域傅立叶变换(Discrete Time Fourier Transform)
- 周期性离散信号 离散傅立叶变换(Discrete Fourier Transform)
在计算机中处理的是离散傅里叶变换,其他类型的更多的是在数学上推算。这里所说的傅里叶变换是数学意义上的变换,但跟函数变换是不同的,函数变换是符合一一映射准则的,对于离散数字信号处理(DSP),有许多的变换:傅立叶变换、拉普拉斯变换、Z变换、希尔伯特变换、离散余弦变换等,这些都扩展了函数变换的定义,允许输入和输出有多种的值,简单地说变换就是把一堆的数据变成另一堆的数据的方法。
傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。
对于一个长度为N的时域信号,实数傅里叶变换得到的结果是N/2个长度;复数傅里叶变换之后得到的长度是N。
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多 信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
FFT中的一些要素:主要摘自为什么要进行傅立叶变换 - 一个模拟信号,经过ADC采样之后,就变成了数字信号。奈奎斯特采样定理告诉我们,采样频率要大于信号频率的两倍。
- 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。
- 假设采样频率为Fs,信号频率F,采样点数为N。
- 信号长度M点,假设采样频率为Fs,采样点数为N。(我们会要求)做FFT之后,某点n(n从1开始)表示的频率为: ( n − 1 ) F s N \frac{(n-1)Fs}{N} N(n−1)Fs;相邻谱线之间的距离是 F s N \frac{Fs}{N} NFs,Fn所能分辨到频率为为 F s N \frac{Fs}{N} NFs
- 在FFT中,信号长度为M,做N点FFT时,我们会要求
N > M
,多的部分用0补齐,如果N < M
就直接截断语音信号,numpy.fft.fft()
和scipy.fftpack.fft
效果是相同的。librosa的fft还没有实验,但估计都是一样的。 - 该点的模( a 2 + b 2 \sqrt{ a^{2}+b^{2} } a2+b2)复数 z = a + b i z = a + bi z=a+bi值除以 N 2 \frac{N}{2} 2N就是对应该频率下的信号的幅度(对于直流信号是除以N); 该点的相位即是对应该频率下的信号的相位。(在matlab、numpy.fft.fft以及scipy.fftpack.fft都是这样的)相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。
- 要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。具体的频率细分法可参考相关文献。
- 假设FFT之后某点n用复数 z = a + b i z = a + bi z=a+bi表示,那么这个复数的模就是 A n = a 2 + b 2 An = \sqrt{a^{2}+b^{2}} An=a2+b2,相位是 P n = a t a n 2 ( b , a ) Pn = atan2(b,a) Pn=atan2(b,a)`,直流信号没有相位可言