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%的重叠,效果很好。 有关更多信息,请参见此讨论。

计算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)')

Steve Tjoa answered 2020-02-06T02:07:40Z

9 votes

这是我使用的STFT代码。 这里的STFT + ISTFT可以提供完美的重建效果(即使是第一帧)。 我对Steve Tjoa在此处给出的代码进行了稍微修改:在这里,重构信号的幅度与输入信号的幅度相同。

import scipy, numpy as np

def stft(x, fftsize=1024, overlap=4):

hop = fftsize / overlap

w = scipy.hanning(fftsize+1)[:-1] # better reconstruction with this trick +1)[:-1]

return np.array([np.fft.rfft(w*x[i:i+fftsize]) for i in range(0, len(x)-fftsize, hop)])

def istft(X, overlap=4):

fftsize=(X.shape[1]-1)*2

hop = fftsize / overlap

w = scipy.hanning(fftsize+1)[:-1]

x = scipy.zeros(X.shape[0]*hop)

wsum = scipy.zeros(X.shape[0]*hop)

for n,i in enumerate(range(0, len(x)-fftsize, hop)):

x[i:i+fftsize] += scipy.real(np.fft.irfft(X[n])) * w # overlap-add

wsum[i:i+fftsize] += w ** 2.

pos = wsum != 0

x[pos] /= wsum[pos]

return x

Basj answered 2020-02-06T02:08:00Z

3 votes

2734974703168390390和2734974703168390390144看上去与我正在寻找的外观非常相似,尽管当时它们并不存在:

librosa.core.stft(y, n_fft=2048, hop_length=None, win_length=None, window=None, center=True, dtype=)

但是,它们并不能完全反转。 两端是锥形的。

endolith answered 2020-02-06T02:08:29Z

2 votes

我有点迟了,但意识到scipy自0.19.0起具有内置的istft功能

Miss Palmer answered 2020-02-06T02:06:57Z

1 votes

找到另一个STFT,但没有相应的逆函数:

[http://code.google.com/p/pytfd/source/browse/trunk/pytfd/stft.py]

def stft(x, w, L=None):

...

return X_stft

w是作为数组的窗口函数

L是重叠,在样本中

endolith answered 2020-02-06T02:09:02Z

1 votes

以上两种答案都不能很好地满足我的需求。 因此,我修改了史蒂夫·乔亚的。

import scipy, pylab

import numpy as np

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

"""

x - signal

fs - sample rate

framesz - frame size

hop - hop size (frame size = overlap + hop size)

"""

framesamp = int(framesz*fs)

hopsamp = int(hop*fs)

w = scipy.hamming(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):

""" T - signal length """

length = T*fs

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]))

# calculate the inverse envelope to scale results at the ends.

env = scipy.zeros(T*fs)

w = scipy.hamming(framesamp)

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

env[i:i+framesamp] += w

env[-(length%hopsamp):] += w[-(length%hopsamp):]

env = np.maximum(env, .01)

return x/env # right side is still a little messed up...

capybaralet answered 2020-02-06T02:09:23Z

0 votes

我也在GitHub上找到了它,但是它似乎在管道上而不是普通数组上运行:

[http://github.com/ronw/frontend/blob/master/basic.py#LID281]

def STFT(nfft, nwin=None, nhop=None, winfun=np.hanning):

...

return dataprocessor.Pipeline(Framer(nwin, nhop), Window(winfun),

RFFT(nfft))

def ISTFT(nfft, nwin=None, nhop=None, winfun=np.hanning):

...

return dataprocessor.Pipeline(IRFFT(nfft), Window(winfun),

OverlapAdd(nwin, nhop))

endolith answered 2020-02-06T02:09:47Z

0 votes

我认为scipy.signal具有您的所需。 它具有合理的默认值,支持多种窗口类型,等等。

[http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.signal.spectrogram.html]

from scipy.signal import spectrogram

freq, time, Spec = spectrogram(signal)

meatcomputer answered 2020-02-06T02:10:12Z

0 votes

basj答案的固定版本。

import scipy, numpy as np

import matplotlib.pyplot as plt

def stft(x, fftsize=1024, overlap=4):

hop=fftsize//overlap

w = scipy.hanning(fftsize+1)[:-1] # better reconstruction with this trick +1)[:-1]

return np.vstack([np.fft.rfft(w*x[i:i+fftsize]) for i in range(0, len(x)-fftsize, hop)])

def istft(X, overlap=4):

fftsize=(X.shape[1]-1)*2

hop=fftsize//overlap

w=scipy.hanning(fftsize+1)[:-1]

rcs=int(np.ceil(float(X.shape[0])/float(overlap)))*fftsize

print(rcs)

x=np.zeros(rcs)

wsum=np.zeros(rcs)

for n,i in zip(X,range(0,len(X)*hop,hop)):

l=len(x[i:i+fftsize])

x[i:i+fftsize] += np.fft.irfft(n).real[:l] # overlap-add

wsum[i:i+fftsize] += w[:l]

pos = wsum != 0

x[pos] /= wsum[pos]

return x

a=np.random.random((65536))

b=istft(stft(a))

plt.plot(range(len(a)),a,range(len(b)),b)

plt.show()

Денис Колесников answered 2020-02-06T02:10:32Z

-3 votes

如果您可以访问所需的C二进制库,请使用[http://code.google.com/p/ctypesgen/]生成该库的Python接口。

Michael Dillon answered 2020-02-06T02:10:52Z

python实现 stft_scipy-Python中的可逆STFT和ISTFT相关推荐

  1. python缩进格式错误的是_以下关于Python缩进的描述中,错误的是()

    以下关于Python缩进的描述中,错误的是() 过氧化氢催化分解反应速率常数的测定实验中,过氧化氢的初浓度是通过滴定法确定的.A:对B:错 WhichofthefollowingCANNOTbecon ...

  2. python短时傅里叶变换_python中的短时傅里叶变换

    我想在wav文件中获得每个时刻的最大功率频率. 所以我使用scipy的fft在Python中编写了STFT.我使用了scipy的kaiser窗口函数.一切看起来都很好,但是我的输出看起来很奇怪.它有一 ...

  3. 使用Python,EoN模拟网络中的疾病扩散模型,并结合matplotlib绘图

    使用Python,EoN模拟网络中的疾病扩散模型,并结合matplotlib绘图 1. EoN是什么 2. 安装 3. 效果图 4. 源代码 4.1 源码 4.2 源码 参考 写这篇博客源于博友的提问 ...

  4. 使用Python,OpenCV在视频中进行实时条形码检测

    使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...

  5. python缩进在程序中长度统一且强制使用_Python习题纠错1

    February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...

  6. mac搭建python开发环境_Mac中基于Homebrew搭建python开发环境

    转移到mac上了.这里是在lion中搭建python开发环境的简单记录.这份记录不是一份step by step.而是事后写的记录,可能有记忆遗漏.如果有错误,请指正. 1.安装homebrew的准备 ...

  7. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  8. python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation)

    python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation Funct ...

  9. python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)

    python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD.Median Absolute Devi ...

  10. python使用statsmodels包中的tsaplots函数可视化时间序列数据所有滞后位置个数(级别)的自相关性(plot the autocorrelation function)

    python使用statsmodels包中的tsaplots函数可视化时间序列数据所有滞后位置个数(级别)的自相关性(plot the autocorrelation function) 目录

最新文章

  1. STS中applicationContext.xml配置文件
  2. Mysql逻辑架构介绍
  3. Winform中使用用户控件实现带行数和标尺的RichTextBox(附代码下载)
  4. ./ 表示当前路径 ../ 表示上一级目录路径
  5. 容器大小_C++ 顺序容器基础知识总结
  6. 汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )
  7. AJAX(XMLHttpRequest)进行跨域请求方法详解(三)
  8. hdu1181(变形课)
  9. IBM的ITIL管理解决方案
  10. DMX512标准发送及代码整理
  11. 电子商务概论(农)之形考作业一
  12. 安装打印机时出现无法安装,打印处理器不存在
  13. 教程:如何将一首歌生成一个二维码?
  14. 路由器WDS桥接教程
  15. Oracle 的 表空间(Tablespace)、用户(User)、模式(Schema)
  16. Git使用基础---各种常见错误总结
  17. 《新闻联播》报道百度山西数据标注基地 培育新业态打开新就业空间
  18. 基于VC++和QT实现的图的可视化工具
  19. 我究竟适不适合做数据分析师?
  20. linux记事本的文本换到win10 换行失效的问题

热门文章

  1. 非度量多维标度_非度量多维尺度分析
  2. wps怎么自动生成目录?2分钟完成
  3. js 浏览器语音播报
  4. c语言汉字属于什么类型_【C语言】必学知识点 - 基本数据类型!你学会了吗?...
  5. 联合国可持续发展目标,中国大数据服务支持
  6. 这2个方法能将CAJ免费完整转换成Word
  7. Ubuntu 重置密码
  8. cad在服务器那个文件夹,CAD存放文件的路径默认在哪里
  9. 在Excel表格中隐藏行或列
  10. Windows如何后台运行bat文件