对音频信号作短时傅里叶变换(STFT)/小波变换处理(python + matlab)
对音频信号作短时傅里叶变换(STFT)处理,并绘制语谱图
摘要:录制一段音频,分别在matlab,python两种环境下,对其作短时傅里叶变换(STFT),最终得到期望的语谱图。
一、前言
1. 基础概念:
在对音频信号进行分析处理前,先简要回顾一下所用到的分析函数傅里叶变换的相关知识。
什么是傅里叶变换?
傅里叶的基本定义与性质在这里就不作赘述了,文章主要想说明它的主要应用,以助于大家对这个概念有一个更为形象的认识。(傅里叶基础概念与性质,推荐观看b站李永乐的讲解,文末附视频链接)
傅里叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。在分析信号时,主要应用于处理平稳信号,通过傅里叶变换可以获取一段信号总体上包含哪些频率的成分,但是对各成分出现的时刻无法得知。
因此对于非平稳信号,傅里叶变换就显示出了它的局限性,而我们日常生活中的绝大多数音频都是非平稳信号的。而解决这一问题的方法,就是采用短时傅里叶变换或者小波变换,对信号进行处理。
什么是短时傅里叶变换?
短时傅里叶变换(STFT)的核心思想:“加窗”,即把整个时域过程分解成无数个等长的小过程,每个小过程近似平稳,再对每个小过程进行傅里叶变换(FFT)。尽管STFT可以处理非平稳信号,但是它仍然有其局限性,即对窗函数的宽窄无法做到精确定义。
窗函数选择太窄,窗内的信号太短,会导致频率的分析不够精准,频率分辨率差;窗选的太宽,时域上又不够精细,时间分辨率低傅里叶与短时傅里叶的联系与区别?
什么是小波变换?
小波变换的核心思想:“把傅里叶变换的无限长三角函数的基换成有限长的会衰减的小波基”,这样不仅可以获取频率,还可以定位时间。更为详细的介绍可以参考本段末附上的参考来源,查询大佬相关阐述。
本文参考来源:
https://rf.eefocus.com/article/id-xiaobobianhuan?p=1 傅里叶–短时傅里叶–小波分析
https://blog.csdn.net/daaikuaichuan/article/details/80781505 小波与短时傅里叶的区别
https://wenku.baidu.com/view/4b9bb22c30b765ce0508763231126edb6f1a768e.html?fr=search-1_income7 短时傅里叶的概念理解
什么是语谱图?
语谱图:时间依赖于傅里叶分析的显示图形,实际上是一种动态频谱,综合了频谱图和时域波形图的优点,明显地显示出语音频谱随时间的变化情况。(其中,纵轴为频率,横着为时间,任一给定频率成分在给定时刻的强弱,用点的黑白度来表示)
2. 概念的形象化理解:
- 短时傅里叶变换进行音频分析流程的直观理解
- 欧拉公式可以将任意函数转化为一系列正(余)弦函数之和。任意函数在这里指我们的时域信号,而正(余)弦函数包含信号的频率和对应振幅信息。(时域处理)
- 傅立叶变换可以将时间0~t内采集的信号(时域,横轴时间、纵轴大小)分解为不同频率上的信号分量(频域,横轴频率、纵轴大小)。
- 短时傅立叶采用滑动窗口机制,设定窗口大小和步长,让窗口在时域信号上滑动,分别计算每个窗口的傅立叶变换,形成了不同时间窗口对应的频域信号,拼接起来就成为了频率随时间变化的数据(时频信号,数据绘图得语谱图)
文章参考来源:
https://www.jianshu.com/p/7e160442830f 直观理解短时傅里叶变换 STFT(简书)
https://www.bilibili.com/video/BV1A4411Y7vj/?spm_id_from=333.788.videocard.1 傅里叶变换-李永乐(b站视频,讲的很好)
3. 思路流程:
编程思路:
短时傅里叶变换(STFT)就是先把一个函数和窗函数进行相乘,然后再进行一维的傅里叶变换。并通过窗函数的滑动得到一系列的傅里叶变换结果,将这些结果排开便得到一个二维的表象。具体而言,可分为如下几步(以matlab源码为例):
(1)读取音频文件。(调用audioread,处理得到一个保存音频数据的数组,和一个采样频率)
(2)确定相关参数。(如窗函数、窗长、重叠点数,重叠长度,傅里叶点数等)
(3)调用spectrogram函数,做短时傅里叶变换。(S-将输入信号做STFT处理后得到的二维含时间、频率序列的数组数据;更为详细的处理过程见spectrogram函数定义)
(4)根据处理后的时频矩阵,绘制语谱图.
文章参考来源:
https://blog.csdn.net/zhaoyinhui0802/article/details/53048362 短时傅里叶变换原理解
整体思路:
- 录制一段音频或寻找一段音频(.MP3/.m4a),通过文件格式转换为.wav文件(网上有在线转换的方式,文后会给出网址链接),在python(调用librosa函数)或者matlab(调用audioread,spectogram函数)中对文件进行处理(STFT变换),最后对处理后的信号作绘图输出,得到语谱图。
文章参考来源:
https://cn.office-converter.com/ 文件在线转换网址
4. 必要准备:
音频文件+python应用环境+matlab应用环境
python应用环境:
- 作者是在vscode中编写python代码,CSDN中有许多博主介绍了vscode使用python的方法,在这里不做多的赘述,文章用到的调用函数为librosa,文章后面会贴出librosa库安装的说明。
- 可通过pip list 或 conda list 查询python 或anaconda是否包含librosa 库文件
文章参考来源:
https://blog.csdn.net/Small_Yogurt/article/details/104964760 vscode安装教程
https://blog.csdn.net/qq_40197828/article/details/93468787 vscode中配置python环境(可以选择配置anaconda中的python,这样会减少后续代码实现阶段,函数库的安装,如numpy,librosa等)
https://blog.csdn.net/u010824101/article/details/85239223 Windows10中用Anaconda的conda环境和VSCode工具来编写python代码
https://blog.csdn.net/zzc15806/article/details/79603994 音频处理库—librosa的安装与使用
matlab应用环境:
如何安装以及破解matlab,请参考下方资料来源(大佬写的非常详细),这里不作赘述了。
安装前须知(提醒):
1.安装全程须断开网络,否则破解不成功;
2.解压和安装前先关闭360、腾讯管家等杀毒软件,防止误杀破解补丁,导致破解失败;
3.Matlab 2018b适用于WIN7/8/10(64位)系统,亲测可用!
4.推荐电脑最低配置:内存8G+,处理器酷睿I5+;
文章参考来源:
https://blog.csdn.net/qq_26900233/article/details/88816789 MATLAB R2018b 安装教程(含软件资源)
二、代码实现
- python源码:
import librosa
import librosa.display
import matplotlib.pyplot as plt# 读取音频文件
filepath = 'C:\\Users\\非黑不即白\\Desktop\\Audio_processing_STFT\\python_project\\data\\'
filename = filepath + 'test_digital.wav'
x, sr = librosa.load(filename, sr=None) # x--音频时间序列(一维数组) ; sr--音频的采样率# STFT处理绘制声谱图
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X)) # X--二维数组数据plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()
plt.title('STFT transform processing audio signal')
plt.show()
- matlab源码:
[X, Fs]=audioread('C:\Users\非黑不即白\Desktop\Audio_processing_STFT\matlab_project\test_digital.wav'); % Fs 采样率 48000% audioread函数读取音频文件(X--保存音频信号的数据;Fs--音频采样率)figure; % 绘图
win_sz = 128; % 窗函数长度设置为128
han_win = hanning(win_sz); % 选择海明窗
nfft = 2^nextpow2(length(han_win)); % DFT点数(通常取最接近信号长度的2的整数次幂,即 nfft = 2^nextpow2(length(window)) )=128=win_size
nooverlap = win_sz - 1; % 重叠长度(而随着noverlap参数的引入,增大了时间轴分辨率,即每隔(Nw - noverlap)长度进行一次频率轴的更新,随着noverlap逐渐接近Nw,图像上表现为时间轴更加“细腻”,但随之而来的肯定是计算次数的增加。)
[S, F, T, P] = spectrogram(X(:,1), window, nooverlap, nfft, Fs); % spectrogram注释:x:输入的信号 向量;window:窗口长度 该函数默认使用海明窗;noverlap:各段之间重叠的采样点数 即两窗口相重叠的部分;nfft:对窗口下的信号做FFT的点数;fs:信号的采样率% s:输入信号x的短时傅里叶变换。(它的每一列包含一个短期局部时间的频率成分估计,时间沿列增加,频率沿行增加。)% F:为四舍五入的频率,其长度等于S的行数。% T:频谱图计算的时刻点,值为窗的时刻中值。% P:功率谱密度PSD(Power Spectral Density) imagesc(T, F, log10(abs(S))) % 绘图函数(将矩阵S中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色;T、F为其横纵坐标)
colorbar;
set(gca, 'YDir', 'normal') % 坐标轴设置(ydir表示Y轴;normal-坐标轴正序;reverse--倒序)
xlabel('Time (secs)')
ylabel('Freq (Hz)')
title('STFT transform spectrum')
- 小波变换处理(matlab):
[X, Fs]=audioread('C:\Users\非黑不即白\Desktop\Audio_processing_STFT\matlab_project\test_digital.wav'); % Fs 采样率 48000% audioread函数读取音频文件(X--保存音频信号的数据;Fs--音频采样率)wavename='cmor3-3'; % 选定小波基
totalscal=256;
Fc=centfrq(wavename); % 小波的中心频率 测得Fc = 3
c=2*Fc*totalscal; % 测得c = 1536
scals=c./(1:totalscal); % 求得尺度
f=scal2frq(scals,wavename,1/Fs); % 将尺度转换为频率 % 频率在0-500Hz取1024<span style="font-family:Arial, Helvetica, sans-serif;">个点</span>
coefs = cwt(X(:,1),scals,wavename); % 求连续小波系数
t=0:1/Fs:size(X(:,1))/Fs;
figure
imagesc(t,f,abs(coefs));
set(gca,'YDir','normal')
colorbar;
xlabel('时间 t/s');
ylabel('频率 f/Hz');
title('小波时频图')
文章参考来源:
https://blog.csdn.net/lanchunhui/article/details/72240693 matlab 时频分析(短时傅里叶变换、STFT)
https://blog.csdn.net/weixin_42765703/article/details/104871604 解析MATLAB短时傅里叶变换函数spectrogram()
https://blog.csdn.net/zb1165048017/article/details/80682473 【音频处理】短时傅里叶变换
https://blog.csdn.net/weixin_44586750/article/details/103219952 数字信号处理——时频分析(短时傅里叶变换+手动实现时频分析)
https://blog.csdn.net/qq_42815385/article/details/89095135 STFT(短时傅里叶变换)音频特征提取,用于语音识别 python
https://blog.csdn.net/Barry_J/article/details/81065932 音频特征提取——python/ librosa工具包使用
https://blog.csdn.net/qq_34218078/article/details/101255636 librosa语音信号处理
https://blog.csdn.net/yunman2012/article/details/103542690 librosa处理音频信号
三、总结(作者小白话)
- 写这篇博客的缘由,主要想对近期音频信号处理相关知识的学习,做一个系统性的梳理,同时也希望能够对大家有所帮助(学习阶段,查阅了不少大佬文章,收益匪浅,这些都成为我写博客,分享自己的学习历程,与经验教训的一个动力)。
- 整个学习阶段,从了解傅里叶变换,到python、matlab环境的配置和使用,以及后续的音频文件处理,STFT变换等,走过了许多弯路,也遇到了一些不常见的bug(主要是python环境配置,库安装时),但最终还是坚持了下来。目前对音频处理的相关学习还不是很深入,文章还存在许多不全面的地方,在后续深入学习过程中,会对不合理的地方做出调整,也希望各位大佬能多多指教。相互学习,共同进步啊,哈哈哈。(文章引用了一些大佬的文章(文章小节处有标注),以便各位同仁能更全面的了解,当然也会存在一些疏漏,请指教,望见谅。)
- 补充,写文章阶段时,发现了一位大佬关于python语音基础操作的文章,内容很详实,包含音频生成,语音分析、处理的介绍,收益匪浅,文章最后附原文链接,希望有助于大家理解语音信号处理。
文章参考来源:
https://blog.csdn.net/sinat_18131557/article/details/106440757 Python语音基础操作(对python处理语音信号的过程介绍的很详细,推荐!)
对音频信号作短时傅里叶变换(STFT)/小波变换处理(python + matlab)相关推荐
- 傅里叶变换、短时傅里叶变换、小波变换
顺序:傅里叶-->短时傅里叶变换-->小波变换的顺序 转载自形象易懂的傅里叶变换.短时傅里叶变换和小波变换本文作者按照傅里叶-短时傅里叶变换-小波变换的顺序,由浅到深的解释小波变换的缘由以 ...
- 2021-05-10 Matlab短时傅里叶变换和小波变换的时频分析
Matlab短时傅里叶变换和小波变换的时频分析 简介 本文主要给定一小段音频,通过短时傅里叶变换和小波变换制作时频图.音频的采样率为44100, 短时傅里叶变换 在matlab中,短时傅里叶变换的分析 ...
- 数字信号处理之变换:傅里叶变换、短时傅里叶变换、小波变换等
傅里叶变换.拉普拉斯变换.自(互)相关及卷积是线性系统分析里最重要的四个数学工具. 数字信号处理中常用的几种变换:傅里叶变换.短时傅里叶变换.小波变换.希尔伯特-黄变换.拉普拉斯变换. 线性变换:傅里 ...
- 短时傅里叶变换(STFT)及matlab
笔记~自用版~ 短时傅里叶变换的基础理论 短时傅里叶变换(Short-Time Fourier Transform, STFT)是一种时频分析方法,它将信号在时间域上分成若干个短时段,对每个短时段进行 ...
- matlab简单分析短时傅里叶变换STFT
华中科技大学<数字信号分析理论实践> 学习总结记录 短时傅里叶变换进行时频分析 Fs = 5120.0; dt = 1/Fs; N = 32768; df = 500.0/N; T = d ...
- 用simulink分析傅里叶变换、短时傅里叶变换和小波变换
参考:https://zhuanlan.zhihu.com/p/22450818?refer=dong5 1.FFT,分析基波的参与时间对傅里叶变换的影响 基波为4个余弦波,用matlab程序控制其参 ...
- 短时傅里叶变换(STFT)实例
记录学习音频短时傅里叶变换的过程,注意,这里并不会讲述傅里叶变换的原理 想了解原理可以自行搜索或查看文中的参考文章 运行使用Pycharm,环境为python3.10 1.导入软件包,设置快速傅里叶变 ...
- librosa.stft() 短时傅里叶变换
librosa 短时傅里叶变换 import numpy as np # pip install numpy import librosa # pip install librosa y, sr = ...
- 【音频处理】短时傅里叶变换
前言 上一篇博客讲了离散傅里叶变换,里面的实例是对整个信号进行计算,虽然理论上有N点傅里叶变换(本博客就不区分FFT和DFT了,因为它俩就是一个东东,只不过复杂度不同),但是我个人理解是这个N点是信号 ...
- Python音频信号处理 1.短时傅里叶变换及其逆变换
短时傅里叶变换及其逆变换 本篇文章主要记录了使用python进行短时傅里叶变换,分析频谱,以及通过频谱实现在频域内降低底噪的代码及分析,希望可以给同样在学习信号处理的大家一点帮助,也希望大家对我的文章 ...
最新文章
- kafka源码分析之二客户端分析
- 初等代数(1):数的分类、基本运算规律、乘法及其因式分解公式、公式、比例、根式
- boost::all_degree_centralities用法的测试程序
- Vue.js先入个门看看
- 必备天气预报界面APP应用设计灵感,出门瞅一瞅~
- Understanding Bootstrap Of Oracle Database
- 广工c语言试卷504,广工C语言试卷与答案.doc
- 网站定时监控平台有哪些 7款好用的实时监控网站工具
- 一张图概括淘宝直播背后的前端技术 | 赠送多媒体前端手册
- LEARNING TO REPRESENT PROGRAMS WITH HETEROGENEOUS GRAPHS 学会用异构图表示程序(从AST中构建异构图)
- 夏天想美美的出门?店湾妹的“明星穿搭教科书”,很美有木有?
- 获取当前日期的三个月前的日期
- android麦克风录音格式,Android 中使用MIC(麦克风)录音
- 人工智能(AI)背后人工的力量——数据标注
- cocos2dx打包APK
- 浅谈数据标注平台运营模式
- 用51单片机和ch375实现键鼠功能
- STM32软件仿真卡住
- 用计算机术语赞美老师,赞美老师的诗句 形容老师辛苦的诗句
- My97 DatePicker图标触发
热门文章
- 择校秘籍|南大计算机 和 北航计算机 应该怎么选?
- PX4新增自定义orb消息
- npm安装报错: errno ETIMEDOUT network request toXXX failed, reason: connect ETIMEDOUT
- 大前端学习笔记 -- Vue.js 3.0响应式系统原理
- 【语音增强】基于matlab小波变换语音增强【含Matlab源码 296期】
- excel 第2讲:单元格格式设置
- 电脑文件夹如何有效分类?
- Linux 下实现ssh无密码登陆
- [双目视差] 单双目MATLAB 相机标定(二)双目摄像机标定
- 【Java框架】CSFramework框架的应用——简易聊天室