《电话按键音的识别.docx》由会员分享,可在线阅读,更多相关《电话按键音的识别.docx(10页珍藏版)》请在三一办公上搜索。
1、电话按键音的识别一、实验目的1 .本实验的内容基于对电话通信系统中拨号音的识别仿真实验。主要涉及到电话拨号音识别的基本原理和识别的主要方法。利用mat1.ab软件以及fft算法实现对电话通信系统中拨号音的识别。并进一步利用mat1.ab中的图形用户界面制作简单直观的模拟界面,使其对拨号音的识别有个基本的了解。2 .能够利用矩阵不同的基频合成0-9不同按键的拨号音,并能够对不同的拨号音加以正确的识别。进一步画出简单的图形,从而实现对电话拨号音系统的简单的实验仿真。3.了解学习DTMF(双音多频)相关知识,知道双音多频的信号是用两个特定的单音频率信号的组合来代表数字或功能。二、实验仪器安装有MAT
2、1.AB软件的计算机一台。三、实验原理1 .DTMF(双音多频)(1)基本概念电话拨号有两种,脉冲和音频,所谓音频也成双音多频(DTMF)信号的拨号方式即是电话拨号时每按一个键,有两个音频频率叠加成一个双音频信号,十六个按键由八个音频频率区分。(2)编制规则具体DTMF编制规则如表1所示表1DTMF键盘低群/Hz高群/Hz1209133614771633697123A770456B852789C9410#D双音多频的拨号键盘是4X4的矩阵,每一行代表一个低频,每一列代表一个高频。用户每按一个键就发送一个高频和低频的正弦信号组合。2 .电话按键音识别MAT1.AB中audioread函数可以实现
3、多种音频信号的读取,调用形式为y,fs=audioread(fiIename)其中y为所读取的音频数据;而fs为采样频率;调用的fi1.ename为指定载入的音频文件名称。用fft频谱分析公式(1)w=T=fi=2ffsw=2几/Nk由公式(1)和(2)可得:f=fskN(3)四.实验内容本实验要实现电话拨号音(DTMF)信号的检测的识别,可以通过直接计算傅里叶变换时的输入信号组成的频率。这里采用FFT算法对信号进行解码分析。首先对接收到的数字信号作FFT分析。计算出其频幅谱,继而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。对于连续的双音多频(DTMF)信号。需要把有效的数字拨号信号从
4、静音间隔中分割提取出来,然后再用FFT算法对信号进行解码分析,得出电话拨号码。五、实验过程与分析1 .读取音频文件利用MAT1.AB中audioread读取x,fs=audioread(,电话按键音.m4a,);2 .声道提取电话按键音是双声道,本实验提取声道1进行分析:=(:,1);3 端点提取该虚键音为一段连续的11位数字拨号音,分析时需要对它们分别进行处理,而这11位数字间的时间间隔一般情况是没有规律的,无法直接用for循环控制截取,而要是手动一段一段地进行截取,换一个音频信号就得再次重新截取,因此考虑到可能存在噪音的情况,基于短时能量和短时平均过零率来进行端点检测,实现端点的提取,对于
5、不同的音频信号,只需要修改部分可变参数便可以适用。4 .分析根据音频实际情况设置对应参数:frame1.en=f1.oor(fs*401000);%f1.oor向下取整,帧长frameinc=f1.oor(fs*101000);%帧移%进行分帧,每帧长frame1.ength,voice_min_1.en=15;%最短语音长度150ms%语音展的熹短长度,若语音段长度小于此值(如果语音段中的静音帧数未超过此值,),则认为其为一段噪音unvoice_min_1.en=5;%结束段最小持续50msn3=0.05;%过零率下限参数0.05检测结果见图1结果:将11个检测到的号码音频左右端点提取出来对
6、信号进行fft变换后,得到的频谱是呈现对称的,在此截取前部分进行观察,得到频谱图如图2所示。程序运行最终结果为:AGJeU8门n11 1n 11 图1端点检测结果图5O SN图2电话按键音fft频谱图5.可靠性检验自己录制一段拨号音,检验程序的可靠性,这里为了(.mp3格式)参数设置同上图3端点检测结果图图4电话按键音的fft频谱图程序运行结果:图5端点检测结果图图6电话按键音的fft频谱图(2)1234567890(.ogg格式)该音频录制时,有的按键音持续时间较短,需要对检测初始参数进行修改修改参数:voice_min_1.en=6;%最短语音长度60msn3=0.02;%汪零率下限参数0
7、.02程序运行结果:Thete1.ephonenumberis:1234567890经验证,该程序可行。六、小结1 .原本想着,进行端点检测时考虑了噪声的影响进行滤波或许就不必要了,但是将滤波器加进程序后发现,对于不同的音频信号,程序有更好的适应性,端点检测结果的精确度居然也有所提高,不用再反复修改设置参数,然后就将滤波器加入程中了。2 .实验过程中,首先是手动截取11段数字音频验证号码可检测出来后,在进行端点检测的构思,最后考虑滤波。3 .通过本次实验,发现自己在MAT1.AB函数的应用与程序设计中仍有很大的进步空间。4 .有效的端点检测技术不仅能在语音识别系统中减少数据的采集量,节约处理时
8、间,还能排除无声段或噪声段的干扰。对于端点检测的程序,其原理经查阅资料明白一些,但不多,查阅到语音端点检测参考程序之后,对其进行了步骤增加、减少等操作,使其适合本实验,考虑到一些参数对于不同的音频需要做不同的改变,便将其提取到主程序中,方便修改。5 .在引用的端点检测代码原理不很了解情况下,结合本实验对其进行部分修改比较困难。6 .对于待检测信号的第一个数字滤波效果不好,未达到理想的效果。7 .先设计滤波器对信号进行滤波,滤去部分噪声,再设计考虑噪声的端点检测函数,相当于信号进行了双重滤波处理,是结果能够更加准确。七、实验程序(1)主程序:x,fs=audioread(,电话按键音.m4a,)
9、;%待检测数据%x,fs=audioread(ogg,);%检验号码1234567890乂=乂(:,1);%提取声道1x=1.v_bo_1.(x,fs);sound(x,fs);%播放滤波后的音频%调整各参数frame1.en=f1.oor(fs*401000);%f1.oor向下取整,帧长frameinc=f1.oor(fs*10/IOOO);%帧移%进行分帧,每帧长frame1.ength,voice_min_1.en=15;%最短语音长度60ms,150ms%语音版的熹短长度,若语音段长度小于此值(如果语音段中的静音帧数未超过此值,),则认为其为一段噪音unvoice_min_1.en=
10、5;%结束段最小持续50ms1)3=0.02;%过零率下限参数0,02,0.05%endfan_wei=vad(frame1.en,frameinc,x,fs,voice_min_1.en,unvoice_min_1.en,n3);%引用时注意修改函数Vad中的最短语音长度number=,;figurefori=1.:1.ength(fan_wei)y=x(fan_wei(i,1):fan_wei(i,2);n=0:1.ength(y)-1;%建立一个信号等长的序列;%=频域图像=N=Iength(y);%取信号矩阵的长度FFT=fft(y,N);%N点傅里叶变换mag=abs(FFT)/(N
11、/2);%还原真实幅值f=n*fs/N;%频率序列%f=f(kfix(N2);mag=mag(1:fix(N/2);%SUbP1.ot(3,4,i)%图2:频谱图%取1/2作图p1.ot(f,mag);axis(6001700min(mag)max(mag);tit1.e(,fft频谱图);标题:X1.abe1.C频率/Hz);%标注横坐标y1.abe1.(,幅度);标注纵坐标gridon;%打开网格线%数字判断a1.=(697+770)/2;a2=(770+852)/2;a3=(852+941)/2;a4=(1209+1336)/2;a5=(1336+1477)/2;a6=(1477+163
12、3)/2;if(f(mag=max(mag(f=1000)1100)1100)1100)a6)te1.=3;e1.sete1.,A,;ende1.seif(f(mag=max(mag(f=1000)1100)1100)1100)a6)te1.=6;e1.sete1.,B,;ende1.seif(f(mag=max(mag(f=1000)I1.OO)1100)1100)1100)1100)1100)a6)te1.,#;e1.sete1.,D,;endendnumber=number,num2str(te1.);enddisp(,Thete1.ephonenumberis/,number)(2)滤
13、波器functionf1.=1.v_bo_1.(x,fs)%双线性变换法设计Butterworth滤波器t=0:1./fs:(size(x)-1.)fs;Au=O.03;d=(Au*cos(2*pi*10000*t),;x2=x+d;%数字滤波器指标fp=3Hz,fr=4Hz,Rp=Idb,As=20db,fs=10Hzwp=0.25*pi;%通带边界频率(归一化wp=fp*2*pifsws=0.3*pi;%阻带边界频率(归一化):ws=fr*2*pifsRP=1;%通带波纹Rs=15;%将模拟指标转换成数字指标Fs=fs;TS=I/Fs;%时域最小间隔,即时域分辨率wp1.=2Ts*tan(
14、wp2);%模拟低通原型滤波器通带频率ws1.=2Ts*tan(ws2);%模拟低通原型滤波器阻带频率N,Wn=buttord(wp1.,ws1.,Rp,Rs,s);%选择漉波器的最小阶数Z,P,K=buttap(N);%创建butterworth模拟滤波器Bap,Aap=zp2tf(Z,P,K);b,a=1.p21p(Bap,Aap,Wn);%双线性变换得到分子和分母的系数向量bz,azbz,az=bi1.inear(b,a,Fs);%用双线性变换法实现模拟滤波器到数字滤波器的转换f1.=fi1.ter(bz,azfx2);%进行滤波处理(3)端点检测functionfan_wei=vad(
15、a1.,a2fx,fs,n1.,n2,n3)%归一化x=doub1.e(x);x=xmax(abs(x);frame1.en=a1.;frameinc=a2;y=enframe(x,harming(frame1.en),frameinc);%分帧%计算短时间能量amp=sum(abs(y),2);%amp=sum(abs(enframe(fiIter(1-0.9375,1,x),frame1.en,frameinc).*2,2);%计算过零率tmp1.=enframe(x(1:1.ength(x)-1),frame1.en,frameinc);tmp2=enframe(x(2:1.ength(
16、x),frame1.en,frameinc);signs=(tmp1.*tmp2)n3;zcr=sum(signs,*diffs,2);zcr=zcr;zcr(end);zcr_yu=0.2*mean(zcr);yuzhi=0.2*mean(amp);%N=Iength(amp);forn=1.:Nifamp(n)yuzhi(zcr(n)zcr_yu)continue;endkaitou=n;break;endforn=N:-1:1ifamp(n)yuzhi(zcr(n)=yuzhi2&zcr(i)=zcr_yu1.)&bstart_state)%findstartbstart_state=1
17、.;%ifCst_candicate)st_candicate=i;endsegment=segment1;e1.seif(amp(i)=yuzhi21zcr(i)=zcr_yu1.)&bstart_state)%if(unvoice=unvoice_min_1.en)%st=st;st_candicate;en_candicate=en_candicate+unvoice_min_1.en-1;en=en;en_candicate;bstart_state=O;bend_state=1;unvoice=O;segment=O;st_candicate=O;e1.seunvoice=O;ben
18、d_state=O;segment=segment+1;ende1.seif(amp(i)yuzhi2&zcr(i)=voice_min_1.en%unvoice=unvoice+1;ifbend_state%en_candicate=i;endbend_state=1;%e1.se%bstart_state=O;segment=O;bend_state=O;unvoice=O;st_candicate=O;en_candicate=O;ende1.seif(amp(i)=yuzhi21zcr(i)=zcr_yu1.)&bstart_state)%ifst_candicatest_candic
19、ate=i;ende1.se%st_candicate=O;continue;endendif(unvoice=unvoice_min_1.en)%st=st;st_candicate;en=en;(en_candicate+unvoice_min_1.en-1);segment=0;endif(segment=voice_min_1.en)%st=st;st_candicate;en=en;N;endfigured);subp1.ot(3,1,1),p1.ot(x);%原始语音波形axis(1,1.ength(x),-1,1);y1.abe1.(,speech1);x1.abe1.(样本点)
20、;fork=1.:1.ength(st)1ine(st(k)*frameinc,st(k)*frameinc,-1,1,1.inesty1.e,co1.or,b1.ue,1.ineWidth,2);1ine(en(k)*frameinc,en(k)*frameinc,-1,1,1.inesty1.e,co1.or*,red,1.ineWidthf,2);endsubp1.ot(3,1,2),p1.ot(amp);%原始语音能量axis(1,1.ength(amp),0,max(amp),y1.abe1.(,energy*);,x1.abe1.(,帧数);1.ine(1.,N,yuzhi1.,y
21、uzhi1.,co1.or,Jye1.1.ow,1.ineWidth,2);%由语音能量1.ine(1.,N,yuzhi2,yuzhi2,co1.or,red,1.ineWidth,2);%由噪声平均能量和语音能量比较而得fork=1.:1.ength(st)1.ine(st(k),st(k),min(amp),max(amp),1.inesty1.e,co1.or,b1.ue,1.ineWidth*,2);1.ine(en(k),en(k),min(amp),max(amp),1.inesty1.e,co1.or,red,1.ineWidth,2);endsubp1.ot(3,1,3),p1
22、.ot(ZCr);%原始语音过零率axis(1.,1.ength(zcr),0,max(zcr),y1.abe1.(,zcr,);x1.abe1.(,帧数);1.ine(1.,N,zcr_yu1.,zcr_yu1.,co1.or,ye1.1.ow,1.ineWidth,2);%由语音能量1.ine(1.,N,zcr_yu2,zcr_yu2,co1.or,red,1.ineWidth*,2);%语音加噪音fork=1.:1.ength(st)1.ine(st(k),st(k),min(zcr),max(zcr),1.inesty1.e,co1.or,b1.ue,1.ineWidth*,2);1.ine(en(k),en(k),min(zcr),max(zcr),1.inesty1.e,co1.or,red,1.ineWidth,2);endfan_wei=st,en*frameinc;