声音识别 声音分类 算法实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 分类算法设计
– GMM,HMM,SVM,KNN,ANN...
• 测试和决策
特征提取
%读取声音文件 wav= wavread(data.filenames{i_files},[1 307712]); eg. 200个文件 i_files= 1:200 307712是提取的样本数(限制读取的长度,约28s) % 要提取的MFCC系数个数 num_ceps_coeffs = 20; c.fs = 11025; %采样频率 % 设置每帧大小(包含样本数) c.seg_size = 1024; c.hop_size = 512; %% c.seg_size-交叠部分=c.hop_size
分类算法设计(GMM示例)
ncentres = 16;% 高斯分量个数 input_dim = 16; %特征维数 % 设置混合模型 mix = gmm(input_dim, ncentres, 'diag'); % 特征数据输入 siz=600; features = zeros(siz,input_dim); for k=1:siz for j=1:input_dim features(k,j)=data.feat.mfcc(i_files,j,k); end end
分类算法设计(GMM示例)
% 初始化模型参数 mix = gmminit(mix, features, options); options(14) = 20;% 迭代次数. [mix, options, errlog]=gmmem(mix, features, options); Gmmdata(i_files)=mix;
特征提取(MFCC)
% 帧数计算 num_segments = floor((length(wav)-c.seg_size)/c.hop_size)+1; % 初始化功率谱矩阵 P = zeros(c.seg_wk.baidu.comize/2+1,num_segments); % 设置窗函数 c.w = 0.5*(1-cos(2*pi*(0:c.seg_size-1)/(c.seg_size-1)))';%汉宁窗函数 % 逐帧做FFT for i_p = 1:num_segments, idx = (1:c.seg_size)+(i_p-1)*c.hop_size; x = abs(fft(wav(idx).*c.w)/sum(c.w)*2).^2; P(:,i_p) = x(1:end/2+1);%工程实际中经常只用单边功率谱 end
特征提取
M = zeros(c.num_filt,num_segments); %初始化 for i_m = 1:num_segments, M(:,i_m) = c.mel_filter*P(:,i_m);% 通过三角滤波器 end % 做对数变换 M(M<1)=1; M = 10*log10(M); %DCT函数 c.DCT = 1/sqrt(c.num_filt/2) * ... cos((0:num_ceps_coeffs-1)'*(0.5:c.num_filt)*pi/c.num_filt); c.DCT(1,:) = c.DCT(1,:)*sqrt(2)/2; %%离散余弦变换 mfcc= c.DCT * M;
模型框架
图1
基 于 GMM 的 生 态 环 境 声 音 识 别 系 统
生态环境声音信号 预处理 前 端 处 理
训练样本 特征提取
训练
测试样本 特征提取
识别
高斯混合模型 判决规则 投票 识别结果
设计模块
• 预处理
– 使用cooledit转换格式/声道,或用Matlab处理
• 特征提取
– 训练数据的特征提取 – 测试数据的特征提取 – 不同的特征提取可以分开或合在一起设计
c.num_filt = 36; %% Mel频带数 f = linspace(0,c.fs/2,c.seg_size/2+1);%初始平均划分f mel = log(1+f/700)*1127.01048; %1127.01048=2595/log10 ,Matlab中 log=ln mel_idx = linspace(0,mel(end),c.num_filt+2);%初始平均划分mel(38个点) f_idx = zeros(c.num_filt+2,1); for i=1:c.num_filt+2, %% f_idx(i)存的是mel中与mel_idx(i)最近的元素的地址 [tmp f_idx(i)] = min(abs(mel - mel_idx(i)));%近似的平均划分 end freqs = f(f_idx); h = 2./(freqs(3:c.num_filt+2)-freqs(1:c.num_filt));%%三角的高度 c.mel_filter = zeros(c.num_filt,c.seg_size/2+1); for i=1:c.num_filt, c.mel_filter(i,:) =(f > freqs(i) & f <= freqs(i+1)).* ... h(i).*(f-freqs(i))/(freqs(i+1)-freqs(i)) + ... (f > freqs(i+1) & f < freqs(i+2)).* ... h(i).*(freqs(i+2)-f)/(freqs(i+2)-freqs(i+1)); end