短时傅里叶变换(Short-Time Fourier Transform, STFT),语音识别

高能预警!!!

.wav文件为笔者亲自一展歌喉录制的噪声,在家中播放,可驱赶耗子,蟑螂

介绍

短时傅里叶变换(Short-Time Fourier Transform, STFT)是一种时频分析方法,用于分析非平稳信号的频率成分随时间的变化。与传统的傅里叶变换不同,STFT在处理信号时考虑了时间局部性,使得它能够同时在时间域和频率域上分析信号。

STFT的背景

傅里叶变换可以将信号从时间域转换到频率域,揭示出信号的频率成分。然而,傅里叶变换有一个显著的局限性,即它假定信号在整个时间范围内都是稳定的,频率成分不随时间变化。因此,对于非平稳信号——即其频率成分随时间变化的信号——傅里叶变换难以提供充分的信息。

为了克服这一局限性,STFT被引入,它通过将信号分割为一系列较短的时间窗口,假定每个窗口内的信号是近似平稳的。然后对每个窗口内的信号应用傅里叶变换,从而获得在这些窗口内的频率成分。

STFT的定义

STFT的基本思想是使用一个滑动窗口函数,将信号分割成若干个短时段,对每个时段进行傅里叶变换。STFT定义为:
X ( t , f ) = ∫ − ∞ ∞ x ( τ ) ⋅ w ( τ − t ) ⋅ e − j 2 π f τ d τ X(t,f) = \int_{-\infty}^{\infty}x(\tau)\cdot w(\tau-t)\cdot e^{-j2\pi f\tau}d\tau X(t,f)=x(τ)w(τt)ej2πfτdτ
其中,
x ( τ ) x(\tau) x(τ)是原始信号。
w ( τ − t ) w(\tau -t) w(τt) 是一个窗口函数(通常为高斯窗、汉宁窗、矩形窗等),它在时间 t t t处对信号进行加权。
f f f是频率, t t t是时间。
X ( t , f ) X(t,f) X(t,f)是时间 t t t处的频谱。
通过选择不同的窗口函数和窗口长度,可以在时间分辨率和频率分辨率之间进行权衡。

STFT的计算步骤

信号分段:将信号分割成若干重叠的短时间片段,每个片段与相邻片段之间通常有部分重叠,以确保时间域上的连续性。

加窗:对每个片段施加一个窗口函数,使得信号的边缘部分平滑过渡,减少频谱泄露效应。

傅里叶变换:对每个加窗后的片段应用傅里叶变换,得到该时间片段的频谱信息。

时频图:将每个时间片段的频谱信息组合起来,形成一个二维的时频图(或称为声谱图),横轴为时间,纵轴为频率,颜色或强度表示该时间和频率位置处的信号幅度。

STFT的性质

时间分辨率与频率分辨率的权衡:窗口函数的长度决定了STFT的时间分辨率和频率分辨率。短窗口提供较好的时间分辨率,但频率分辨率较差;长窗口则提供较好的频率分辨率,但时间分辨率较差。

频谱泄露:由于窗口函数的截断效应,STFT会产生频谱泄露,即频谱成分扩展到其他频率范围。通过选择合适的窗口函数(如汉宁窗或高斯窗)可以减少这种效应。

时频不确定性:STFT的时频分析受到不确定性原理的限制,即无法同时获得无限好的时间分辨率和频率分辨率。

STFT的应用

STFT广泛应用于各种需要时频分析的领域,以下是一些典型的应用场景:

语音信号处理:在语音信号处理中,STFT被用来分析语音信号的时频特性,如语音识别、语音增强和语音分离等任务中。

音乐信号分析:STFT用于音乐信号的频谱分析、音高检测、乐器识别等。它可以显示乐曲随时间变化的频谱结构,帮助理解音乐的动态特性。

地震波分析:在地震波信号处理中,STFT可以帮助分析地震波的频率成分随时间的变化,特别是在地震事件中的高频噪声或波形变化。

生物医学信号分析:在心电图(ECG)、脑电图(EEG)等生物医学信号处理中,STFT可以用于检测信号中的异常波形或事件,例如癫痫发作期间的EEG频谱变化。

