拨号键盘

更新时间:2023-03-08 06:49:35 阅读: 评论:0

十大电器-高三口号

拨号键盘
2023年3月8日发(作者:小台球桌)

..

.页脚

一、实验目的

1.本实验的容基于对通信系统中拨号音的识别仿真实验。主要涉及到拨号音识别

的基本原理和识别的主要方法。利用matlab软件以及fft算法实现对通信系

统中拨号音的识别。并进一步利用matlab中的图形用户界面制作简单直观的

模拟界面,使其对拨号音的识别有个基本的了解。

2.能够利用矩阵不同的基频合成0-9不同按键的拨号音,并能够对不同的拨号

音加以正确的识别。进一步画出简单的图形,从而实现对拨号音系统的简单的

实验仿真。

3.了解学习DTMF(双音多频)相关知识,知道双音多频的信号是用两个特定的

单音频率信号的组合来代表数字或功能。

二、实验仪器

安装有MATLAB软件的计算机一台。

三、实验原理

(双音多频)

(1)基本概念

拨号有两种,脉冲和音频,所谓音频也成双音多频(DTMF)信号的拨号

方式即是拨号时每按一个键,有两个音频频率叠加成一个双音频信号,十六

个按键由八个音频频率区分。

(2)编制规则

具体DTMF编制规则如表1所示

表1DTMF键盘

高群/Hz

..

.页脚

低群/Hz1233

697123A

770456B

852789C

941*0#D

双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一

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

2.按键音识别

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

[y,fs]=audioread(filename)

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

而fs为采样频率;

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

用fft频谱分析公式

/2/wTfsffs

(1)

2/wNk

(2)

由公式(1)和(2)可得:(3)

四.实验容

本实验要实现拨号音(DTMF)信号的检测的识别,可以通过直接计算傅里叶变换

时的输入信号组成的频率。这里采用FFT算法对信号进行解码分析。首先对接收到

的数字信号作FFT分析。计算出其频幅谱,继而得到功率谱,组成输入信号的频率

必定对应功率谱的峰值。对于连续的双音多频(DTMF)信号。需要把有效的数字拨号

/ffskN

..

.页脚

信号从静音间隔中分割提取出来,然后再用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格式)

参数设置同上

0.511.522.533.54

x10

5

-1

0

1

s

p

e

e

c

h

样本点

1

0

100

200

e

n

e

r

g

y

帧数

1

0

5

z

c

r

帧数

..

.页脚

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

程序运行结果:

Thetelephonenumberis:

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

(2)1234567890(.ogg格式)

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

修改参数:

voice_min_len=6;%最短语音长度60ms

n3=0.02;%过零率下限参数0.02

程序运行结果:

Thetelephonenumberis:1234567890

经验证,该程序可行。

1234567

x10

5

-1

0

1

s

p

e

e

c

h

样本点

2600

0

200

400

e

n

e

r

g

y

帧数

2600

0

50

z

c

r

帧数

0.511.522.533.544.555.5

x10

5

-1

0

1

s

p

e

e

c

h

样本点

20001200

0

100

e

n

e

r

g

y

帧数

20001200

0

20

40

z

c

r

帧数

6014001600

2

4

6

x10

-4fft频谱图

频率/Hz

6014001600

2

4

6

x10

-4fft频谱图

频率/Hz

6014001600

1

2

3

4

x10

-4fft频谱图

频率/Hz

6014001600

1

2

3

x10

-4fft频谱图

频率/Hz

6014001600

1

2

3

x10

-4fft频谱图

频率/Hz

6014001600

0.5

1

1.5

2

x10

-4fft频谱图

频率/Hz

6014001600

0.5

1

1.5

2

2.5

x10

-4fft频谱图

频率/Hz

6014001600

1

2

3

x10

-4fft频谱图

频率/Hz

6014001600

0.5

1

1.5

2

x10

-4fft频谱图

频率/Hz

6014001600

0.5

1

1.5

2

2.5

x10

-4fft频谱图

频率/Hz

..

.页脚

六、小结

1.原本想着,进行端点检测时考虑了噪声的影响进行滤波或许就不必要了,但是将

滤波器加进程序后发现,对于不同的音频信号,程序有更好的适应性,端点检测结

果的精确度居然也有所提高,不用再反复修改设置参数,然后就将滤波器加入程中

了。

2.实验过程中,首先是手动截取11段数字音频验证可检测出来后,在进行端点检测

的构思,最后考虑滤波。

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

间。

4.有效的端点检测技术不仅能在语音识别系统中减少数据的采集量,节约处理时间,

还能排除无声段或噪声段的干扰。对于端点检测的程序,其原理经查阅资料明白一

些,但不多,查阅到语音端点检测参考程序之后,对其进行了步骤增加、减少等操

作,使其适合本实验,考虑到一些参数对于不同的音频需要做不同的改变,便将其

提取到主程序中,方便修改。

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

困难。

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

7.先设计滤波器对信号进行滤波,滤去部分噪声,再设计考虑噪声的端点检测函数,

相当于信号进行了双重滤波处理,是结果能够更加准确。

七、实验程序

(1)主程序:

[x,fs]=audioread('按键音.m4a');%待检测数据

..

.页脚

%[x,fs]=audioread('10月11日.mp3');%检验

%[x,fs]=audioread('11_11_');%检验1234567890

x=x(:,1);%提取声道1

x=lv_bo_1(x,fs);

sound(x,fs);%播放滤波后的音频

%%调整各参数

framelen=floor(fs*40/1000);%floor向下取整,帧长

frameinc=floor(fs*10/1000);%帧移

%进行分帧,每帧长framelength,

voice_min_len=15;%最短语音长度60ms,150ms

