基于FPGA的说话人识别系统,包含原理图、源代码
最小距离)==============####%%
clc;clear;
%============1 流程说明========%
%对要进行辨认的测试说话人提取平均特征向量,和训练库中的每个模板特征矢量进行距离比较,我们把与测试说话人具有最小距离的说话人作为目标说话人。
%==========2 符号说明===========%
% N:说话人数;K: 特征矢量的长度;
% TZV:N*K阶的训练特征矢量矩阵,第nn行表示第nn个说话人的模型特征矢量;
% DTH: N长的训练判决门限向量,第nn个元素代表第nn个说话人的训练判决门限;
% S1: 说话人1的语音信号;S2:说话人2的语音信号;......;SN: 说话人N的语音信号
%=========3 主程序=======%
%===根据训练数据,求出各个说话人的训练特征矢量和训练判决门限===%
N=2;
load A1 A1;
load A2 A2;
TIMES=10;%训练次数为10
[mtzh1,p1]=xunlian(A1,TIMES);%调用训练函数,得说话人的模型特征矢量和模型判决门限
TZV(1,:)=mtzh1;
[mtzh2,p2]=xunlian(A2,TIMES);
TZV(2,:)=mtzh2;
K=length(mtzh1);
%===说话人说话,进行辨认===%
%==辨认说话人1==%
S1=wavread(f:\speakerzx3\zx316);%%说话人1说话后语音信息被存储,用函数读出该语音信号
identify(S1,TZV,N,K)
%==辨认说话人2==%
S2=wavread(f:\speakerbb1\bb13);%%说话人2说话后语音信息被存储,用函数读出该语音信号
identify(S2,TZV,N,K)
3 .子函数1——输入训练语音数据,输出训练所得模式训练特征矢量及判决阈值
function [mtzh,p]=xunlian(A,TIMES)
%===输入为训练次数TIMES和每次的训练语音信号的合集A;输出为训练所得模型特征矢量及模型判决门限===%
for tt=1:TIMES %10指每个说话人的训练次数
avertzvector(tt,:)=tzhvf(A{tt});
end
mtzh=sum(avertzvector)/TIMES;
%%==========确定判决门限dehood1=======%%
for ts=1:TIMES
chavec=mtzh-avertzvector(ts,:);
wucha(ts)=chavec*chavec/length(mtzh);
end
p=max(wucha);
4. 子函数2——特征特取子函数
输入语音信号,输出特征矢量
%===提取输入语音信息的特征矢量===%
function avertzvector=tzhvf(x1)
lent1=length(x1);
%%=======预加重更新x1=======%%
u=0.9375;
for num=2:lent1
x1(num-1)=x1(num)-u*x1(num-1);
end
%%=======将语音信号进行分帧得y1,加窗得winy1=======%%
framelen=256;%帧长
shift=128;%帧移
numframe=ceil(lent1/shift)-1;%%帧数
for numw=1:framelen
hw(numw)=0.54-0.46*cos(2*pi*(numw-1)/(framelen-1));%%汉明窗
end
for num1=1:numframe
a=(num1-1)*framelen/2+1;
b=(num1-1)*framelen/2+framelen;
if b=lent1
y1(num1,:)=x1(a:b);
else
y1(num1,:)=[(x1(a:lent1)),zeros(1,b-lent1)];
end
winy1(num1,:)=y1(num1,:).*hw;%%分帧加窗后的数据
end
%%=========求信号的短时能量e1==========%%
e1=sum(winy1.^2,2);%%sum(x,2)表示将矩阵x横向相加,得到每行的和,为一个列向量
%%========利用短时能量进行端点检测得到起始帧号startnum和结束帧号endnum==========%%
menxian=9e-04;
duliang=32;
for startnum=1:length(e1)
if e1(startnum)>menxian
indc=find(e1(startnum+1:startnum+duliang)>menxian);
if length(indc)/duliang>=3/4
break;
end
end
end
for endnum=length(e1):-1:1
if e1(endnum)>menxian
indc=find(e1(endnum-duliang:endnum-1)>menxian);
if length(indc)/duliang>=3/4
break;
end
end
end
data1=winy1(startnum:endnum,:);%%data为去除无声段的语音数据(分帧加窗后的)
%%===========短时傅里叶变换=============%%
newnumframe=endnum-startnum+1;
for num2=1:newnumframe
STFTdata1(num2,:)=abs(fft(data1(num2,:),framelen));
%SFTwindata1(num2,:)=abs(windata1(num2,:)*exp(-1j*2*pi/framelen*(0:255)*(0:255)));
end
%%=======对每帧求特征向量=========%%
jiange=4;%每四个点找一次频谱幅度最大值
for k=1:newnumframe
for kk=0:framelen/jiange-1
aa=jiange*kk+1;
bb=jiange*kk+jiange;
[maximum,ind]=max(STFTdata1(k,aa:bb));
tzvector(k,kk+1)=ind+jiange*kk;%%特征向量
end
end
avertzvector=sum(tzvector)/newnumframe;%语音帧平均特征矢量
5. 子函数3——说话人确认子函数
输入测试语音,输出确认结果
function decisionf(S,TZV,DTH,nn,K)
%判决子函数,输入说话人语音S,模板特征向量矩阵TZV,模板判决门限DTH,说话人数N,特征向量长度K;输出判决结果
avtzvS=tzhvf(S);%%调用子函数tzhvf提取该语音信息的特征矢量
if (TZV(nn,:)-avtzvS)*(T
语音识别系统 matlab FPGA 最小距离算法 相关文章:
- 一种ARM处理器非特定人语音识别系统的设计方案(10-22)
- 基于ARM的实时语音识别系统在家庭监护机器人的实现(05-29)
- 基于AVR单片机的语音识别系统设计(08-08)
- 基于SPCE061A的语音识别系统的设计(01-07)
- 基于DSP和MATLAB的语音数据采集和处理系统(05-13)
- 简化“算法到C代码”是软件业的一项挑战(07-04)