机器故障诊断:在机械系统的振动信号分析中,STFT可以用于检测和识别随时间变化的频率成分,从而诊断出潜在的机械故障。

STFT的局限性

尽管STFT在时频分析中非常有用,但它也有一些局限性:

分辨率权衡:如前所述,时间分辨率和频率分辨率之间存在固有的权衡,无法同时获得高时间分辨率和高频率分辨率。

计算复杂度:STFT涉及对每个时间片段进行傅里叶变换,计算量较大,尤其是对于长时间序列信号,这可能成为计算资源的瓶颈。

窗口效应:窗口函数的选择对STFT结果有显著影响,不同的窗口函数可能导致不同的频谱特征,从而影响分析结果的准确性。

STFT与其他时频分析方法的比较

除了STFT之外,还有一些其他时频分析方法,例如小波变换(Wavelet Transform, WT)、希尔伯特黄变换(Hilbert-Huang Transform, HHT)等。这些方法各有优缺点,适用于不同类型的信号分析任务:

小波变换:通过不同尺度的多分辨率分析,提供更灵活的时频分辨率选择,适合分析具有突变点或非平稳特性的信号。

希尔伯特黄变换:基于经验模态分解(EMD)方法,用于处理非线性和非平稳信号,能够自适应地分解信号的本征模态函数。

STFT的优势在于其相对简单且直观的时频分析方法,特别适用于处理较为平稳的信号或在短时间内频率变化不大的信号。小波变换则在处理突变或非线性信号时表现更好,而希尔伯特黄变换适合处理复杂的非平稳信号。

本文代码

我们将展示如何使用短时傅里叶变换(STFT)进行语音信号的处理与分析,以用于语音识别场景。这段代码涵盖了语音信号的预处理、STFT计算、特征提取,以及用于语音识别的MFCC(Mel-Frequency Cepstral Coefficients)特征的计算

核心代码

