我对这个有点晚了,但是实现了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%的重叠,完美的作品。 有关更多信息,请参阅此讨论 。

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

一个testing:

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(XT), 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)')

这是我使用的STFT代码。 STFT + ISTFT在这里给予完美的重build (即使是第一帧)。 我稍微修改了Steve Tjoa给出的代码:这里重build信号的幅度与input信号的幅度相同。

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

librosa.core.stft和istft外观与我所寻找的非常相似,尽pipe它们当时并不存在:

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

尽pipe如此,它们并不完全相反。 两端是锥形的。

发现另一个STFT,但没有相应的反函数:

def stft(x, w, L=None): ... return X_stft

w是一个数组的窗口函数

L是样本中的重叠

上述两个答案对我来说都不是很好。 所以我修改了Steve Tjoa的

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...

我也发现这在GitHub上,但它似乎在pipe道而不是正常的数组上运行:

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

我认为scipy.signal有你在找什么。 它有合理的默认值,支持多种窗口types等…

from scipy.signal import spectrogram freq, time, Spec = spectrogram(signal)

python实现 stft_Python中可转换的STFT和ISTFT相关推荐

  1. 在SQL Server 2017中使用Python进行数据插值和转换

    As a continuation to my previous article, How to use Python in SQL Server 2017 to obtain advanced da ...

  2. python基础教程:Python图像处理库PIL中图像格式转换的实现

    这篇文章主要介绍了Python图像处理库PIL中图像格式转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 在数字图像处理 ...

  3. Python图像处理库PIL中图像格式转换(一)

    参考:https://blog.csdn.net/icamera0/article/details/50843172 在数字图像处理中,针对不同的图像格式有其特定的处理算法.所以,在做图像处理之前,我 ...

  4. 利用python解决Origin中十六进制和十进制整数转换的问题

    利用python解决Origin中十六进制和十进制整数转换的问题 Origin是由OriginLab公司开发的一个科学绘图.数据分析软件,功能非常强大,可以画出各种漂亮的图像,而且还能进行数理统计/数 ...

  5. Python中数组转换成字符串

    python中数组转换成字符串 数组转换成字符串可以使用下面这种方式将一个数组转换成字符串,其中arr是数组的数组名. ''.join(arr) 用上面这种方式需要确保数组里面的内容也是字符串的形式, ...

  6. python中单位转换_Python中的单位转换

    我赞成在科学计算应用中使用显式单位.使用显式单位类似于刷牙.它在前面增加了一些乏味,但是从长远来看,你得到的类型安全性可以节省很多麻烦.比如说,not crashing $125 million or ...

  7. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  8. python运行错误-Python在运行中发生错误怎么正确处理方法,案例详解!

    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描 ...

  9. python获取excel某一列-Python从Excel中读取日期一列的方法

    如下所示: import xlrd import datetime file=u"伏特加.xls"#注意读中文文件名稍微处理一下 data=xlrd.open_workbook(f ...

  10. python字符集_PYTHON 中的字符集

    Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...

最新文章

  1. 从本地上传项目到 github 以及从github 下载项目到本地环境
  2. 重装oracle12c_记一次win server 2012上oracle12c的安装过程
  3. 用科幻艺术描绘未知的魅力-环境篇
  4. mongodb命令基础知识点
  5. 浏览器DNS_PROBE_FINISHED_NXDOMAIN报错解决办法
  6. 性能测试 Performance Test
  7. CFS调度器的思想的新理解
  8. 有向有权图的电阻------给你出道题
  9. php配置mysql集群_【mysql集群】mysql集群配置
  10. [topcoder]AvoidRoads
  11. 时钟偏移(Skew)和时钟抖动(Jitter)
  12. 十大Java编程工具
  13. 拖拉机大战贺岁版发布
  14. Kaggle账号的注册
  15. 解决 Could not locate executable null\bin\winutils.exe in the Hadoop binaries 异常
  16. fstream,ifstream,ofstream 详解与用法
  17. Android Studio作业——近场通信
  18. 精研技术十数年,我却失业了
  19. 从《战狼2》到Oracle数据库,这中间有几个云的距离?
  20. 〖Python自动化办公篇⑪〗- word文件自动化 - word 转 PDF(pdfkit与pydocx相结合)

热门文章

  1. 新手兼职也能月入5000的副业项目,几乎零门槛
  2. excel颠倒顺序从下到上排列的两种方法
  3. 计算机怎么清理CAD,怎么完全卸载cad
  4. PS笔记1_如何制作电子签名
  5. 小波变换matlab代码,matlab小波变换代码
  6. python教程五(imput和while)
  7. Ubuntu触摸屏校准
  8. OpenGL ES着色器语言----------------储存修饰符
  9. 转录组测序(RNA-seq)详细建库步骤与原理
  10. matlab的toc,Python模仿matlab的tic/toc计时