电话按键音的识别Word下载.docx

上传人:b****5 文档编号:21417694 上传时间:2023-01-30 格式:DOCX 页数:13 大小:131.92KB
下载 相关 举报
电话按键音的识别Word下载.docx_第1页
第1页 / 共13页
电话按键音的识别Word下载.docx_第2页
第2页 / 共13页
电话按键音的识别Word下载.docx_第3页
第3页 / 共13页
电话按键音的识别Word下载.docx_第4页
第4页 / 共13页
电话按键音的识别Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

电话按键音的识别Word下载.docx

《电话按键音的识别Word下载.docx》由会员分享,可在线阅读,更多相关《电话按键音的识别Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

电话按键音的识别Word下载.docx

941

*

#

D

双音多频的拨号键盘是4×

4的矩阵,每一行代表一个低频,每一列代表一个高频。

用户每按一个键就发送一个高频和低频的正弦信号组合。

2.电话按键音识别

MATLAB中audioread函数可以实现多种音频信号的读取,调用形式为

[y,fs]=audioread()

其中y为所读取的音频数据;

而fs为采样频率;

调用的为指定载入的音频文件名称。

用fft频谱分析公式

(1)

(2)

由公式

(1)和

(2)可得:

(3)

四.实验内容

本实验要实现电话拨号音(DTMF)信号的检测的识别,可以通过直接计算傅里叶变换时的输入信号组成的频率。

这里采用FFT算法对信号进行解码分析。

首先对接收到的数字信号作FFT分析。

计算出其频幅谱,继而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。

对于连续的双音多频(DTMF)信号。

需要把有效的数字拨号信号从静音间隔中分割提取出来,然后再用FFT算法对信号进行解码分析,得出电话拨号码。

五、实验过程与分析

1.读取音频文件

利用MATLAB中audioread读取

[x,fs]=audioread('

电话按键音.m4a'

);

2.声道提取

电话按键音是双声道,本实验提取声道1进行分析:

x=x(:

1);

3.端点提取

该按键音为一段连续的11位数字拨号音,分析时需要对它们分别进行处理,而这11位数字间的时间间隔一般情况是没有规律的,无法直接用for循环控制截取,而要是手动一段一段地进行截取,换一个音频信号就得再次重新截取,因此考虑到可能存在噪音的情况,基于短时能量和短时平均过零率来进行端点检测,实现端点的提取,对于不同的音频信号,只需要修改部分可变参数便可以适用。

4.分析

根据音频实际情况设置对应参数:

framelen=floor(fs*40/1000);

%floor向下取整,帧长

frameinc=floor(fs*10/1000);

%帧移

%进行分帧,每帧长framelength,

voice_min_len=15;

%最短语音长度150ms

%语音段的最短长度,若语音段长度小于此值(如果语音段中的静音帧数未超过此值,),则认为其为一段噪音

unvoice_min_len=5;

%结束段最小持续50ms

n3=0.05;

%过零率下限参数0.05

检测结果见图1

结果:

将11个检测到的号码音频左右端点提取出来

对信号进行fft变换后,得到的频谱是呈现对称的,在此截取前部分进行观察,得到频谱图如图2所示。

程序运行最终结果为:

Thetelephonenumberis:

图1端点检测结果图图2电话按键音fft频谱图

5.可靠性检验

自己录制一段拨号音,检验程序的可靠性,这里为了

为了验证程序的正确、可靠性,又分别录制了我自己手机号以及1234567890两段不同格式不同号码,在有噪声条件下的按键音,检验过程如下

(1)(.mp3格式)

参数设置同上

图3端点检测结果图图4电话按键音的fft频谱图

程序运行结果:

图5端点检测结果图图6电话按键音的fft频谱图

(2)1234567890(.ogg格式)

该音频录制时,有的按键音持续时间较短,需要对检测初始参数进行修改

修改参数:

voice_min_len=6;

%最短语音长度60ms

n3=0.02;

%过零率下限参数0.02

1234567890

经验证,该程序可行。

六、小结

1.原本想着,进行端点检测时考虑了噪声的影响进行滤波或许就不必要了,但是将滤波器加进程序后发现,对于不同的音频信号,程序有更好的适应性,端点检测结果的精确度居然也有所提高,不用再反复修改设置参数,然后就将滤波器加入程中了。

