我对这个有点晚了,但是实现了0.19.0的scipy内置的istft函数
这是我的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的blkproc 。 而不是一个for循环,我将一个命令(例如, fft )应用于列表理解中的每个信号帧,然后scipy.array将其转换为二维数组。 我用它来制作谱图,色谱图,MFCC-grams等等。
对于这个例子,我在istft使用了天真的overlap-and-add方法。 为了重构原始信号,顺序窗口函数的和必须是恒定的,最好等于1(1.0)。 在这种情况下,我select了Hann(或汉hanning )窗口和50%的重叠ÿ