原理

短时傅里叶变换(Short Time Fourier Transform, STFT) 是一个用于语音信号处理的通用工具.它定义了一个非常有用的时间和频率分布类, 其指定了任意信号随时间和频率变化的复数幅度. 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱.

短时傅里叶变换通常的数学定义如下:

其中,

DTFT (Decrete Time Fourier Transform) 为离散时间傅里叶变换.  其数学公式, 如下所示:

其中,  x(n) 为在采样数 n 处的信号幅度. ω~ 的定义如下:

实现时, 短时傅里叶变换被计算为一系列加窗数据帧的快速傅里叶变换 (Fast Fourier Transform, FFT),其中窗口随时间 “滑动” (slide) 或“跳跃” (hop) 。

Python 实现

在程序中, frame_size 为将信号分为较短的帧的大小, 在语音处理中, 通常帧大小在 20ms 到 40ms 之间. 这里设置为 25ms, 即 frame_size = 0.025;

frame_stride 为相邻帧的滑动尺寸或跳跃尺寸, 通常帧的滑动尺寸在 10ms 到 20ms 之间, 这里设置为 10ms, 即 frame_stride = 0.01. 此时, 相邻帧的交叠大小为 15ms;

窗函数采用汉明窗函数 (Hamming Function) ;

在每一帧, 进行 512 点快速傅里叶变换, 即 NFFT = 512. 具体程序如下:

#-*- coding: utf8 -*-

importnumpy as npdef calc_stft(signal, sample_rate=16000, frame_size=0.025, frame_stride=0.01, winfunc=np.hamming, NFFT=512):#Calculate the number of frames from the signal

frame_length = frame_size *sample_rate

frame_step= frame_stride *sample_rate

signal_length=len(signal)

frame_length=int(round(frame_length))

frame_step=int(round(frame_step))

num_frames= 1 + int(np.ceil(float(np.abs(signal_length - frame_length)) /frame_step))#zero padding

pad_signal_length = num_frames * frame_step +frame_length

z= np.zeros((pad_signal_length -signal_length))#Pad signal to make sure that all frames have equal number of samples

#without truncating any samples from the original signal

pad_signal =np.append(signal, z)#Slice the signal into frames from indices

indices = np.tile(np.arange(0, frame_length), (num_frames, 1)) +np.tile(np.arange(0, num_frames* frame_step, frame_step), (frame_length, 1)).T

frames= pad_signal[indices.astype(np.int32, copy=False)]#Get windowed frames

frames *=winfunc(frame_length)#Compute the one-dimensional n-point discrete Fourier Transform(DFT) of

#a real-valued array by means of an efficient algorithm called Fast Fourier Transform (FFT)

mag_frames =np.absolute(np.fft.rfft(frames, NFFT))#Compute power spectrum

pow_frames = (1.0 / NFFT) * ((mag_frames) ** 2)returnpow_framesif __name__ == ‘__main__‘:importscipy.io.wavfileimportmatplotlib.pyplot as plt#Read wav file

#"OSR_us_000_0010_8k.wav" is downloaded from http://www.voiptroubleshooter.com/open_speech/american.html

sample_rate, signal = scipy.io.wavfile.read("OSR_us_000_0010_8k.wav")#Get speech data in the first 2 seconds

signal = signal[0:int(2. *sample_rate)]#Calculate the short time fourier transform

pow_spec =calc_stft(signal, sample_rate)

plt.imshow(pow_spec)

plt.tight_layout()

plt.show()

参考资料

1. DISCRETE TIME FOURIER TRANSFORM (DTFT). https://www.dsprelated.com/freebooks/mdft/Discrete_Time_Fourier_Transform.html

2. THE SHORT-TIME FOURIER TRANSFORM. https://www.dsprelated.com/freebooks/sasp/Short_Time_Fourier_Transform.html

3. Short-time Fourier transform. https://en.wikipedia.org/wiki/Short-time_Fourier_transform

4. Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What‘s In-Between. https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html

