男女声识别系统.docx
《男女声识别系统.docx》由会员分享,可在线阅读,更多相关《男女声识别系统.docx(12页珍藏版)》请在冰豆网上搜索。
男女声识别系统
男女声识别系统
摘要:
本文通过对男性和女性声音的语音特征的研究,发现男女声的基音频率存在较大的差异,并设计了基于基音频率分析的男女声识别系统。
男女声识别系统由以下三个模块电路构成:
话筒放大器,低通滤波器,半波整流电路,单片机测量控制模块。
话筒放大器采用NE5532P音前置芯片,对语音信号进行放大;八阶低通滤波器MAX293完成基音信号的提取;单片机STC12C5410AD实现频率测量和控制输出功能。
经仿真与电路实测,男女声的识别效果良好。
关键词:
男女声识别、基音频率、低通滤波器、单片机。
一、引言
人类基音的范围约为70~350Hz左右,由于生理结构的不同,男性与女性的声音呈现出不同的听觉特征,男声的基音频率大都在100—200HZ之间,而女声则在200—350HZ之间;在会话中,同一发音者的基音频率变化的统计结果,如图一所示。
女声与男声相比,前者的平均值、标准差都为后者的两倍左右。
不同发音者的基音频率分布如图二所示,在对数频率轴上男声,女声分别呈现正态分布,男声的基音频率的平均值和标准差分别为125HZ及其20HZ。
女声约为男声的2倍。
鉴于男女声存在基音频率的明显差异,基音频率可作为男女声识别的依据。
二、方案论证与比较
基于男女声基音频率的差异,男女声识别的实现可以通过基音频率的测量来实现。
基音频率的实现有多种方法。
如FFT分析、自相关分析等。
方案一:
基于FFT的短时频谱分析。
把语音信号数字化,即经AD采样量化之后,用FFT算法处理,得到信号的频谱,从而获得基音频率。
这种方法由于算法较复杂,数据处理量大,如用单片机来实现,编程复杂,运算速度慢,难以满足实时要求。
方案二:
滤波器基音提取技术。
利用低通滤波器滤除多次谐波及共振峰等高频成分,得到近似的基音信号,此法可以用硬件电路构成滤波器实现基音信号的粗略提取,避免了大量算法分析和数据处理,实现起来相当简单。
为了证明这种方法的有效性,我们用计算机声卡录制了近20名男女同学的单音、词组和句子的WAV文件,在MATLAB上编写程序进行仿真。
1.男女声信号通过400HZ低通滤波后的仿真波形比较。
我们将男女声信号经过八阶低通滤波器,其截止频率设定为400HZ。
仿真结果如图三所示。
从图形上我们可以看到:
通过400HZ的低通滤波器后,男声输出为约120HZ左右周期性信号(非单频正弦波);女声输出约250HZ左右周期性信号,其波形接近正弦波。
这说明经过400HZ低通滤波器后,女声声音主要由基音信号构成,而男性声音的非正弦性是由于其二次谐波及共振峰的存在的结果。
2.男女声信号通过200HZ低通滤波后的仿真波形比较。
我们将男声、女声输入信号经过八阶低通数字滤波器滤波,截止频率设定为200HZ。
男声、女声及其通过200HZ低通滤波后的波形如图四所示:
从上边的图形我们看出:
经过200HZ的低通滤波器,男声输出为较好的正弦波(基音信号),而女声基本上没有信号通过。
从MATLAB数据处理软件对采集信号分析的结果表明,用滤波器提取基音频率的方法完全可行。
我们在计算机上用这种方法编写了男女声识别软件,对男女声基音特征进行提取,实现了识别的仿真。
实验表明,在正常说话条件下,系统具有较高的识别率,仿真效果令人满意。
三、系统实现
1.设计思想与系统构成:
话筒
放大
200HZ
低频滤波
400HZ
低频滤波
单片机
整流
整流
LED
灯显示
话筒产生的语音信号很微弱,大约50mV左右,必须经过放大才能送往后级电路处理。
两个高阶低通滤波器分别工作在400HZ的截止频率和200HZ截止频率。
这主要是为了保证始终有一路信号是含谐波分量较少的近似基音信号。
整形电路把正弦波转化为矩形脉冲,送往单片机STC12C5010AD测量其周期。
单片机完成多次测量后,进行统计,作出男声还是女声的判断,送输出显示。
2.主要电路的设计与说明
A、话筒放大电路
通过用NE5532P芯片来实现语音放大,把微弱的语音信号放大的50倍左右。
如图所示,采用NE5532运算放大器作音频前置放大电路。
其优点是体积小、功耗小、一致性较好。
电路如下图所示:
B、低通滤波电路
采用MAX293可控截止频率8阶巴特沃夫低通滤波器,如图所示,则电路结构简单,外围元件少,截止频率可由外部时钟控制或由时钟输入端所接电容决定。
截止频率控制简单,且滤波效果好。
调试时,由外部时钟控制截止频率,调试完成后,可将滤波器的截止频率固定,即在时钟输入端(CLK)接一个一定大小的电容。
比较两个方案,方案二实现滤波简单方便,满足系统要求。
C、全整流电路
如图所示,U5A、U6A各组成一线性半波整流电路,而U5B、U6B各组成一加法电路。
U5A和U5B,U6A和U6B构成一线性全波整流电路。
D、单片机电路
把经过整流后的两路频率信号输入STC12C5410AD进行A\D转换并采样。
再各求出两组采样好的数据的能量,以便来进行比较。
若求出来的两个结果较接近就为男声,那么男声的那个发光二极管就会亮起来。
若两个结果相差较大就为女声,那么女声的那个发光二极管就会亮起。
电路如下:
3.软件设计
A程序设计流程图:
B程序:
#include
sfrADC_LOW2=0xBE;//定义STC12C5410AD特殊功能寄存器
sfrADC_CONTR=0xC5;
sfrADC_DATA=0xC6;
sfrp0m0=0x93;
sfrp0m1=0x94;
sfrp1m0=0x91;
sfrp1m1=0x92;
sfrp2m0=0x95;
sfrp2m1=0x96;
sfrp3m0=0xb1;
sfrp3m1=0xb2;
sbitgetv=P2^1;//定义指示灯
sbitmale=P2^6;
sbitfemale=P2^7;
#definedivgate4//定义全局常量和全局变量
#definecountgate185
#defineon1
#defineoff0
unsignedchardiv;
unsignedcharad200,ad400;
unsignedchartest;
unsignedchari,count;
unsignedcharcodedisplay_AD_channel_ID[2]={0x00,0x01};
voiddelay100us(charDelay)//延时程序,延时时间=Delay*100us
{
chard;
for(;Delay>0;Delay--)
{
for(d=0;d<12;d++)
{;}
}
}
voiddelay50ms(unsignedintt)//延时程序,延时时间=t*50ms
{
unsignedintj;
for(;t>0;t--)
for(j=6245;j>0;j--)
;
}
unsignedcharAd_Change(unsignedcharchannel)//AD转换子程序
{
ADC_CONTR=ADC_CONTR&0xe0;//1110,0000清ADC_FLAG,ADC_START位和低3位
ADC_CONTR=ADC_CONTR|(display_AD_channel_ID[channel]&0x07);//设置当前通道号//延时使输入电压达到稳定
ADC_DATA=0;//清A/D转换结果寄存器delay100us(5);
ADC_CONTR=ADC_CONTR|0x08;//0000,1000ADCS=1,启动转换
do{;}
while((ADC_CONTR&0x10)==0);//0001,0000等待A/D转换结束
ADC_CONTR=ADC_CONTR&0xE7;//1110,0111清ADC_FLAG位,停止A/D转换
returnADC_DATA;
}
voidget_result()//声音采集和处理子程序
{
count=0;
getv=on;
male=off;
female=off;
for(i=0;i<250;i++)//对400hz和200hz信号各采样250次并统计数据
{
ad400=Ad_Change(0);
ad200=Ad_Change
(1);
if(ad200!
=0)
{
div=ad400/ad200;
if(div>divgate)
count++;
}
elseif(ad200<0x01)
count++;
}
if(count>countgate)//判别男女并指示
{
female=on;male=off;
}
else
{
male=on;female=off;
}
getv=off;
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);
delay50ms(50);//返回等待下次测试
}
voidmain()
{
SP=0x31;
IE=0x85;//开系统中断
getv=0;
male=1;
female=0;
ADC_CONTR=0xe0;//1110,0000打开A/D转换电源。
设定采样速率为210个机器周期
p1m0=0x03;//0000,0011P1.0--P1.1先设为开漏。
断开内部上拉电阻
p1m1=0x00;
delay100us(10);
while
(1)//循环等待声音信号输入
{
male=~male;
female=~female;
delay50ms(50);
test=Ad_Change(0);//先不跟你聊了,写好程序部分的实验报告好给你们
if(test>0x02)
{
test=Ad_Change(0);
if(test>0x02)//重复先不跟你聊了,写好程序部分的实验报告好给你们
{
test=Ad_Change(0);
if(test>0x02)
{
get_result();//对声音进行判别
}
}
}
}
}
四、系统电路测试与分析
1.带话筒放大器的测试:
调整放大增益,使输出幅度较大而不失真。
2.低通滤波器性能的测试:
信号发生器产生200-400HZ正弦波作为400Hz截止频率低通滤波器的输入信号,用示波器观察输出信号,可看到输出为正弦波,450HZ以上正弦波输入时基本无输出信号,可见滤波效果很好。
信号发生器产生100-300HZ正弦波作为200Hz截止频率低通滤波器的输入信号,用示波器观察输出信号,同样可看到很好的滤波效果。
3.单片机系统调试:
用仿真器调试测量与处理程序。
4.整机测试:
下面是对若干位学生的测试结果。
测试声音
平均基音频率(Hz)
判定结果
男声
164.4
男
男声
164.6
男
男声
139.2
男
男声
152.2
男
男声
161
男
女声
255.8
男
女声
242.4
男
女声
279.2
女
女声
264.6
女
女声
254.4
男
由测试结果得到,该系统判断准确率为70%。
原因是,就一个说话者来说,基音频率并不是固定不变的,不同声音、不同声调、说话者的情绪等都会影响基音频率,另外辅音会对测试结果有一定的影响。
正因为如此,容易造成误判。
(如某位男同学发的某些音,用系统测试误判为女声)。
五总结
这个科技制作,我们从三月份开始着手找方案,并多次找钟老师指导,一开始,我们想尝试用全软件的ARM的开发板实现,可是近半个月的时间,找的资料都没能让我们很好的了解ARM的使用,所以我们最后决定改变方案,使用硬件跟单片机软件相结合的办法,硬件部分,对所需的芯片不熟悉,经过钟老师指导,我们应用了MAX293的滤波器,经网上找资料,学会MAX293的应用及其外围电路的搭建,放大电路并没有太大的问题,只是我们本来打算用一个具有自增益控制的芯片,但是在赛格找不到,所以只能单用运放实现,放大跟滤波的电路完成后,整流部分则参考了《模拟电子线路》里面的一个图。
前面硬件部分基本完成,然后就开始制板,因为之前都没有接触过,所以只能从零开始,学着用PROTEI软件,画原理图并画PCB,然后去实验室做板,做伴并没有太大的问题,但是因为芯片是帖片封装,所以焊帖片是很新的尝试,还好有同学的指导才能掌握其中的诀窍。
第一次制板,因为没有经验,所以一口气就把整个硬件电路做在一块板上,结果调试的时候有问题,可是却没有办法检查哪里出问题,所以第一块板就宣布废掉,接下来,决定按模块分开做,放大,滤波,整流,和单片机部分。
放大部分我们用万能板,其他三个部分都是用腐蚀板,滤波部分电路一次就完成,但是整流部分却出现问题,检查电路并没有问题,可是就是没有整流效果,所以最后只能重新用万能板,最后终于完成整流部分的电路。
单片机部分,主要是由另一个组员完成,所以单片机部分的程序设计我并没有参与。
这个科技制作中,我们遇到了很多很多的问题,大问题小问题都有,首先是怎么找资料,开始很茫然的在网上搜索,可是很多并没有很完整,或者是没有很规范,经过钟老师的推荐,我们很多资料都在的网页上找。
其次是调试,调试过程中常会出现电源还没有接,或者是地线忘记接等等的小错误,所以一开始调试的时候就很多问题,结果都归结于自己的粗心与对示波器使用的不熟悉,甚至最后几天还出现最低级的错误,居然把正负电源给接反了,结果本来好的电路根本就没有波形出来,然后就重新检查电路,可是并没有发现是因为电源接错,所以开始拆电路,因为是腐蚀板做的,一拆就整个都废了,所以只能重新做板,直到当天晚上才突然想起是电源接反造成的,可是板已经被我们给拆了,所以只能重新做板了。
最后科技制作终于基本完成,这个阶段,可是天天实验室,不过这个阶段确实学到很多东西。