Matlab提取MFCC特征参数

一、基础概念:

1. 采样频率

是指1秒钟,取样的次数。 采样位数是指一次采样所占的位数。 采样频率越高可采集的音频频率范围越宽,比如一个音乐中有2kHZ的频率成分,如果你用1kHZ去采样,那2khz的成分就会被丢失,理论上    说采样率和原声越接近

2. 脉冲响应 (impulse response)
在一个输入上施加一个脉冲函数引起的时间响应。在信号与系统学科中,冲激响应(或叫脉冲响应)一般是指系统在输入为单位冲激函数时的输出(响应)。对于连续时间系统来说,冲激响应一般用函数h(t)来表示。对于无随机噪声的确定性线性系统,当输入信号为一脉冲函数 δ(t) 时,系统的输出响应 h(t)称为脉冲响应函数。

3. 归一化
是一种无量纲处理手段,使物理系统数值的绝对值变成某种相对值关系。简化计算,缩小量值的有效办法。例如,滤波器中各个频率值以截止频率作归一化后,频率都是截止频率的相对值,没有了量纲。阻抗以电源内阻作归一化后,各个阻抗都成了一种相对阻抗值,“欧姆”这个量纲也没有了。等各种运算都结束后,反归一化一切都复原了。信号处理工具箱中经常使用的是nyquist频率,它被定义为采样频率的二分之一,在滤波器的阶数选择和设计中的截止频率均使用nyquist频率进行归一化处理。例如对于一个采样频率为1000hz的系统,400hz的归一化频率就为400/500=0.8。归一化频率范围在[0,1]之间。如果将归一化频率转换为角频率,则将归一化频率乘以2*pi;如果将归一化频率转换为hz,则将归一化频率乘以采样频率的一半。越高越好,音乐越接近真实,但硬件的成本越高。

 4. 傅里叶变换
傅里叶变换

 5. 数字滤波器
是一个离 散时间系统(按预定的算法,将输入离散时间信号转换为所要求的输出离散时间信号的特定功能装置)
原理数字滤波器

6. 根奈奎斯特理论,只有采样频率高于原始信号最高频率的两倍时,才能把数字信号表示的信号还原成为原来信号。


7.同态系统(homomorphic system)
 通过非线性变换将非线性组合信号变换为线性组合,便于进行线性处理的一类系统的总称。

8.Mel刻度

The mel scale, named by Stevens, Volkmann, and Newman in 1937,[1] is a perceptual scale of pitches judged by listeners to be equal in distance from one another. The reference point between this scale and normal frequency measurement is defined by assigning a perceptual pitch of 1000 mels to a 1000 Hz tone, 40 dB above the listener's threshold. Above about 500 Hz, increasingly large intervals are judged by listeners to produce equal pitch increments. As a result, four octaves on the hertz scale above 500 Hz are judged to comprise about two octaves on the mel scale. The name mel comes from the word melody to indicate that the scale is based on pitch comparisons.

A popular formula to convert f {\displaystyle f} hertz into m {\displaystyle m} mel is:[2]




9.吉布斯效应
将具有不连续点的周期函数(如矩形脉冲)进行傅立叶级数展开后,选取有限项进行合成。当选取的项数越多,在所合成的波形中出现的峰起越靠近原信号的不连续点。当选取的项数很大时,该峰起值趋于一个常数,大约等于总跳变值的9%。这种现象称为吉布斯效应。

10.语音产生的过程
包括三部分:激励模型,声道模型以及辐射模型,声道模型的模拟用频谱,即采用同态分析来分离,得到声道模型的参数。

11.解卷过程
语音的产生用源、滤波器模型来表示,即把声带振动看作激励源e(n),把声道看成一个滤波器h(n),两者在时域进行卷积,得到语音信号s(n)。为了更好地处理语音,则需要分析s(n)以分别得到e(n)和h(n),这个过程称为解卷过程。

12.包络信号
频域信号,可以拆分成两部分的乘积:频谱的包络和频谱的细节。频谱的峰值即为共振峰, 它决定了信号频域的包络,是辨别声音的重要信息,所以进行倒谱分析目的就是获得频谱的包络信息。包络部分对应的是频谱的低频信息,而细节部分对应的是频谱 的高频信息。倒谱分析已经将两部分对应的时域信号的卷积关系转化为了线性加关系,所以只需要将倒谱通过一个低通滤波器即可获得包络部分对应的时域信号h’ (t)。