% MATLAB Code for Speech Recognition using STFT% Step 1: Load and Preprocess the Speech Signal
[speechSignal, Fs] = audioread('1725125026821.wav'); % Load speech signal from a .wav file
speechSignal = speechSignal(:,1); % Use only one channel if the signal is stereo
speechSignal = speechSignal / max(abs(speechSignal)); % Normalize the signal% Step 2: Parameters Setup
frameLength = 0.025 * Fs; % 25 ms per frame
frameOverlap = 0.015 * Fs; % 15 ms overlap
nfft = 2^nextpow2(frameLength); % FFT length, next power of 2 from frame length
window = hamming(frameLength); % Hamming window for each frame% Step 3: Compute STFT
[S, F, T] = stft(speechSignal, Fs, 'Window', window, 'OverlapLength', frameOverlap, 'FFTLength', nfft);% Convert STFT result to magnitude spectrogram
magnitudeSpectrogram = abs(S);% Step 4: Mel-Frequency Cepstral Coefficients (MFCC) Calculation
% The mfcc function should be used with proper parametersmfccs = mfcc(speechSignal, Fs, 'NumCoeffs', 13, 'WindowLength', frameLength, 'OverlapLength', frameOverlap);% Step 5: Visualize the Results% Plot the original speech signal
figure;
subplot(3,1,1);
plot((1:length(speechSignal))/Fs, speechSignal);
title('Original Speech Signal');
xlabel('Time (s)');
ylabel('Amplitude');% Plot the magnitude spectrogramtitle('Magnitude Spectrogram (dB)');
xlabel('Time (s)');
ylabel('Frequency (Hz)');
colorbar;% Plot the MFCCs
subplot(3,1,3);
imagesc(T, 1:13, mfccs');
axis xy;
title('MFCCs');
xlabel('Time (s)');
ylabel('MFCC Coefficient Index');
colorbar;% Step 6: Application in Speech Recognition
% Assuming the MFCCs are now used as features for a machine learning model (e.g., HMM, GMM, DNN)% For demonstration purposes, we'll cluster the MFCCs using k-means% Visualize clustered MFCCs
figure;
for i = 1:numClustersscatter(T(idx == i), idx(idx == i), 'DisplayName', sprintf('Cluster %d', i));hold on;
end
title('Clustered MFCC Features');
xlabel('Time (s)');
ylabel('Cluster Index');
legend show;

代码说明

语音信号加载与预处理
audioread 函数加载语音信号文件。此处假设输入的是一个.wav文件,名字为speech_sample.wav。
信号被归一化处理,以确保幅度范围在 -1 到 1 之间。
参数设置
窗口长度设置为25毫秒,这在语音处理中是常见的选择,足够短以捕捉语音中的瞬态变化,又足够长以包含足够多的频率信息。
重叠部分设置为15毫秒,有助于提高时间分辨率并平滑过渡。
FFT长度设置为接近窗口长度的2的次幂,确保FFT计算效率。
STFT计算
使用MATLAB的stft函数计算短时傅里叶变换(STFT)。
生成的S是复数矩阵,其大小为[频率分辨率 x 时间分辨率]。
magnitudeSpectrogram 计算STFT的幅度谱,显示信号在频率和时间上的变化。
MFCC计算
Mel频率倒谱系数(MFCCs)是语音识别中常用的特征。
mfcc函数基于Mel尺度对STFT幅度谱进行滤波,提取语音的低维特征。
这部分提取的MFCC特征将用于语音识别模型中。
结果可视化
绘制了原始语音信号的时域图像。
绘制了幅度谱图,通过二维图展示频谱随时间的变化(时频图)。
绘制了MFCC系数随时间的变化,帮助分析语音信号的低维特征。
语音识别应用示例
使用k-means聚类算法对提取的MFCC特征进行聚类,模拟语音识别中的特征分类过程。
聚类结果被可视化展示,不同颜色代表不同的聚类(可能代表不同的语音音素或单词)

扩展(创新点)

这个MATLAB代码可以进一步扩展,用于更多复杂的语音处理任务。例如,结合深度学习模型(如卷积神经网络,CNN)来进行语音分类或识别任务,或者引入隐马尔可夫模型(HMM)进行时间序列的建模。

效果

在这里插入图片描述

完整代码获取

关注下方卡片公众号,回复"STFT"获取完整代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413904.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在银河麒麟操作系统中为文件加锁与解锁

如何在银河麒麟操作系统中为文件加锁与解锁 1、加锁2、解锁 💖The Begin💖点点关注,收藏不迷路💖 1、加锁 若要为文件加锁,防止被修改或删除,可以使用chattr命令并加上i选项。这需要root权限。 命令&…

华为OD机试真题 - 多段数据压缩(Java/Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Java/Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX…

网络基础+Socket

目录 下图为数据分用的过程 认识IP地址 认识MAC地址 认识端口号 网络字节序 sockaddr结构 Makefile新写法 下图为数据分用的过程 认识IP地址 IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4 IP地址是在IP协议中, 用来…

js实现3d拖拽环绕旋转

js实现拖动节点围绕圆心转动 1.使用transform属性,将圆环放倒展示为椭圆 圆环上有不同的色彩,在转动的同时,需要让圆环也转动,所以圆环不能是椭圆,而是圆形,这样在转动的时候,改变rotate&…

开源 AI 智能名片 S2B2C 商城小程序在现代商业中的创新与启示

摘要:本文通过分析一种以 9.9 元裙子为代表的独特商业模式,探讨了其背后的现金流、产品和渠道组合策略,以及开源 AI 智能名片 S2B2C 商城小程序在其中可能发挥的作用和带来的启示。 一、引言 在当今竞争激烈的商业环境中,企业不断…

认知杂谈41

今天分享 有人说的一段争议性的话 I I 贫富根源在观念 I 你知道不?穷人穷啊,好多时候是因为他们自己还有家里好几代人呢,都陷在一种不对的想法里出不来,还觉得这样挺好,就一直这么过下去了。可富人的那些想法呢&am…

3127.构造相同颜色的正方形

1.题目描述 给你一个二维 3 x 3 的矩阵 grid ,每个格子都是一个字符,要么是 B ,要么是 W 。字符 W 表示白色,字符 B 表示黑色。 你的任务是改变 至多一个 格子的颜色,使得矩阵中存在一个 2 x 2 颜色完全相同的正方形。…

YOLO实践

一. 环境安装 参考视频 Pytorch环境安装细节 pytorch安装:一个单独的环境中,能使用pip就尽量使用pip,实在有问题的情况,例如没有合适的编译好的系统版本的安装包,再使用conda进行安装,不要来回混淆CUDA是…

数据结构---顺序表---单链表

目录 一、什么是程序? 程序 数据结构 算法 二、一个程序是否优秀的两个标准 2.1.时间复杂度 2.2.空间复杂度 三、数据结构 3.1.数据结构间的关系 1.逻辑结构 1)线性关系 2)非线性关系 2.存储结构 1)顺序存储结构 …

