Python音频信号处理 1.短时傅里叶变换及其逆变换
短时傅里叶变换及其逆变换
本篇文章主要记录了使用python进行短时傅里叶变换,分析频谱,以及通过频谱实现在频域内降低底噪的代码及分析,希望可以给同样在学习信号处理的大家一点帮助,也希望大家对我的文章多提意见建议。
一. 短时傅里叶变换与离散傅里叶变换
在这篇文章中我们主要运用了短时傅里叶变换,要想清楚地理解短时傅里叶变换,首先必须要了解离散傅里叶变换(Discrete Fourier Transform,DFT)。
1.离散傅里叶变换
离散傅里叶的定义:
离散傅里叶变换适用于在时域上不连续且有限的数字信号,在上述公式中,x[n] 就是我们在时域中的初始数字信号,Fe 对应这个信号的采样频率。在离散傅里叶变换中,首先初始数字信号本身是离散的,在上式中初始信号x[n]是在时域内的一段有限信号,N代表了该段数字信号一共包含N个采样点,即其在时域上的长度为1/Fe * N。同时离散傅里叶变换所得的结果X[k]在频域上也是离散的,简而言之,是将频域[0,Fe]等分成了M份 :
[k]也可以理解为包含了M个复数值的向量。在离散傅里叶变换中,采样点的个数N(时域上的取样长度),以及频域上的采样个数M都是可调整的,两个采样个数的选择对于DFT的解析度和精确度会有影响,这里就不过多展开。
我们在实际应用离散傅里叶变换时,会发现,有的时域上完全不同的信号,他们的离散傅里叶变换频谱却是一致的,因此我们引入一个新的 短时傅里叶变换(STFT)。
2.短时傅里叶变换
短时傅里叶变换的定义 :
当引入了时间变量τ \tauτ之后我们就可以针对不同瞬间进行频谱分析,对于每一个瞬间τ \tauτ我们都可以获取信号在该时刻的频谱。
二. 使用python 进行短时傅里叶变换
在这一部分我会分享基于python的短时傅里叶变换的实现,可供参考。
首先是可能使用到的python库
接下来就是短时傅里叶变换的python实现
上述函数解释:
参数部分
trame和Fe : 初始的数字信号和它的采样频率
Nfft : 上文提到的离散傅里叶变换中,频域的采样个数M
fenetre : 短时傅里叶变换中使用的窗函数,在接下来的实现中我都使用了汉明窗np.hamming。
Nwin : 窗函数的长度(包含点的个数)
Nhop : 窗函数每次滑动的长度,一般规定为Nwin/2,窗函数长度的一半
首先创建一个M行L列的矩阵xmat,该矩阵的每一行代表一个0-Fe的频率,单位为Hz,每一列对应该段被窗函数截取的信号的FFT快速傅里叶变换。
三. 使用overlapp-add算法进行短时傅里叶变换的逆变换重构原信号
在这一部分中,我们使用了overlapp-add算法来进行短时傅里叶变换的逆变换。
下面是该部分的全部代码,之后会逐步解释算法的实现 :
该算法的实现需要三步。
1. 快速傅里叶逆变换
第一步,对上一部分得出的矩阵xmat进行快速傅里叶变换的逆变换,得出同样规格M行L列的矩阵yl。
2. 对各列进行平移并叠加
对yl矩阵的每一列平移 (l-1)Nhop,l ∈ \in∈ [1,L],例如第一列不变,第二列平移Nhop,第三列平移2Nhop,以此类推。之后将所有列的转置,叠加到总长度为Nfft +(L-1)*Nhop的向量yvect中。
3. 标准化
- 点赞
- 收藏
- 关注作者
评论(0)