大佬教程收集整理的这篇文章主要介绍了【语音分析】基于matlab语音短时频域分析【含Matlab源码 558期】,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
原理 1 短时傅里叶变换 短时傅里叶分析(Short Time Fourier Analysis,STFA)适用于分析缓慢时变信号的频谱分析,在语音分析处理中已经得到广泛应用。其方法是先将语音信号分帧,再将各帧进行傅里叶变换。每一帧语音信号可以被认为是从各个不同的平稳信号波形中截取出来的,各帧语音的短时频谱就是各个平稳信号波形频谱的近似。
由于语音信号是短时平稳的,因此可以对语音进行分帧处理,计算某一帧的傅里叶变换,这样得到的就是短时傅里叶变换。其定义为
③窗长越短,时间分辨率越高,但频率分辨率相应降低。例如,采用短窗可以清楚地观察到共振峰在不同基音周期的变化情况,但基频以及谐波的精细结构在短时频谱图上消失了。 ④由于时间分辨率和频率分辨率的相互矛盾关系,在进行短时傅里叶变换时,应根据分析的目的来折中选择窗长。2 语谱图表示与实现方法 语谱仪是把语音的电信号送人一组频率依次相接的窄带滤波器中,各个窄带滤波器的输出经整流均方后按频率由低到高的顺序记录在一卷记录纸上。信号的强弱由记录在纸上的灰度来表示。如果某个滤波器输出的信号强,相应的记录将浓黑;反之,则浅淡一些。记录纸按照一定的速度旋转,相当于按不同的时间记录了相应的滤波器输出。由此得到的图形就是语音信号的语谱图,其水平方向是时间轴,垂直方向是频率轴,图上的灰度条纹代表各个时刻的语音短时谱。语谱图反映了语音信号的动态频谱特性,被称为可视语音。
clear all;
clc;
close all;
[x,fs]=audioread('audio.wav'); % 读入数据文件
wlen=256;
nfft=wlen;
win=hAnning(wlen);
inc=128; % 给出帧长和帧移
y=STFFT(x,win,nfft,inc); %求短时傅里叶变换
fn=size(y,2); %帧数
freq=(0:wlen/2)*fs/wlen; % 计算FFT后的频率刻度
frameTime=FrameTimeC(fn,wlen,inc,fs); % 计算每帧对应的时间
imagesc(frameTime,freq,20*log10(abs(y)+eps)); % 画出Y的图像
axis xy; ylabel('频率/Hz');xlabel('时间/s');
title('能量谱图');
function frameout=enframe(x,win,inC)
nx=length(x(:)); % 取数据长度
nwin=length(win); % 取窗长
if (nwin == 1) % 判断窗长是否为1,若为1,即表示没有设窗函数
len = win; % 是,帧长=win
else
len = nwin; % 否,帧长=窗长
end
if (nargin < 3) % 如果只有两个参数,设帧inc=帧长
inc = len;
end
nf = fix((nx-len+inC)/inc); % 计算帧数
frameout=zeros(nf,len); % 初始化
indf= inc*(0:(nf-1)).'; % 设置每帧在x中的位移量位置
inds = (1:len); % 每帧数据对应1:len
版本:2014a 完整代码或代写加1564658423
以上是大佬教程为你收集整理的【语音分析】基于matlab语音短时频域分析【含Matlab源码 558期】全部内容,希望文章能够帮你解决【语音分析】基于matlab语音短时频域分析【含Matlab源码 558期】所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。