python实现 stft_scipy-Python中的可逆STFT和ISTFT

这篇博客介绍了如何在Python中使用SciPy库实现可逆的短时傅立叶变换(STFT)和逆短时傅立叶变换(ISTFT)。通过示例代码展示了STFT和ISTFT的计算过程,以及如何确保信号在反转后能够精确重建。讨论了不同的窗口函数、重叠比例和零填充等因素,并提供了多个Python代码示例进行对比。
摘要由CSDN通过智能技术生成

scipy-Python中的可逆STFT和ISTFT

SciPy或NumPy或其他内置的逆傅立叶变换是否有通用形式的短时傅立叶变换?

matplotlib中有pyplot specgram函数,该函数调用2734972705589589167104,该函数调用mlab.specgram(),该函数调用istft(stft(x))==x:

istft(stft(x))==x

这是一个辅助功能,可实现   204#psd,csd和频谱图。 它是   不打算在mlab之外使用

我不确定这是否可以用于STFT和ISTFT。 还有什么,还是我应该翻译像这些MATLAB函数一样的东西?

我知道如何编写自己的临时实现; 我只是在寻找功能全面的东西,它可以处理不同的窗口功能(但默认设置是健全的),并且可以通过COLA窗口(istft(stft(x))==x)完全反转,并由多人测试,没有错位的错误,可以处理 末端和零填充很好,用于实际输入的快速RFFT实现等。

10个解决方案

62 votes

这是我的Python代码,针对此答案进行了简化:

import scipy, pylab

def stft(x, fs, framesz, hop):

framesamp = int(framesz*fs)

hopsamp = int(hop*fs)

w = scipy.hanning(framesamp)

X = scipy.array([scipy.fft(w*x[i:i+framesamp])

for i in range(0, len(x)-framesamp, hopsamp)])

return X

def istft(X, fs, T, hop):

x = scipy.zeros(T*fs)

framesamp = X.shape[1]

hopsamp = int(hop*fs)

for n,i in enumerate(range(0, len(x)-framesamp, hopsamp)):

x[i:i+framesamp] += scipy.real(scipy.ifft(X[n]))

return x

笔记:

列表理解是我喜欢用来模拟numpy / scipy中信号块处理的一个小技巧。 就像Matlab中的istft一样。 我将命令(例如fft)应用于列表推导中的信号的每一帧,而不是hanning循环,然后scipy.array将其转换为2D数组。 我用它来制作频谱图,色谱图,MFCC图等。

对于此示例,我在istft中使用了幼稚的“重叠与加法”。为了重建原始信号,顺序窗口函数之和必须恒定,最好等于1(1.0)。 在这种情况下,我选择了Hann(或hanning)窗口和50%的重叠,效果很好。 有关更多信息,请参见此讨论。

计算I

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值