DSP实验9电话拨号音的合成与识别Word文档下载推荐.docx
- 文档编号:19606290
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:11
- 大小:131.40KB
DSP实验9电话拨号音的合成与识别Word文档下载推荐.docx
《DSP实验9电话拨号音的合成与识别Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DSP实验9电话拨号音的合成与识别Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
涉及的MATLAB函数
1.Set
功能:
设置对象属性。
基本调用格式:
set(H,'
PropertyName'
PropertyValue,...)
用属性值'
PropertyValue'
设置关于用参量H标志的对象(一个或个)
的属性名'
(一个或多个)。
H可以为一句柄的向量。
在这
种情形下,命令set可以设置所有对象的属性值。
2.find
找出矩阵X中非0项的坐标和取值。
[row,col]=find(X,...)
常与逻辑运算法一起使用,可进一步明确搜索数值的范围。
3.disp
显示文本或数组。
disp(X)
4.struct
创建一个结构体数组。
s=struct('
field1'
values1,'
field2'
values2,...)
给每一个域名赋值,赋值可以为矢量也可以为标量,但是矢量必须有相
同的维数。
3、实验操作部分
1.实验数据、表格及数据处理
2.实验操作过程(可用图表示)
3.实验结论
一、实验过程
1.图形电话拨号面板的制作
利用GUI图形用户界面设计工具制作电话拨号面板,把DTMF信号
和电话机的键盘矩阵对应起来,如下图所示。
2.DTMF信号的产生合成
现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对tu1.m文件进行编辑。
其主要的功能是使对应的按键,按照表1的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。
此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。
鉴于CCITT对DTMF信号规定的指标,这里每个数字信号取1000个采样点模拟按键信号,并且每两个数字之间用100个0来表示间隔来模拟静音。
以便区别连续的两个按键信号。
间隔的静音信号也是在按键时产生的。
以按键0为例,简单介绍拨号音产生的过程:
%按键0的响应函数
functionvarargout=pushbutton0_Callback(h,eventdata,handles,
varargin)
n=[1:
1000];
%每个数字1000个采样点表示
d0=sin(0.7217*n)+sin(1.0247*n);
%对应行频列频叠加
n0=strcat(get(handles.edit1,'
string'
),'
0'
);
%获取数字号码
set(handles.edit1,'
n0);
%显示号码
space=zeros(1,100);
%100个0模拟静音信号
globalNUM
phone=[NUM,d0];
NUM=[phone,space];
%存储连续的拨号音信号
wavplay(d0,8192);
%产生拨号音
程序解释:
NUM为定义的全局变量,用于存储连续的拨号音(DTMF)信号,包括数字信号音以及静音信号。
d0=sin(0.7217*n)+sin(1.0247*n)中的行频与列频是由表1中0键对应的
=941Hz,
=1336HZ计算得出,已知声音取样频率
=8192HZ,则取样后
对于保留的两个功能键“*”“#”,按照现行键盘式拨号电话的习惯,将“*”作为删除键,“#”作为确认键。
“*”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元NUM中退回一位拨号音信号和静音信号。
删除可以进行连续的操作。
“#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元NUM中的信号即为后用于识别的连续拨号音DTMF信号,并在显示窗口中显示“#”号作为标记。
%删除键的响应函数
functionvarargout=pushbuttonback_Callback(h,eventdata,
handles,varargin)
num=get(handles.edit1,'
l=length(num);
n11=strrep(num,num,num(1:
l-1));
%去掉末尾号码在面板上的显示
d11=sin(0.7217*n)+sin(0.9273*n);
n11);
L=length(NUM);
NUM=NUM(1:
L-1100);
%删除末尾号码在拨号音信号中的存储
wavplay(d11,8192);
3.DTMF信号的检测识别
要实现电话拨号音(DTMF)信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。
这里采用FFT算法对信号进行解码分析。
首先对接收到的数字信号作FFT分析,计算出其幅度谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。
对于连续的双音多频(DTMF)信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用FFT算法对信号进行解码分析。
MATLAB实现信号音的识别如下:
%信号音识别
-------------------------------------------------------------
--functionvarargout=pushbuttonNUM_Callback(h,eventdata,
wavplay(NUM,8192);
n=L/1100;
number='
'
;
fori=1:
n
j=(i-1)*1100+1;
d=NUM(j:
j+999);
%截取出每个数字
f=fft(d,2048);
%以N=2048作FFT变换
a=abs(f);
p=a.*a/10000;
%计算功率谱
num
(1)=find(p(1:
250)==max(p(1:
250)));
%找行频
num
(2)=300+find(p(300:
380)==max(p(300:
380)));
%找列频
if(num
(1)<
180)row=1;
%确定行数
elseif(num
(1)<
200)row=2;
64
220)row=3;
elserow=4;
end
if(num
(2)<
320)column=1;
%确定列数
elseif(num
(2)<
340)column=2;
elsecolumn=3;
z=[row,column];
%确定数字
ifz==[4,2]tel=0;
elseifz==[1,1]tel=1;
elseifz==[1,2]tel=2;
elseifz==[1,3]tel=3;
elseifz==[2,1]tel=4;
elseifz==[2,2]tel=5;
elseifz==[2,3]tel=6;
elseifz==[3,1]tel=7;
elseifz==[3,2]tel=8;
elseifz==[3,3]tel=9;
t(i)=tel;
c=strcat(number,int2str(tel));
number=c;
i=i+1;
set(handles.edit3,'
number);
确定行频和列频的数值范围是通过计算得出的:
已知输入信号的取样频率
=8192Hz,而做FFT的N=2048,则频谱分辨率为
,由此可算出频谱图上任意点对应的频率
。
例如,数字8的高、低端频率为
则在谱图上对应的点
二、思考题
1.打印出一个数字拨号音的频谱图,加以分析说明,并解释DTMF信号的检测识别的原理。
数字拨号音‘1’的频谱图如图1,已知输入信号的取样频率
而做FFT的N=2048,则频谱分辨率为
数字‘1’的高、低端频率为
、
,则在谱图上对应的点
显然在频谱图中可以观察到点174和点302处分别出现了一个峰值。
图1:
拨号音‘1’频谱图
2.DTMF信号的检测识别的原理
要实现电话拨号音(DTMF)信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。
这里采用FFT算法对信号进行解码分析。
对于连续的双音多频(DTMF)信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用FFT算法对信号进行解码分析。
3.添加功能键,实现号码的预存储和来电识别。
考虑不同位数号码的存储实现。
设计面板如下图,程序当中预存储了3个号码,在‘#’号确认键程序中DTMF信号识别成功以后,添加如下代码,将识别的号码与电话本进行匹配:
图2GUI面板
预存储程序:
globalBOOK;
%定义全局电话薄
BOOK{1}='
10086'
%预存号码
BOOK{2}='
ChinaMobile'
BOOK{3}='
10000'
BOOK{4}='
ChinaTelecom'
BOOK{5}='
10010'
BOOK{6}='
ChinaUnion'
sum=length(BOOK);
temp=number;
%识别出的号码
forj=1:
sum-1
if(strcmp(BOOK{j},number))%与电话本中的号码匹配
temp=BOOK{j+1};
end
j=j+2;
end
set(handles.edit2,'
temp);
%在确认栏显示名称
例如输入‘10000’,按‘#’确认后,运行结果如图3
图3来电显示
储存新联系人的步骤是在拨号栏内输入号码,在确认栏内输入名称,点击储存即可,储存键的回调函数如下:
functionpushbutton13_Callback(hObject,eventdata,handles)
%获取号码
name=get(handles.edit2,'
%获取名称
BOOK{sum+1}=num;
%存入新联系人
BOOK{sum+2}=name;
例如将‘110’存为‘EmergencyNumber’,则再次输入‘110’,按‘#’确认后将显示号码如图4:
图4新存入联系人
一、实验效果分析(包括仪器设备等使用效果)
本次试验中实现了使用MATLAB来进行电话拨音信号的合成与识别,以及模拟电话号码的新增、识别和储存,掌握了通讯设备生成和识别拨音信号的基本原理和技术,为以后相关的通讯课程和实践打下了良好的基础。
二、教师评语
指导教师年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 实验 电话 号音 合成 识别
![提示](https://static.bdocx.com/images/bang_tan.gif)