exit_hook和setcontext

文章目录 exit_hook概述例题:思路:利用:setcontextglibc-2.27以及 之前glibc-2.29以及之后:exit_hook 概述 大佬文章:exit_hook在pwn题中的应用 - 不会修电脑 - 博客园 (cnblogs.com) exit_hook :是程序在执行exit函数时,会去该位置拿一个函数指针,进而执行的一段程序…

【单片机开发】IAP技术详解及应用

【前言】 在单片机开发过程中,程序的烧录是一个至关重要的环节。随着技术的不断演进,单片机烧录方式也日益多样化。 【单片机开发】单片机的烧录方式详解(ICP、IAP、ISP)-CSDN博客文章浏览阅读775次,点赞14次&#x…

低空经济概念火爆:无人机飞手人才培养先行

随着科技的飞速发展,低空经济作为新兴的经济形态,正以前所未有的速度崛起,成为推动产业升级和经济发展的新引擎。无人机作为低空经济的重要组成部分,其应用领域已从最初的军事侦察、航拍扩展到农业植保、物流配送、环境监测、应急…

Question mutiple pdf‘s using openai, pinecone, langchain

题意:使用 OpenAI、Pinecone 和 LangChain 对多个 PDF 文件进行提问。 问题背景: I am trying to ask questions against a multiple pdf using pinecone and openAI but I dont know how to. 我正在尝试使用 Pinecone 和 OpenAI 对多个 PDF 文件进行提…

【计算机组成原理】计算机系统的层次结构——计算机软件

计算机系统的层次结构 导读一、计算机软件的分类二、计算机语言三、计算机系统的层次结构3.1 从计算机语言的角度来理解多级层次结构3.2 计算机层次之间的关系3.3 指令集体系结构(ISA) 结语 导读 大家好,很高兴又和大家见面啦!&a…

市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1

目录 一、简介 二、TFT-LCD驱动系统概述 (一)系统概述 (二)设计要点 二、扫描驱动电路设计 (一)概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 (二&#xff09…

多目标应用:基于MOPSO的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

Ubuntu上qt使用SSH样式表

SSH样式表 如果学习过web的同学都知道,我们在学习HTML的时候会用到样式表,我们使用它来更改我们的颜色、大小、背景等等。上到后面,老师会说:我们如果在HTML文件中编辑太多的样式,就会让代码看起来非常的繁琐&#xf…

学习计算机网络

a类0~127,b类128~191,c类192~223 网络地址:看子网掩码,分网络位和主机位,后面是主机位,主机位全部为0,网络地址。 直接广播地址:看子网掩码,分网络位和主机位&#xff…

自建一款开源音乐服务-Navidrome

自建一款开源音乐服务-Navidrome Navidrome,一个开源的音乐服务器和播放器,提供了一个优雅且功能丰富的解决方案,让你的音乐库无论在何处都能触手可及。本文将带你一步步搭建自己的Navidrome音乐服务器,让你的音乐生活更加自由和…

【Qt】关于QMenuBar创建方式的讨论

关于QMenuBar创建方式的讨论 如果在创建项目的时候,没有勾选自动生成ui文件,此时上述代码是正确的;而如果勾选了自动生成ui文件,上述代码则会出现内存泄漏的问题。因为Qt已经生成了一个QMenuBar了 由于之前程序已经自己创建好了一…