✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
采用能够反映人对语音的感知特性的Mel频率倒谱系数(MFCC)作为特征参数,以及为避免时间规整问题采用矢量量化技术开发的说话人识别系统.MFCC主要的是模拟人耳的听觉过程,相对于其它参数它对语音波形的变化不敏感,更加稳定,系统取得很好的识别结果,实验表明系统训练和识别的计算量和存储量都比较低.
⛄ 部分代码
function c=melcepst(s,fs)
%mel 倒谱计算,仿照的是voicebox的写法简化了
if nargin<2 fs=8000; end
w='M'; %汉明窗
nc=12; %mfcc维数
p=floor(3*log(fs)); %滤波器个数
n=pow2(floor(log2(0.03*fs))); %n是一帧FFT后数据的长度
fh=0.5; %最高频率已经归一化处理了 fs/2
fl=0; %一般都是0
inc=floor(n/2); %帧移
if length(w)==0 %如果没有设计窗函数,默认汉明窗
w='M';
end
z=enframe(s,hamming(n),inc); %分帧处理,汉明窗加窗
f=rfft(z.'); %实数的快速傅里叶变换
[m,a,b]=melbankm(p,n,fs,fl,fh,w); % m为滤波器的频域响应
%mn the lowest fft bin with a non-zero coefficient
%mx the highest fft bin with a non-zero coefficient
pw=f(a:b,:).*conj(f(a:b,:)); %计算帧能量
pth=max(pw(:))*1E-6; %最大帧能量*10^-6
ath=sqrt(pth);
y=log(max(m*abs(f(a:b,:)),ath)); %求出filters act in the absolute magnitude domain (default)
c=rdct(y).'; %实数的离散余弦变换
nf=size(c,1);
nc=nc+1; %得到13维系数
if p>nc
c(:,nc+1:end)=[]; % 当滤波器个数比所需维数多的时候,就将后面滤波器获得的参数删去
elseif p<nc
c=[c zeros(nf,nc-p)]; %滤波器个数少的时候,用0补齐
end
%得到 mel cepstrum output: one frame per row
%例如用了Rec语音检测,得到c 337*13维;将语音分成337帧,每一行得到13个特征向量表示这一帧
⛄ 运行结果
⛄ 参考文献
[1]王伟, and 邓辉文. "基于MFCC参数和VQ的说话人识别系统." 第四届全国信息获取与处理学术会议 0.