% Author: Chen QiangQiang(2434302354@qq.com)
% Date : 2023年3月22日
% %% 计算mfcc、lpcc、lpl、cfcc等多个特征
% clear;close all;clc
% % 添加相应的文件到路径
% addpath(genpath('CQCC、LPCC、MFCC、PLP'))
%
% file='E:\DAN\2023\3月\20230312\Phoneme_dataset\female\consonants\b\';%声音信号所在文件夹
% file1=strcat(file,'*.wav');%strcat:连接多个字符串
% file2=dir(file1);%获取文件夹下所有的wav文件(dir:读取文件夹下所有文件和文件夹/特定后缀的文件)
% n=length(file2);
% for i=1:n
% file3=strcat(file,file2(i).name);
% [x,fs] = audioread(file3);
% x=jiangzao(x);
% x=x(:,1);
%
% cfcccell{i}=cfcc(x);
% mfcccell{i}=mfcc(x,fs);
% lpcccell{i}=lpccs(x,fs) ;
% plpcell{i}=plp(x,fs);
% end
%% 计算mfcc,并且随机森林分类
clear;close all;clc
% 添加相应的文件到路径
addpath(genpath('SubCodes'))
sb=["female","kids","male"];
RFDMats=[];
for s=1:length(sb)
p = genpath(".\Phoneme_dataset\"+sb(s)+"\consonants");% 获得文件夹data下所有子文件的路径,这些路径存在字符串p中,以';'分割
length_p = size(p,2);%字符串p的长度
path = {};%建立一个单元数组,数组的每个单元中包含一个目录
temp = [];
for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中
if p(i) ~= ';'
temp = [temp p(i)];
else
temp = [temp '\']; %在路径的最后加入 '\'
path = [path ; temp];
temp = [];
end
end
clear p length_p temp;
%至此获得data文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,存于数组path中。
%下面是逐一文件夹中读取音频
file_num = size(path,1);% 子文件夹的个数
count=1;
for i = 1:file_num
file_path = path{i}; % 音频文件夹路径
sound_path_list = dir(strcat(file_path,'*.wav'));
sound_num = length(sound_path_list); %该文件夹中音频数量
if sound_num > 0
for j = 1:sound_num
sound_name = sound_path_list(j).name;% 音频名
[x,fs] = audioread(strcat(file_path,sound_name));% 读取音频文件
% x=jiangzao(x);% 对音频文件降噪处理
RFD{1,count}=reshape(rmmissing(mfccs(x,fs)),1,[]);% 计算mfcc特征
len(count)=length(reshape(rmmissing(mfccs(x,fs)),1,[]));
RFD{2,count}=i;
fprintf('%d %d %s\n',i,j,strcat(file_path,sound_name));% 显示正在处理的路径和音频名
count=count+1;
end
end
end
col=200000;
%%% 构造随机森林训练的数据,每行代表一个.wav文件的mfcc特征,最后一列代表标签,即音标,为了处理,将音标和数字对应.
%%% 较短的向量,用0填充
RFDMat=zeros(length(RFD),col+1);
for i=1:length(RFD)
tmp=RFD{1,i};
for j=1:length(tmp)
RFDMat(i,j)=tmp(j);
end
RFDMat(i,col+1)=RFD{2,i};
end
RFDMats=[RFDMats;RFDMat];
end
%% 构造随机森林进行分类
RFDMat=RFDMats;
% 数据按3:7比例随机分为训练集和测试集
Data = RFDMat(:,1:col); %对数据集实例化
labels=RFDMat(:,col+1);
num_test = i*0.1;
[ndata, D] = size(Data); %ndata表示数据集样本数,D是特征数
R = randperm(ndata);%1到ndata这些数随机打乱得到的一个随机数字序列作为索引
Xtest = Data(R(1:num_test),:);
test_labels = double(labels(R(1:num_test),:)); % 设置测试集样本标签
R(1:num_test) = [];
Xtrain = Data(R,:);
num_train = size(Xtrain,1);%num_train:训练样本数
train_labels = double(labels(R,:));% 设置训练集样本标签
numtrees=100;
minleaf=1;
% 构建随机森林训练
b = TreeBagger(numtrees,Xtrain,train_labels,'Method','classification','OOBPredictorImportance','On','MinLeafSize',minleaf);
% % 模型性能
% subplot(2,2,1)
% plot(oobError(b))
% xlabel('Number of Grown Trees')
% ylabel('Out-of-Bag Classification Error')
%
% b.DefaultYfit = '';
% subplot(2,2,2)
% plot(oobError(b))
% xlabel('Number of Grown Trees')
% ylabel('Out-of-Bag Error Excluding In-Bag Observations')
%
% subplot(2,2,3)
% bar(b.OOBPermutedPredictorDeltaError)
% xlabel('Feature Index')
% ylabel('Out-of-Bag Feature Importance')
%
% % 利用模型进行预测
pre_label = predict(b, Xtest);
pre_labels=[];
for i=1:length(pre_label)
pre_labels=[pre_labels;str2num(pre_label{i})];
end
%
% subplot(2,2,4)
% cm = confusionchart(test_labels,pre_labels);
% cm.Title = 'Iris Flower Classification';
% cm.RowSummary = 'row-normalized';
% cm.ColumnSummary = 'column-normalized';
% 计算测试集的预测精度
for ii=1:length(pre_labels)
if pre_labels(ii) == test_labels(ii)
count(ii)=1;
else
count(ii)=0;
end
end
acc=sum(count)/length(pre_labels)
没有合适的资源?快使用搜索试试~ 我知道了~
MATLAB提取MFCC、GFCC、LPCC等特征,使用随机森林分类

共3个文件
m:3个

需积分: 5 58 浏览量
2023-04-02
20:51:38
上传
评论 1
收藏 4KB RAR 举报
温馨提示
MATLAB首先对语音进行不同的非线性自适应时频分析的去噪,然后提取MFCC、GFCC、LPCC等特征,最后通过随机森林,对音标进行分类注1:音频文件数据集;注2:一行代码自动添加文件和子文件到路径;
资源推荐
资源详情
资源评论






















收起资源包目录




共 3 条
- 1
资源评论



20230330
- 粉丝: 0
- 资源: 13
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