13.频谱包络
频谱包络指的是频谱是许多不同频率的集合,形成一个很宽的频率范围;不同的频率其振幅可能不同。将不同频率的振幅最高点连结起来形成的曲线,就叫频谱包络线。

14.卷积运算
卷积是分析数学中一种重要的运算。
设:f(x),g(x)是R1上的两个可积函数,作积分:
                                                       
可以证明,关于几乎所有的实数x,上述积分是存在的。这样,随着x的不同取值,这个积分就定义了一个新函数h(x),称为函数f与g的卷积,记为h(x)=(f*g)(x)。
卷积与傅里叶变换有着密切的关系。利用一点性质,即两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,能使傅里叶分析中许多问题的处理得到简化。



二、源码以及详细注释

function getmfcc= MFCC2par( x,fs)
 %=========================================================
 % 提取MFCC特征参数
 % 无去噪及端点检测
 % Input:音频数据x,采样率fs
 % Output:(N,M)大小的特征参数矩阵  其中N为分帧个数,M为特征维度
 % 特征参数:M=24 倒谱系数12维,一阶差分12维
 %=========================================================
tic
%[x fs]=wavread(sound);
%取单声道信号
[~,etmp]=size(x);
if (etmp==2)
x=x(:,1);
end

%归一化mel滤波器组系数

bank=melbankm(24,256,fs,0,0.5,'m');%Mel滤波器的阶数为24,fft变换的长度为256,采样频率为8000Hz  

bank=full(bank);

bank=bank/max(bank(:));%[24*129]

 %设定DCT系数
 
for k=1:12

n=0:23;

dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));

end

%归一化倒谱提升窗口

w=1+6*sin(pi*[1:12]./12);

w=w/max(w);


%预加重滤波器

xx=double(x);

xx=filter([1-0.9375],1,xx);%预加重

xx=enframe(xx,256,80);%对x 256点分为一帧

%计算每帧的MFCC参数

for i=1:size(xx,1)

y=xx(i,:);%取一帧数据

s=y'.*hamming(256);

t=abs(fft(s));%fft快速傅立叶变换  幅度谱

t=t.^2; %能量谱

%对fft参数进行mel滤波取对数再计算倒谱
c1=dctcoef*log(bank*t(1:129));%对能量谱滤波及DCT %t(1:129)对一帧的前128个数(帧移为128)

c2=c1.*w';%归一化倒谱

%mfcc参数

m(i,:)=c2';

end

%求取一阶差分系数

dtm=zeros(size(m));

for i=3:size(m,1)-2

dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);

end

dtm=dtm/3;

%合并mfcc参数和一阶差分mfcc参数

ccc=[m dtm];

%去除首尾两帧,因为这两帧的一阶差分参数为0
ccc=ccc(3:size(m,1)-2,:);

getmfcc=ccc;%返回特征值
'MFCC特征参数提取时长'
toc

% subplot(2,1,1)
% plot(ccc(100,:));
% hold on
% plot(ccc(200,:),'r');
% plot(ccc(300,:),'g');
% plot(ccc(400,:),'y');
% plot(ccc(500,:),'b');
% xlabel('维数');
% ylabel('幅值');
% title('帧数100->500');
% subplot(2,1,2)
% plot(ccc(:,1));
% hold on
% plot(ccc(:,2),'r');
% plot(ccc(:,3),'g');
% plot(ccc(:,5),'y');
% plot(ccc(:,7),'b');
% xlabel('帧数');
% ylabel('幅值');
% title('维数1->7')

% subplot(2,1,1)
% ccc_1=ccc(:,1);
% plot(ccc_1);title('MFCC');ylabel('幅值');
% [h,w]=size(ccc);
% A=size(ccc);
% subplot(212) 
% plot([1,w],A);
% xlabel('维数');
% ylabel('幅值');
% title('维数与幅值的关系')
end




(ps: 改格式改的没脾气。。。这个坑一样的编辑器)

你可能感兴趣的:(声纹识别)