python短时傅里叶变换_短时傅里叶变换(Short Time Fourier Transform)原理及 Python 实现...相关推荐

  1. 短时傅里叶变换原理及其MATLAB实现(Short Time Fourier Transform,STFT)

    短时傅里叶变换原理及其MATLAB实现(Short Time Fourier Transform,STFT) 1.短时Fourier变换原理(STFT原理) 信号x(t)短时Fourier变换定义为: ...

  2. python 三维凸包_浅尝则止 - SciPy科学计算 in Python

    本文节选自作者的<Python编程基础及应用>视频教程.Python编程基础及应用_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 21. 浅尝则止 ...

  3. python装逼_能够让你装逼的10个Python小技巧

    列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来 ...

  4. python简单编程语言_功能强大而又简单易学的编程语言Python

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言(维基百科).自从上次写那个批量Blast小程序的时候接触了Python,发现这个玩意儿真是好用,后来还用它弄了个动态 ...

  5. python手把手入门_新手必看:手把手教你入门 Python

    首先,Python是什么?据它的创始人Guido van Rossum而言, "Python是一种高级编程语言,它的核心设计思想是代码可读性和允许程序员用几行代码来表达观点的语法." ...

  6. 虚拟机python建站_搭建本地虚拟服务器linux(CentOS 7)的python虚拟环境(Hyper-V演示)...

    新建虚拟机->安装CentOS7->新建虚拟交换机:内部网络->CentOS7设置->网络适配器:虚拟交换机:新建虚拟交换机->进入CentOS #cd /etc/sys ...

  7. python 字符串操作速度_强者一出,谁与争锋?与Python相比,C+的运行速度究竟有多快?|python|编程语言|字符串|示例|算法...

    对于数据科学家而言,热爱Python的理由数不胜数.但你是否也曾问过这样的问题:Python和C或C++等更专业的低级编程语言究竟有何不同呢?我想这是很多数据科学家或者Python用户曾经问过或者将来 ...

  8. python @修饰符_数据结构与算法之8——抽象数据类型与python类

    就算你是特别聪明,也要学习,从头学起!--(俄国)屠格涅夫 本篇文章要说的主要是数据结构与算法和python中关于类(Class)以及异常(Error)的一些基础,虽然很简单,但是必须非常重视.只有在 ...

  9. python 自定义数据类型_【整理合集,建议收藏】Python数据类型(一)

    一.数据类型 在python这门语言中,数据类型分为两种. 内置的和自定义的. 内置的包括 数字 . 字符串 . 布尔 . 列表 . 元组 . 字典 . Bytes . 集合 这些常用的以 及一些不太 ...

  10. python版本切换_如何在cmd下切换不同版本的Python

    (1)分别安装 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官网下载的) 顺序无所谓(为了看着方便,我把安装路径修改统一了) (2)配置 ...

最新文章

  1. [模板][持续更新]欧拉回路与欧拉路径浅析
  2. 范登读书解读《亲密关系》(婚姻、爱情) 笔记
  3. HTMl中内联边框是怎样实现连接的
  4. Android在listview添加checkbox实现单选多选操作问题
  5. 前端完全分离和前端不完全分离
  6. Apollo本地jar包启动方法
  7. using(别名)和range based for
  8. 验证redis的主从复制
  9. python注销代码_django用户注册、登录、注销和用户扩展的示例
  10. Redhat 7 Web服务器配置
  11. 自然语言处理的几个困难
  12. effective java 第2条:遇到多个构造器参数时要考虑用构造器
  13. csdn 积分/c币获取方法
  14. Linux网络抓包分析工具(tcpdump、wireshark)
  15. Java类加载机制由浅入深
  16. 一个简单的if控制语句
  17. 5、区域特征分析和区域提取
  18. 原神七块石板位置在哪
  19. 图片上传几种方式总结
  20. 网页轮播图(详细版)

热门文章

  1. Windows编程语言VBA学习(四)——VBA代码调试
  2. Linux Command diff 文件比较
  3. 云计算对21世纪IT人的挑战
  4. JUCE框架教程(3)—— Component ClassGraphics入门
  5. 离线语音茶吧机设计应用案例
  6. pb 数据窗口设置操作
  7. soap报文解析 php,soap 返回报文解析
  8. java jbutton 禁用_java – 在后台作业时禁用JButton,以避免多次单击
  9. android实训报告ppt模板,实训报告ppt模板
  10. arm服务器虚拟化云手机,arm虚拟化部署的云手机有哪些优缺点