python实现 stft_Python中的可逆STFT和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克,以及更多。

>对于这个例子,我在istft中使用一个朴素的重叠和添加方法。为了重建原始信号,顺序窗函数的和必须是恒定的,优选地等于单位(1)。在这种情况下,我选择了Hann(或hanning)窗口和50%的重叠,工作完美。有关详细信息,请参阅this discussion。

>可能有更多原则的计算ISTFT的方法。这个例子主要是为了教育。

一个测试:

if __name__ == '__main__':

f0 = 440 # Compute the STFT of a 440 Hz sinusoid

fs = 8000 # sampled at 8 kHz

T = 5 # lasting 5 seconds

framesz = 0.050 # with a frame size of 50 milliseconds

hop = 0.025 # and hop size of 25 milliseconds.

# Create test signal and STFT.

t = scipy.linspace(0, T, T*fs, endpoint=False)

x = scipy.sin(2*scipy.pi*f0*t)

X = stft(x, fs, framesz, hop)

# Plot the magnitude spectrogram.

pylab.figure()

pylab.imshow(scipy.absolute(X.T), origin='lower', aspect='auto',

interpolation='nearest')

pylab.xlabel('Time')

pylab.ylabel('Frequency')

pylab.show()

# Compute the ISTFT.

xhat = istft(X, fs, T, hop)

# Plot the input and output signals over 0.1 seconds.

T1 = int(0.1*fs)

pylab.figure()

pylab.plot(t[:T1], x[:T1], t[:T1], xhat[:T1])

pylab.xlabel('Time (seconds)')

pylab.figure()

pylab.plot(t[-T1:], x[-T1:], t[-T1:], xhat[-T1:])

pylab.xlabel('Time (seconds)')

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值