2.实验过程中,首先是手动截取11段数字音频验证号码可检测出来后,在进行端点检测的构思,最后考虑滤波。

3.通过本次实验,发现自己在MATLAB函数的应用与程序设计中仍有很大的进步空间。

4.有效的端点检测技术不仅能在语音识别系统中减少数据的采集量,节约处理时间,还能排除无声段或噪声段的干扰。

对于端点检测的程序,其原理经查阅资料明白一些,但不多,查阅到语音端点检测参考程序之后,对其进行了步骤增加、减少等操作,使其适合本实验,考虑到一些参数对于不同的音频需要做不同的改变,便将其提取到主程序中,方便修改。

5.在引用的端点检测代码原理不很了解情况下,结合本实验对其进行部分修改比较困难。

6.对于待检测信号的第一个数字滤波效果不好,未达到理想的效果。

7.先设计滤波器对信号进行滤波,滤去部分噪声,再设计考虑噪声的端点检测函数,相当于信号进行了双重滤波处理,是结果能够更加准确。

七、实验程序

(1)主程序:

%待检测数据

%[x,fs]=audioread('

10月11日.mp3'

%检验号码

11_11_1.ogg'

%检验号码1234567890

1);

%提取声道1

x=lv_bo_1(x,fs);

sound(x,fs);

%播放滤波后的音频

%%调整各参数

%最短语音长度60ms,150ms

%过零率下限参数0.02,0.05

%%end

[fan_wei]=vad(framelen,frameinc,x,fs,voice_min_len,unvoice_min_len,n3);

%引用时注意修改函数vad中的最短语音长度

number='

'

;

figure

fori=1:

length(fan_wei)

y=x(fan_wei(i,1):

fan_wei(i,2));

n=0:

length(y)-1;

%建立一个信号等长的序列;

%=================频域图像==============================

N=length(y);

%取信号矩阵的长度

FFT=fft(y,N);

%N点傅里叶变换

mag=abs(FFT)/(N/2);

%还原真实幅值

f=n*fs/N;

%频率序列

%

f=f(1:

fix(N/2));

