微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于FPGA的说话人识别系统,包含原理图、源代码

基于FPGA的说话人识别系统,包含原理图、源代码

时间:06-04 来源:互联网 点击:

最小距离)==============####%%

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top