function cc=mfcc(x) %%-------准备工作------------- %归一化mel滤波器组系数(24个窗) bank=melbankm2(24,256,8000,0,0.5,'m'); bank=full(bank); bank=bank/max(bank(:)); %DCT系数,12(欲求的mfcc个数)×24 for k=1:12 n=0:23; dctcoef(k,:)=cos(pi*k*(2*n+1)/(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(x,256,80); %计算每帧的MFCC参数 for i=1:size(xx,1) y=xx(i,:); s=y'.*hamming(256); t=abs(fft(s)); t=t.^2; c1=log(bank*t(1:129)); c1=dctcoef*c1; c2=c1.*w'; 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; %合并成帧数×24的特征向量矩阵 cc=[m dtm]; cc=cc(3:size(m,1)-2,:);
时间: 2023-12-07 17:02:47 浏览: 179
这是一个MATLAB函数,用于计算给定语音信号的MFCC(Mel Frequency Cepstral Coefficients)特征。该函数包括以下几个步骤:
1. 归一化mel滤波器组系数:使用melbankm2函数计算24个mel滤波器组的系数,然后将其归一化得到bank矩阵。
2. 计算DCT系数:使用cos函数计算12个DCT系数,每个系数包括24个元素。
3. 归一化的倒谱提升窗口:使用sin和cos函数计算出12个倒谱提升窗口系数w,然后将其归一化。
4. 预加重滤波器:使用filter函数对输入的语音信号进行预加重滤波。
5. 语音信号分帧:使用enframe函数将语音信号分帧,每帧大小为256,帧移为80。
6. 计算每帧的MFCC参数:对每帧进行以下计算:
- 使用hamming窗口函数加窗。
- 计算帧的功率谱,即对加窗后的信号进行FFT,然后取模平方。
- 将功率谱与mel滤波器组系数相乘,得到24个mel频率分量的能量。
- 对每个mel频率分量的能量取对数,然后使用DCT系数进行线性变换得到12个MFCC系数。
- 将MFCC系数与倒谱提升窗口系数相乘得到最终的MFCC特征向量。
7. 计算差分系数:使用差分算法计算每个MFCC系数的一阶差分系数,然后将MFCC系数和差分系数合并成一个24维的特征向量。
8. 去掉首尾的帧,得到特征向量矩阵cc。
需要注意的是,该函数使用了一些MATLAB内置函数和自定义函数,如melbankm2、enframe和hamming等,如果需要使用该函数,应先确保这些函数已经存在。
相关问题
function getmfcc= MFCC2par( x,fs)
这是一个 MATLAB 函数,用于将语音信号转换为 MFCC(Mel频率倒谱系数)特征向量。
函数名:`MFCC2par`
输入参数:
- `x`:语音信号向量
- `fs`:采样率
输出参数:
- `getmfcc`:MFCC特征向量
函数体:
由于该函数体缺失,无法提供进一步解释。但是,该函数的主要功能是计算MFCC特征向量,常见的计算方法包括对语音信号进行预处理(如预加重、分帧、加窗),计算每帧的功率谱密度、应用Mel滤波器组、进行离散余弦变换等步骤。最终得到的MFCC特征向量通常用于语音信号分类、识别等应用。
% ====== Load wave data and do feature extraction clc,clear waveDir='trainning\'; speakerData = dir(waveDir); %Matlab使用dir函数获得指定文件夹下的所有子文件夹和文件,并存放在在一种为文件结构体数组中. % dir函数可以有调用方式 % dir('.') 列出当前目录下所有子文件夹和文件 % dir('G:\Matlab') 列出指定目录下所有子文件夹和文件 % dir('*.m') 列出当前目录下符合正则表达式的文件夹和文件 % 得到的为结构体数组每个元素都是如下形式的结构体 % name -- filename % date -- modification date % bytes -- number of bytes allocated to the file % isdir -- 1 if name is a directory and 0 if not % datenum -- modification date as a MATLAB serial date number % 分别为文件名,修改日期,大小,是否为目录,Matlab特定的修改日期 % 可以提取出文件名以作读取和保存用. speakerData(1:2) = []; speakerNum=length(speakerData);%speakerNum:人数; % ====== Feature extraction fprintf('\n读取语音文件并进行特征提取... '); % cd('D:\MATLAB7\toolbox\dcpr\'); for i=1:speakerNum fprintf('\n正在提取第%d个人%s的特征\n', i, speakerData(i,1).name(1:end-4)); [y, fs]=audioread(['trainning\' speakerData(i,1).name]); epInSampleIndex = epdByVol(y, fs); % endpoint detection端点检测 y=y(epInSampleIndex(1):epInSampleIndex(2)); % silence is not used去除静音 speakerData(i).mfcc=wave2mfcc(y, fs); fprintf(' 完成!!'); end save speakerData speakerData; % Since feature extraction is slow, you can save the data for future use if the features are not changed. graph_MFCC; %由于特征提取速度慢,如果功能没有改变,可以保存供日后使用的数据, fprintf('\n'); clear all; fprintf('特征参数提取完成! \n\n请点击任意键继续...'); pause; % ====== GMM training fprintf('\n训练每个语者的高斯混合模型...\n\n'); load speakerData.mat gaussianNum=12; % No. of gaussians in a GMM高斯混合模型中的高斯个数 speakerNum=length(speakerData); for i=1:speakerNum fprintf('\n为第%d个语者%s训练GMM……\n', i,speakerData(i).name(1:end-4)); [speakerGmm(i).mu, speakerGmm(i).sigm,speakerGmm(i).c] = gmm_estimate(speakerData(i).mfcc,gaussianNum); fprintf(' 完成!!'); end fprintf('\n'); save speakerGmm speakerGmm; pause(10); clear all; fprintf('高斯混合模型训练结束! \n\n请点击任意键继续...'); pause; % ====== recognition fprintf('\n识别中...\n\n'); load speakerData;
### 加载波形数据并进行特征提取
为了处理音频文件,在 MATLAB 中可以使用 `audioread` 函数来读取音频文件的内容。此函数返回两个变量:一个是表示采样频率的数值,另一个是包含实际音频样本的数据向量。
```matlab
% 读取音频文件
[audioSignal, sampleRate] = audioread('example.wav');
```
对于特征提取部分,梅尔倒谱系数(MFCC)是一种广泛应用于语音识别系统的声学参数集。通过调用内置工具箱中的 `mfcc` 函数可以直接获取这些特征值[^3]。
```matlab
function features = extractFeatures(y, fs)
% 提取MFCC特征
coeffs = mfcc(y, fs);
% 返回特征
features = coeffs;
end
```
上述代码定义了一个名为 `extractFeatures` 的功能函数,它接收原始音频信号及其对应的采样率作为输入,并输出计算得到的 MFCC 特征矩阵。
### 高斯混合模型 (GMM) 训练过程详解
当准备好了训练所需的 MFCC 数据之后,下一步就是构建 GMM 来描述不同类别下的概率分布情况。这里采用的是对角协方差类型的多维高斯分量组成的混合密度网络结构[^2]。
```matlab
numComponents = 16; % 设置组件数量
gmmModel = fitgmdist(trainingData, numComponents, ...
'CovarianceType', 'diagonal');
```
这段脚本指定了要拟合到给定训练集中去的 GMM 组件数目为 16,并选择了简化形式——即假设各维度间相互独立从而使得协方差阵呈现对角线特性。这有助于减少过拟合并加快收敛速度。
完成模型建立后就可以利用其来进行未知测试样本分类预测操作了:
```matlab
testMFCC = extractMFCC(testSpeech);
logLikelihoods = zeros(1, numComponents);
for i = 1:numComponents
logLikelihoods(i) = sum(log(pdf(gmmModel, testMFCC)));
end
[~, predictedIndex] = max(logLikelihoods);
predictedLabel = gmmModel.ComponentProportion(predictedIndex);
```
以上程序段展示了如何根据已知条件评估每一个可能类别的似然度得分进而决定最终归属标签的过程。值得注意的是这里的 `pdf()` 函数是用来求解特定观测条件下某一分布的概率密度估计值;而 `max()` 则帮助挑选出具有最高可能性的结果项。
阅读全文
相关推荐