mag=mag(1:

%

subplot(3,4,i)%图2:

频谱图

%取l/2作图

plot(f,mag);

axis([6001700min(mag)max(mag)]);

title('

fft频谱图'

%标题:

xlabel('

频率/Hz'

%标注横坐标

ylabel('

幅度'

%标注纵坐标

gridon;

%打开网格线

%数字判断

a1=(697+770)/2;

a2=(770+852)/2;

a3=(852+941)/2;

a4=(1209+1336)/2;

a5=(1336+1477)/2;

a6=(1477+1633)/2;

if(f(mag==max(mag(f<

=1000)))<

a1)

if(f(mag==max(mag(f>

1100)))<

a4)

tel=1;

elseif(f(mag==max(mag(f>

a5)

tel=2;

a6)

tel=3;

else

tel='

A'

end

elseif(f(mag==max(mag(f<

a2)

tel=4;

tel=5;

tel=6;

B'

a3)

tel=7;

tel=8;

tel=9;

C'

*'

tel=0;

#'

D'

number=[number,num2str(tel)];

end

disp(['

'

number])

(2)滤波器

function[f1]=lv_bo_1(x,fs)

%%双线性变换法设计Butterworth滤波器

t=0:

1/fs:

(size(x)-1)/fs;

Au=0.03;

d=(Au*cos(2*pi*10000*t))'

x2=x+d;

%数字滤波器指标fp=3Hz,fr=4Hz,Rp=1db,As=20db,fs=10Hz

wp=0.25*pi;

%通带边界频率(归一化):

wp=fp*2*pi/fs

ws=0.3*pi;

%阻带边界频率(归一化):

ws=fr*2*pi/fs

Rp=1;

%通带波纹

Rs=15;

%将模拟指标转换成数字指标

Fs=fs;

Ts=1/Fs;

%时域最小间隔,即时域分辨率

wp1=2/Ts*tan(wp/2);

%模拟低通原型滤波器通带频率

ws1=2/Ts*tan(ws/2);

%模拟低通原型滤波器阻带频率

[N,Wn]=buttord(wp1,ws1,Rp,Rs,'

s'

%选择滤波器的最小阶数

[Z,P,K]=buttap(N);

%创建butterworth模拟滤波器

[Bap,Aap]=zp2tf(Z,P,K);

[b,a]=lp2lp(Bap,Aap,Wn);

%双线性变换得到分子和分母的系数向量bz,az

[bz,az]=bilinear(b,a,Fs);

%用双线性变换法实现模拟滤波器到数字滤波器的转换

f1=filter(bz,az,x2);

%进行滤波处理

(3)端点检测

function[fan_wei]=vad(a1,a2,x,fs,n1,n2,n3)

%归一化

x=double(x);

x=x/max(abs(x));

framelen=a1;

frameinc=a2;

y=enframe(x,hanning(framelen),frameinc);

%分帧

%计算短时间能量

amp=sum(abs(y),2);

%amp=sum(abs(enframe(filter([1-0.9375],1,x),framelen,frameinc)).^2,2);

%计算过零率

tmp1=enframe(x(1:

length(x)-1),framelen,frameinc);

tmp2=enframe(x(2:

length(x)),framelen,frameinc);

signs=(tmp1.*tmp2)<

0;

diffs=(tmp1-tmp2)>

n3;

zcr=sum(signs.*diffs,2);

zcr=[zcr;

zcr(end)];

zcr_yu=0.2*mean(zcr);

yuzhi=0.2*mean(amp);

N=length(amp);

forn=1:

N

ifamp(n)<

yuzhi||(zcr(n)<

zcr_yu)

continue;

kaitou=n;

break;

forn=N:

-1:

jiewei=n;

noise=[amp(1:

kaitou-1);

amp(jiewei+1:

end)];

noise_mean=mean(noise);

noise_var=std(noise);

speech_mean=mean(amp(kaitou:

jiewei));

%noise_mean

yuzhi1=0.3*speech_mean;

yuzhi2=max(0.3*speech_mean,(noise_mean+noise_var)*1.3);

noise_zcr=[zcr(1:

zcr(jiewei+1:

noise_zcr_mean=mean(noise_zcr);

noise_zcr_std=std(noise_zcr);

speech_zcr_mean=mean(zcr(kaitou:

zcr_yu1=0.3*speech_zcr_mean;

zcr_yu2=max(0.3*speech_zcr_mean,(noise_zcr_mean+noise_zcr_std)*0.3);

st=[];

en=[];

bstart_state=0;

bend_state=0;

segment=0;

unvoice=0;

voice_min_len=n1;

%最短语音长度70ms

unvoice_min_len=n2;

st_candicate=0;

en_candicate=0;

%%开始端点检测

fori=1:

if((amp(i)>

=yuzhi2&

&

zcr(i)>

=zcr_yu1)&

~bstart_state)%findstart

bstart_state=1;

if(~st_candicate)

st_candicate=i;

segment=segment+1;

elseif((amp(i)>

=yuzhi2||zcr(i)>

bstart_state)%

if(unvoice>

=unvoice_min_len)%

st=[st;

st_candicate];

en_candicate=en_candicate+unvoice_min_len-1;

en=[en;

en_candicate];

bend_state=1;

unvoice=0;

segment=0;

st_candicate=0;

else

segment=segment+1;

elseif((amp(i)<

yuzhi2&

zcr(i)<

zcr_yu1)&

bstart_state)%

ifsegment>

=voice_min_len%

unvoice=unvoice+1;

if~bend_state%

en_candicate=i;

else%

bstart_state=0;

bend_state=0;

~bstart_state)%

if~st_candicate

st_candicate=i;

else%

end

if(unvoice>

=unvoice_min_len)%

(en_candicate+unvoice_min_len-1)];

if(segment>

=voice_min_len)%

N];

figure

(1);

subplot(3,1,1),plot(x);

%原始语音波形

axis([1,length(x),-1,1]);

ylabel('

speech'

xlabel('

样本点'

fork=1:

length(st)line([st(k)*frameinc,st(k)*frameinc],[-1,1],'

linestyle'

'

:

color'

blue'

LineWidth'

2);

line([en(k)*frameinc,en(k)*frameinc],[-1,1],'

red'

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1