这里是我的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克,以及更多。
>对于这个例子,我在istft中使用一个朴素的重叠和添加方法。为了重建原始信号,顺序窗函数的和必须