%语音段的最短长度,若语音段长度小于此值(如果语音段中的静音帧数未超过此

值,),则认为其为一段噪音

unvoice_min_len=5;%结束段最小持续50ms

n3=0.02;%过零率下限参数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:fix(N/2));%

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)))

if(f(mag==max(mag(f>1100)))

tel=1;

elif(f(mag==max(mag(f>1100)))

..

.页脚

tel=2;

elif(f(mag==max(mag(f>1100)))

tel=3;

el

tel='A';

end

elif(f(mag==max(mag(f<=1000)))

if(f(mag==max(mag(f>1100)))

tel=4;

elif(f(mag==max(mag(f>1100)))

tel=5;

elif(f(mag==max(mag(f>1100)))

tel=6;

el

tel='B';

end

elif(f(mag==max(mag(f<=1000)))

if(f(mag==max(mag(f>1100)))

tel=7;

elif(f(mag==max(mag(f>1100)))

tel=8;

elif(f(mag==max(mag(f>1100)))

..

.页脚

tel=9;

el

tel='C';

end

el

if(f(mag==max(mag(f>1100)))

tel='*';

elif(f(mag==max(mag(f>1100)))

tel=0;

elif(f(mag==max(mag(f>1100)))

tel='#';

el

tel='D';

end

end

number=[number,num2str(tel)];

end

disp(['Thetelephonenumberis:',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)

continue;

end

kaitou=n;

..

.页脚

break;

end

forn=N:-1:1

ifamp(n)

continue;

end

jiewei=n;

break;

end

noi=[amp(1:kaitou-1);amp(jiewei+1:end)];

noi_mean=mean(noi);noi_var=std(noi);

speech_mean=mean(amp(kaitou:jiewei));%noi_mean

yuzhi1=0.3*speech_mean;%

yuzhi2=max(0.3*speech_mean,(noi_mean+noi_var)*1.3);%

noi_zcr=[zcr(1:kaitou-1);zcr(jiewei+1:end)];

noi_zcr_mean=mean(noi_zcr);

noi_zcr_std=std(noi_zcr);

speech_zcr_mean=mean(zcr(kaitou:jiewei));

zcr_yu1=0.3*speech_zcr_mean;

zcr_yu2=max(0.3*speech_zcr_mean,(noi_zcr_mean+noi_zcr_std)*0.3);

st=[];en=[];

bstart_state=0;bend_state=0;

..

.页脚

gment=0;unvoice=0;

voice_min_len=n1;%最短语音长度70ms

unvoice_min_len=n2;%结束段最小持续50ms

st_candicate=0;en_candicate=0;

%%开始端点检测

fori=1:N

if((amp(i)>=yuzhi2&&zcr(i)>=zcr_yu1)&&~bstart_state)%findstart

bstart_state=1;%

if(~st_candicate)

st_candicate=i;

end

gment=gment+1;

elif((amp(i)>=yuzhi2||zcr(i)>=zcr_yu1)&&bstart_state)%

if(unvoice>=unvoice_min_len)%

st=[st;st_candicate];

en_candicate=en_candicate+unvoice_min_len-1;

en=[en;en_candicate];bstart_state=0;bend_state=1;

unvoice=0;gment=0;st_candicate=0;

el

unvoice=0;bend_state=0;

gment=gment+1;

end

..

.页脚

elif((amp(i)

ifgment>=voice_min_len%

unvoice=unvoice+1;

if~bend_state%

en_candicate=i;

end

bend_state=1;%

el%

bstart_state=0;gment=0;

bend_state=0;unvoice=0;

st_candicate=0;en_candicate=0;

end

elif((amp(i)>=yuzhi2||zcr(i)>=zcr_yu1)&&~bstart_state)%

if~st_candicate

st_candicate=i;

end

el%

st_candicate=0;

continue;

end

end

if(unvoice>=unvoice_min_len)%

..

.页脚

st=[st;st_candicate];

en=[en;(en_candicate+unvoice_min_len-1)];

gment=0;

end

if(gment>=voice_min_len)%

st=[st;st_candicate];en=[en;N];

end

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],'linestyle',':','color','red','LineWidt

h',2);

end

subplot(3,1,2),plot(amp);%原始语音能量

axis([1,length(amp),0,max(amp)]),ylabel('energy');,xlabel('帧数');

line([1,N],[yuzhi1,yuzhi1],'color','yellow','LineWidth',2);%由语音能量

line([1,N],[yuzhi2,yuzhi2],'color','red','LineWidth',2);%由噪声平均能量和语音

能量比较而得

fork=1:length(st)

..

.页脚

line([st(k),st(k)],[min(amp),max(amp)],'linestyle',':','color','blue','LineWidth',2)

;

line([en(k),en(k)],[min(amp),max(amp)],'linestyle',':','color','red','LineWidth',2

);

end

subplot(3,1,3),plot(zcr);%原始语音过零率

axis([1,length(zcr),0,max(zcr)]),ylabel('zcr');xlabel('帧数');

line([1,N],[zcr_yu1,zcr_yu1],'color','yellow','LineWidth',2);%由语音能量

line([1,N],[zcr_yu2,zcr_yu2],'color','red','LineWidth',2);%语音加噪音

fork=1:length(st)

line([st(k),st(k)],[min(zcr),max(zcr)],'linestyle',':','color','blue','LineWidth',2);

line([en(k),en(k)],[min(zcr),max(zcr)],'linestyle',':','color','red','LineWidth',2);

end

fan_wei=[st,en]*frameinc;

本文发布于:2023-03-08 06:49:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678229374181146.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:拨号键盘.doc

本文 PDF 下载地址:拨号键盘.pdf

下一篇:返回列表
标签:拨号键盘
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26 专利检索|