【语音分析】基于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
标签:558,win,len,wlen,源码,语音,短时,inc 来源: https://blog.51cto.com/u_15287606/2977614