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