python实现 stft_Python中可转换的STFT和ISTFT
我对这个有点晚了,但是实现了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相关推荐
- 在SQL Server 2017中使用Python进行数据插值和转换
As a continuation to my previous article, How to use Python in SQL Server 2017 to obtain advanced da ...
- python基础教程:Python图像处理库PIL中图像格式转换的实现
这篇文章主要介绍了Python图像处理库PIL中图像格式转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 在数字图像处理 ...
- Python图像处理库PIL中图像格式转换(一)
参考:https://blog.csdn.net/icamera0/article/details/50843172 在数字图像处理中,针对不同的图像格式有其特定的处理算法.所以,在做图像处理之前,我 ...
- 利用python解决Origin中十六进制和十进制整数转换的问题
利用python解决Origin中十六进制和十进制整数转换的问题 Origin是由OriginLab公司开发的一个科学绘图.数据分析软件,功能非常强大,可以画出各种漂亮的图像,而且还能进行数理统计/数 ...
- Python中数组转换成字符串
python中数组转换成字符串 数组转换成字符串可以使用下面这种方式将一个数组转换成字符串,其中arr是数组的数组名. ''.join(arr) 用上面这种方式需要确保数组里面的内容也是字符串的形式, ...
- python中单位转换_Python中的单位转换
我赞成在科学计算应用中使用显式单位.使用显式单位类似于刷牙.它在前面增加了一些乏味,但是从长远来看,你得到的类型安全性可以节省很多麻烦.比如说,not crashing $125 million or ...
- 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, ...
- python运行错误-Python在运行中发生错误怎么正确处理方法,案例详解!
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描 ...
- python获取excel某一列-Python从Excel中读取日期一列的方法
如下所示: import xlrd import datetime file=u"伏特加.xls"#注意读中文文件名稍微处理一下 data=xlrd.open_workbook(f ...
- python字符集_PYTHON 中的字符集
Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...
最新文章
- 从本地上传项目到 github 以及从github 下载项目到本地环境
- 重装oracle12c_记一次win server 2012上oracle12c的安装过程
- 用科幻艺术描绘未知的魅力-环境篇
- mongodb命令基础知识点
- 浏览器DNS_PROBE_FINISHED_NXDOMAIN报错解决办法
- 性能测试 Performance Test
- CFS调度器的思想的新理解
- 有向有权图的电阻------给你出道题
- php配置mysql集群_【mysql集群】mysql集群配置
- [topcoder]AvoidRoads
- 时钟偏移(Skew)和时钟抖动(Jitter)
- 十大Java编程工具
- 拖拉机大战贺岁版发布
- Kaggle账号的注册
- 解决 Could not locate executable null\bin\winutils.exe in the Hadoop binaries 异常
- fstream,ifstream,ofstream 详解与用法
- Android Studio作业——近场通信
- 精研技术十数年,我却失业了
- 从《战狼2》到Oracle数据库,这中间有几个云的距离?
- 〖Python自动化办公篇⑪〗- word文件自动化 - word 转 PDF(pdfkit与pydocx相结合)