双音多频拨号系统DTMF的实验报告
- 格式:doc
- 大小:202.00 KB
- 文档页数:21
双音多频DTMF 技术 (综合实验)一、实验目的1.了解数字信号处理理念中差分方程、DFT 与Z 变换的基本原理; 2.观察双音多频DTMF 信号的产生及检测;3.掌握DTMF 信令的产生及其检测在实际工程应用中的实现;二、实验原理双音多频DTMF (Dual Tone Multi Frequency )信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。
近年来DTMF 也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM 终端等。
DTMF 编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF 信号中检测击键或数字信息的存在性。
电话机键盘上每一个键通过由图12.1 所示的行频与列频唯一确定。
DTMF 的编解码方案无需过多的计算量,可以很容易的在DSP 系统里与其他任务并发执行。
图12.1 电话机键盘的频率矩阵由图12.1 可知,一个DTMF 信号由两个频率的音频信号叠加构成。
这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。
每一对这样的音频信号唯一表示一个数字或符号。
为了产生DTMF 信号,DSP 用软件产生两个正弦波叠加在一起后发送,解码时DSP 则采用改进的Goertzel 算法,从频域搜索两个正弦波的存在。
本实验即讨论DTMF 编解码在TI 的定点DSPTMS320VC54xx 上的实现。
1. DTMF 信号的产生DTMF 编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。
向DSP 装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。
典型的DTMF 信号频率范围是700Hz ~1700Hz ,选取8000Hz 作为采样频率,即可满足Nyquist 条件。
图 12.2 为数字振荡器对的框图。
由图知每个数字正弦振荡器可以表示为如下二阶系统函数:01212()1b H z a z a z -=++,其中,00sin b A ω=,102cos a ω=-,21a =。
DTMF信号检测系统设计(实验报告)报告分三部分Part1:实验过程描述Part2:g算法的matlab仿真Part3:g算法的verilog实现,及下载到de2上的效果Part 1实验过程描述Dtmf信号检测,即双频信号检测。
系统设计中,采用Goertzel算法。
N取205.实验步骤:ⅰGoertzel算法的matlab仿真,产生双频信号。
用于存入设计系统的.mif文件,来初始化系统中的存储器。
ⅱGoertzel算法的verilog实现,主要包括存储器数据读取模块,g 算法模块,幅度判决模块。
ⅲ系统quartus仿真及de2实现,用数码管显示存入的双频信号对应的电话拨号Part 2 g 算法的matlab 仿真举例f1=770,f2=1477 对应的电话拨号:650100150200250-20-1001020-4000-3000-2000-10000100020003000400001000200030004000Frequency (Hz)0-Centered PeriodogramDtmf Signal&fft5Square of xkPart 3 verilog实现Verilog代码生成的RTL_view仿真结果图:一个算法周期后输出0000_010对应号码6要继续的工作:利用nios软核搭建dtmf信号检测系统。
实现软硬协同的系统搭建过程。
另外去尝试利用wm8731实现实时检测。
主要参考文献:[1] 戈今朝,张禄林,钱玉美.一种新的基于Goertzel算法的信号检测方法.通信技术.2002,(9):16-18[2] altera databook.。
DTMF 信号的产生与检测一、 实验目的1、 了解语音拨号的产生和原理;2、 理解和掌握DTMF 信号的产生和检测;3、学会使用MATLAB 软件进行仿真分析;二、实验原理实际的拨号系统中,每一个按键都对应着一个高频信号和一个低频信号。
按下一个键之后,就会产生有一个相应的双音频信号。
通过一个窗函数就可以将其检测出来。
但在实际的过程中要考虑拨号时间之间的间隔。
窗的长短要合适,不能让窗同时滑过两个语音信号,否则就检测不出来。
Y[n]=cos(wl*t)+cos(wh*t)采用Goertzel 算法进行谱分析:Goertzel 算法本质上是一种非标准DFT ,它是DTMF 检测器的基础。
利用这种方法从输入信号中提取频谱信息有效且快速。
该算法实际上是利用双极点IIR 滤波器来有效地计算DFT 值。
一般的DFT 在开始处理之前都需要有一定的数据量,而Goertzel 算法的逐点递归结构就有明显的优点,可以有效地提高系统的响应速度。
Goertzel 滤波器在经过一定数量的样点N(等效于DFT 块的大小)后,输出便聚合到一个Go-ertzel 算法的内部变量Vii(n)上,并由它得出幅度的平方。
简单的数学描述如下:(1)递归计算:vdn)=2cos(2kn /N)·vdn .1).vk(n .2)+x(n)其中vd .1)=0,v 。
(-2)=0,x(n)=input ,n 0·N 。
(2)每N 次循环计算一次:Ix(k)12=yk(N)yk+(N)=V ,(N)+Vk2(N .1).2cos(2kn /N)W(N)Vd(N .1)由上面的分析可以看出,Goertzel 算法只需要对行频和列频及其相应的二次谐波,共计8个频点进行能量计算。
因为只需要少数的频率值并且只对这些值进行滤波,所以Goertzel 算法比DFT 快得多。
其中的二次谐波能量能够把DTMF 信号与声音信号区分开来。
Goertezl 算法的系统函数和流图如下图所示。
电工电子教学基地DSP课程设计实验报告实验名称:DTMF信号的产生及检测DTMF信号的产生及检测一、实验设计内容基本部分:1.使用C语言编写DTMF信号的发生程序,可以通过键盘的输入产生0~9对应的DTMF 信号,并且符合CCITT对DTMF信号规定的指标。
2.使用C语言编写DTMF信号的检测程序,检测到的DTMF编码在屏幕上显示。
发挥部分:利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指标,使每秒内传送的DTMF编码越多越好。
二、实验目的1、了解、掌握DTMF的性质作用。
2、掌握DTMF的产生和检测的思想和方法。
3、了解Goertzel算法优化运算过程。
4、熟练运用C语言进行编程实现DTMF的产生与检测。
5、熟练使用CCS5402的操作方法和调试检验方式。
三、实验器材DSP5402开发板两块,CCS软件环境四、实验原理双音多频DTMF(Dual Tone Multi-Frequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。
近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端等。
将DTMF信令的产生与检测集成到任一含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。
DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。
电话机键盘上每一个键通过由图1所示的行频与列频唯一确定。
DTMF的编解码方案无需过多的计算量,可以很容易的在DSP系统里与其他任务并发执行。
一个DTMF 信号由两个频率的音频信号叠加构成。
这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。
每组分别包括4 个频率,分别抽出一个频率进行组合就可以组成16 种DTMF 编码,分别记作0~9、*、#、A、B、C、D。
1、 DTMF信号的产生DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。
DSP课程设计实验报告DTMF信号的产生与检测指导老师:时间:1 设计任务书双音多频DTMF(Dual Tone Multi Frequency)信号是在按键式电话机上得到广泛应用的音频拨号信令,一个DTMF信号由两个频率的音频信号叠加构成。
这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。
每组分别包括4个频率,据CCITT的建议,国际上采用的这些频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz 和1633Hz等8种。
在每组频率中分别抽出一个频率进行组合就可以组成16种DTMF编码,从而代表16种不同的数字或功能键,分别记作0~9、*、#、A、B、C、D。
如下图所示。
图1-1 双音多频信号编码示意图要用DSP产生DTMF信号,只要产生两个正弦波叠加在一起即可;DTMF检测时采用改进的Goertzel算法,从频域搜索两个正弦波的存在。
1.1 实验目的掌握DTMF信号的产生和检测的DSP设计可使学生更加透彻的理解和应用奈奎斯特采样定理,与实际应用相结合,提高学生系统地思考问题和解决实际问题的能力。
通过对DSP 信号处理器及D/A和A/D转换器的编程,可以培养学生C语言编程能力以及使用DSP硬件平台实现数字信号处理算法的能力。
1.2 技术指标及设计要求1.2.1 基本部分1)使用C语言编写DSP下DTMF信号的产生程序,要求循环产生0~9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。
2)使用C语言编写DSP下DTMF信号的检测程序,检测到的DTMF编码在CCS调试窗口中显示,要求既不能漏检,也不能重复检出。
3) DTMF 信号的发送与接收分别使用不同的实验板完成。
1.2.2 发挥部分1) 使用一个DSP 工程同时实现DTMF 信号的发送和检测功能。
2) 改进DTMF 信号的规定指标,使每秒内可传送的DTMF 编码加倍。
实验4 双音多频(DTMF )接收与检测实验一、实验目的1.观测电话机发送的DT M F 信号波形;2.了解电话号码双音多频信号在程控交换系统中的接收和检测方法; 3.熟悉该电路的组成结构及工作过程。
二、实验电路工作过程DTMF 接收器包括D T MF 分组滤波器和D T MF 译码器,其基本原理如图4-1所示。
DTMF 接收器先经高、低群带通滤器进行fL / f H 区分,然后过零检测、比较,得到相应于D T MF 的两路f L 、fH 信号输出。
该两路信号经译码、锁存、缓冲,恢复成对应于16种D T MF 信号音对的4比特二进制码(D 1~D4)。
图4-1 典型DTM F 接收器原理框图图4-2 MT8870芯片管脚排列在本实验系统电路中,DTMF 接收器采用的是M T8870芯片。
图4-2为管脚排列图。
1.电路的基本特性(1)提供DTM F 信号分离滤波和译码功能,输出相应16种DTM F 频率组合的4位 并行二进制码。
(2)可外接3.5795M H z 晶体,与内含振荡器产生基准频率信号。
(3)具有抑制拨号音和模拟信号输入增益可调的能力。
(4)二进制码为三态输出。
18VDDD1 D2 D3 D4(4)提供基准电压(VDD\2)输出。
(5)电源+5V(6)功耗15mw(7)工艺CMOS(8)封装18引线双列直插2.管脚简要说明IN+ ,IN-运放同、反相输入端,模拟信号或D T MF信号从此端输入。
FB 运放输出端,外接反馈电阻可调节输入放大器的增益。
VREF 基准电压输出。
IC 内部连接端,应接地。
OSC1,OSC0振荡器输入、输出端,两端外接3.5795MH z晶体。
EN 数据输出允许端,若为高电平输入,即允许D01~D04输出,若为低电平输入,则禁止D01~D04输出。
DTMF(双音多频)技术调研报告学院电子工程学院班级卓越工程师班学号00101201姓名冉艳伟目录1.DTMF信号介绍1.1 DTMF信号基本释义1.2 DTMF的原理分析1.3 DTMF信号合成1.4 DTMF信号的识别2. DTMF的发展3.DTMF信号的应用3.1 新型DTMF信号收/发芯片MT8888及其应用3.2 MT8870双音多频收号器3.3 基于DTMF技术与射频技术的远程控制的实现3.3.1 电话通信的实现3.3.2 DTMF信号收、发芯片MT8880简介3.3.3 MT8880与单片机控制接口3.3.4 手机模块与单片机控制接口3.3.5 射频技术及其硬件电路设计3.3.6 远程控制应用实现3.3.7 软件实现3.4 利用DTMF信号传输监控数据3.4.l 原理简介3.4.2 总体设计3.4.3 分系统设计3.5 DTMF技术展望DTMF(双音多频)技术调研报告电子工程学院冉艳伟00101201摘要:双音多频DTMF(Dual Tone Multi-Frequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。
作为实现电话号码快速可靠传输的一种技术,它具有很强的抗干扰能力和较高的传输速度,因此,可广泛用于电话通信系统中。
但绝大部分是用电话的音频拨号。
另外,它也可以在数据通信系统中广泛地用来实现各种数据流和语音等信息的远程传输。
近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM 终端等。
将DTMF信令的产生与检测集成到任一含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。
引言:1876年.Alexander Graham Bell(贝尔)发明电话以后,双音多频(DTMF)技术最早被应用于电话领域。
双音多频(DTMF)技术以其简单、快速的特点不仅可以广泛的应用于无线传输中的先期调制阶段和工业遥控领域,而且经双音多频技术调制的信息可以直接通过电话线进行传输,实现电话网络的复合应用。
DSP 课程设计实验报告DTMF 信号的产生与检测指导老师:申艳老师 时 间: 2014年7月18日1 设计任务书双音多频DTMF(Dual Tone Multi Frequency)信号是在按键式电话机上得到广泛应用的音频拨号信令,一个DTMF信号由两个频率的音频信号叠加构成。
这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。
每组分别包括4个频率,据CCITT的建议,国际上采用的这些频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz 和1633Hz等8种。
在每组频率中分别抽出一个频率进行组合就可以组成16种DTMF编码,从而代表16种不同的数字或功能键,分别记作0~9、*、#、A、B、C、D。
如下图所示。
图1-1 双音多频信号编码示意图要用DSP产生DTMF信号,只要产生两个正弦波叠加在一起即可;DTMF检测时采用改进的Goertzel算法,从频域搜索两个正弦波的存在。
1.1 实验目的掌握DTMF信号的产生和检测的DSP设计可使学生更加透彻的理解和应用奈奎斯特采样定理,与实际应用相结合,提高学生系统地思考问题和解决实际问题的能力。
通过对DSP 信号处理器及D/A和A/D转换器的编程,可以培养学生C语言编程能力以及使用DSP硬件平台实现数字信号处理算法的能力。
1.2 技术指标及设计要求1.2.1 基本部分1)使用C语言编写DSP下DTMF信号的产生程序,要求循环产生0~9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。
2)使用C语言编写DSP下DTMF信号的检测程序,检测到的DTMF编码在CCS调试窗口中显示,要求既不能漏检,也不能重复检出。
3) DTMF 信号的发送与接收分别使用不同的实验板完成。
1.2.2 发挥部分1) 使用一个DSP 工程同时实现DTMF 信号的发送和检测功能。
2) 改进DTMF 信号的规定指标,使每秒内可传送的DTMF 编码加倍。
实验4 双音多频(DTMF)接收与检测实验一、实验目的1.观测电话机发送的DTMF信号波形;2.了解电话号码双音多频信号在程控交换系统中的接收和检测方法;3.熟悉该电路的组成结构及工作过程。
二、实验电路工作过程DTMF接收器包括DTMF分组滤波器和DTMF译码器,其基本原理如图4-1所示。
DTMF接收器先经高、低群带通滤器进行f L / f H区分,然后过零检测、比较,得到相应于DTMF的两路f L、f H信号输出。
该两路信号经译码、锁存、缓冲,恢复成对应于16种DTMF信号音对的4比特二进制码(D1~D4)。
图4-1 典型DTMF接收器原理框图18 VDD图4-2 MT8870芯片管脚排列在本实验系统电路中,DTMF接收器采用的是MT8870芯片。
图4-2为管脚排列图。
1.电路的基本特性(1)提供DTMF信号分离滤波和译码功能,输出相应16种DTMF频率组合的4位并行二进制码。
(2)可外接3.5795MHz晶体,与内含振荡器产生基准频率信号。
(3)具有抑制拨号音和模拟信号输入增益可调的能力。
(4)二进制码为三态输出。
(4)提供基准电压(VDD\2)输出。
(5)电源+5V(6)功耗15mw(7)工艺CMOS(8)封装18引线双列直插2.管脚简要说明IN+ ,IN-运放同、反相输入端,模拟信号或DTMF信号从此端输入。
FB 运放输出端,外接反馈电阻可调节输入放大器的增益。
VREF 基准电压输出。
IC 内部连接端,应接地。
OSC1,OSC0振荡器输入、输出端,两端外接3.5795MHz晶体。
EN 数据输出允许端,若为高电平输入,即允许D01~D04输出,若为低电平输入,则禁止D01 ~D04输出。
D01~D04 数据输出,它是相应于16种DTMF信号(高,低单音组合)的4位二进制并行码,为三态缓冲输出。
CI\GT 控制输入,若此输入电压高于门限值VTSt,则电路将接收DTMF单音对,并锁存相应码字于输出,若输入电压低于VTSt,则电路不接收新的单音对。
双音多频拨号系统DTMF的实验设计报告所谓双音多频(DTMF),就是用两个频率——行频和列频来表示电话机键盘上的一个数字。
DTMF 电话的指令正在迅速的取代脉冲指令。
除了在电话呼叫信号中使用外,DTMF 还广泛的使用在交互式控制应用,例如电话银行、电子邮件甚至家电远程控制等,用户可以从电话机发送DTMF 信号来做菜单选择。
本文基于MATLAB的双音多频拨号系统的仿真实现。
主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用 MATLAB 软件以及 DFT 算法实现对电话通信系统中拨号音的合成与识别。
并进一步利用 MATLAB 中的图形用户界面 GUI 制作简单直观的模拟界面。
还能够利用矩阵不同的基频合成 0 - 9 不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程,进一步利用 GUI 做出了简单的图形操作界面。
本文具有界面清楚,画面简洁,易于理解,操作简单的优点,从而实现对电话拨号音系统的简单的信号仿真。
关键词:双音多频(DTMF) MATLAB GUI 信号仿真在电话中,数字0~9的中每一个都用两个不同的单音频传输,所用的8个频率分成高频带和低频带两组,低频带有四个频率:679Hz,770Hz,852Hz和941Hz;高频带也有四个频率:1209Hz,1336Hz,1477Hz和1633Hz.。
每一个数字均由高、低频带中各一个频率构成,例如1用697Hz和1209Hz两个频率,信号用表示,其中,。
这样8个频率形成16种不同的双频信号。
一,利用GUI 作图(简单的电话界面)如下:利用 GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和电话机的键盘矩阵对应起来。
其中选用我们熟悉的 10 个数字键0 — 9 , 3 个功能键“ 回删”、“拨号”,“解码”。
按照图电话机键盘矩阵的排列方式制作五行三列的按键控件。
每个按键可用( Push Button )添加。
静态文本框可用( Static Text )添加,如图再加个解码键( Push Button )二,再点运行,得出与上图对应的m文件,再用鼠标右击上图的每个键,点callback导入每个键的编译程序如下:1,按键1的程序:% --- Executes on button press in pushbutton4. function pushbutton4_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); % 把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];%每个数字1000个采样点y=sin(0.5345*n)+sin(0.9272*n);%对应行频列频时域叠加,数字1的低频697Hz和高频1209Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);%100个0模拟静音信号global NUMphone=[NUM,y];% 循环储存NUM=[phone,space]; % 储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'1'];set(handles.text1,'string',[NoCtrl]);end2,按键2的程序:function pushbutton5_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is tooelsen=[1:1000];% 每个数字1000个采样点y=sin(0.5345*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字2的低频697Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUMphone=[NUM,y]; %循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'2'];set(handles.text1,'string',[NoCtrl]);end3.按键3的程序:% --- Executes on button press in pushbutton6. function pushbutton6_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is tooelsen=[1:1000];% 每个数字1000个采样点y=sin(0.5345*n)+sin(1.1328*n);% 对应行频列频时域叠加,数字3的低频697Hz和高频1477Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUMphone=[NUM,y]; %循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'3'];set(handles.text1,'string',[NoCtrl]);end4,按键4的程序:% --- Executes on button press in pushbutton10. function pushbutton10_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is tooelsen=[1:1000];% 每个数字1000个采样点y=sin(0.5905*n)+sin(0.9272*n);% 对应行频列频时域叠加,数字4的低频770Hz和高频1209Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUMphone=[NUM,y]; %循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'4'];set(handles.text1,'string',[NoCtrl]);end5,按键5的程序:% --- Executes on button press in pushbutton9. function pushbutton9_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];%每个数字1000个采样点vy=sin(0.5905*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字5的低频770Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUMphone=[NUM,y];% 循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'5'];set(handles.text1,'string',[NoCtrl]);end6,按键6的程序:% --- Executes on button press in pushbutton8. function pushbutton8_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];% 每个数字1000个采样点y=sin(0.5905*n)+sin(1.1328*n);% 对应行频列频时域叠加,数字6的低频770Hz和高频1477Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUMphone=[NUM,y];% 循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'6'];set(handles.text1,'string',[NoCtrl]);end7,按键7的程序:% --- Executes on button press in pushbutton13. function pushbutton13_Callback(hObject, eventdata,handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];% 每个数字1000个采样点y=sin(0.6534*n)+sin(0.9272*n);% 对应行频列频时域叠加,数字7的低频852Hz和高频1209Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUMphone=[NUM,y];% 循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'7'];set(handles.text1,'string',[NoCtrl]);end8,按键8的程序:% --- Executes on button press in pushbutton12.function pushbutton12_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];% 每个数字1000个采样点y=sin(0.6534*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字8的低频852Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUMphone=[NUM,y]; %循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'8'];set(handles.text1,'string',[NoCtrl]);end% --- Executes on button press in pushbutton14. function pushbutton14_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];% 每个数字1000个采样点y=sin(0.6534*n)+sin(1.1328*n);% 对应行频列频时域叠加,数字9的低频852Hz和高频1477Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUMphone=[NUM,y];% 循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'9'];set(handles.text1,'string',[NoCtrl]);end% --- Executes on button press in pushbutton17. function pushbutton17_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); %把数字显示在屏幕上if(length(x)>15)errordlg('Sorry . The number you have input is too long !','Input Error•','modal')elsen=[1:1000];每个数字1000个采样点y=sin(0.7217*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字0的低频941Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUMphone=[NUM,y];% 循环储存NUM=[phone,space]; %储存连续的拨号音信号NoCtrl=x;NoCtrl=[NoCtrl,'0'];set(handles.text1,'string',[NoCtrl]);end11,按键#号程序:% --- Executes on button press in pushbutton16. function pushbutton16_Callback(hObject, eventdata, handles)set(handles.text1,'string',['']);set(handles.tbutton,'visible',['off']);set(handles.tbutton,'value',[0]);clear all12,按键*的程序:% --- Executes on button press in pushbutton18. function pushbutton18_Callback(hObject, eventdata, handles)set(handles.text1,'string',['']);set(handles.tbutton,'visible',['off']);set(handles.tbutton,'value',[0]);clear all13,回删键的程序:% --- Executes on button press in pushbutton20. function pushbutton20_Callback(hObject, eventdata, handles)x=get(handles.text1,'string');% 把数字显示在屏幕上if(isempty(x))errordlg('Please input the phone No.','Input error','modal')elsexll=length(x);x(xll)=[];%去掉末尾号在面板上的显示set(handles.text1,'string',[x]);global NUMll=length(NUM);%删除末尾号码在拨号音信号中的储存for i=ll-1100+1:llNUM(ll)=[];ll=length(NUM);endend14,拨号键的程序:% --- Executes on button press in pushbutton21. function pushbutton21_Callback(hObject, eventdata, handles)x=get(handles.text1,'string'); % 把数字显示在屏幕上xx=str2num(x);if(isempty(NUM))errordlg('Please input the phone No.','Input error','modal')elsewavplay(NUM,8192);msgbox('拨号成功!若需再次拨号请按#号复位!','Done','help')set(handles.tbutton,'visible',['on']);set(handles.text1,'string',['Dieling Done.']); end14,关闭键的程序:% --- Executes on button press in pushbutton22. function pushbutton22_Callback(hObject, eventdata, handles)clear allclose all15,解码的程序:% --- Executes on button press in tbotton.function tbotton_Callback(hObject, eventdata, handles)L=length(NUM);n=L/1100;number='';for i=1:nj=(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;elseif (num(1) < 220) row=3;else row=4;endif (num(2) < 320) column=1; %确定列数elseif (num(2) < 340) column=2;else column=3;endz=[row,column]; % 确定数字if z==[4,2] tel=0; %0在4行2列elseif z==[1,1] tel=1; %1在1行1列elseif z==[1,2] tel=2; %2在1行2列elseif z==[1,3] tel=3; %3在1行3列elseif z==[2,1] tel=4; %4在2行1列elseif z==[2,2] tel=5; %5在2行2列elseif z==[2,3] tel=6; %6在2行3列elseif z==[3,1] tel=7; %7在3行1列elseif z==[3,2] tel=8; %8在3行2列elseif z==[3,3] tel=9; %9在3行3列endt(i)=tel;c=strcat(number,int2str(tel));number=c;i=i+1;endset(handles.text1,'string',['解码中...']);h = waitbar(0,'Decoding...Please wait...'); steps = 1500;for step = 1:steps% computations take place herewaitbar(step / steps)endclose(h);set(handles.text1,'string',number);% hObject handle to tbotton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)三,运行以上程序调出如下图界面:即可以进行仿真拨号。