Python音频信号处理 1.短时傅里叶变换及其逆变换

举报
莫言2021 发表于 2021/11/02 16:37:55 2021/11/02
【摘要】 短时傅里叶变换及其逆变换本篇文章主要记录了使用python进行短时傅里叶变换,分析频谱,以及通过频谱实现在频域内降低底噪的代码及分析,希望可以给同样在学习信号处理的大家一点帮助,也希望大家对我的文章多提意见建议。一. 短时傅里叶变换与离散傅里叶变换在这篇文章中我们主要运用了短时傅里叶变换,要想清楚地理解短时傅里叶变换,首先必须要了解离散傅里叶变换(Discrete Fourier Trans...

短时傅里叶变换及其逆变换
本篇文章主要记录了使用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. 标准化

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。