实验1 双音多频电话拨号音产生实验报告
数字信号处理在多音频拨号系统中的应用实验
实验四:数字信号处理在多音频拨号系统中的应用1、实验目的了解电话中双音多频(DMTF)信号的产生与检测1、程序清单%DTMF双音多频拨号信号的生成和检测仿真程序:exp6.m tm=[1,2,3,65;4,5,6,66;7,8,9,67; 42,0,35,68];%DTMF信号代表的16个数N=205;K=[18,20,22,24,31,34,38 ,42]; %8个基频对应的8个K值f1=[697,770,852,941];%行频率向量f2=[1209,1336,1477,1633];%列频率向量TN=input('键入6位电话号码='); %输入6位数字TNr=0%接受段电话号码初值为零form=1:6;%分别对每位号码数字处理:产生信号,发声,检测d=fix(TN/10^(6-m));%计算出第m位号码数字TN=TN-d*10^(6-m);for p=1:4;for q=1:4;iftm(p,q)==abs(d);break,end %检测与第m位号码相符的列号qendiftm(p,q)==abs(d);break,end %检测与第m位号码相符的列号pendn=0:1023;%为了发声,加长序列x=sin(2*pi*n*f1(p)/8000)+sin(2*pi* n*f2(q)/8000);%构成双频信号sound(x,8000);%发出声音pause(0.1)%相邻号码响声之间加0.1秒停顿%接受检测端的程序X=goertzel(x(1:N),K+1);%用Goertzel算法计算八点DFT样本val=abs(X);%列出八点DFT的模subplot(3,2,m);stem(K,val,'.');grid;xl abel('k');ylabel('|X(k)|')%画出8点DFT的幅度axis([10 50 0 120])limit=80;%基频检测门限为80for s=5:8;ifval(s)>limit,break,end %查找列号endfor r=1:4;ifval(r)>limit,break,end %查找行号endTNr=TNr+tm(r,s-4)*10^(6-m);%强6位电话号码表示成一个6位数,以便显示enddisp('接收端检测到的号码为:')disp(TNr)%显示接收到的6位电话号码%此程序为exp6的改进程序,与exp6的区别是:%(1)增加了输入电话号码长度判别语句,保证输入位数为6为;%(2)增加了首位非0识别,能保证类似"012345、001234、000123、000000"号码正确识别与显示.clc;clear;tm=[1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,6 8];N=205;K=[18,20,22,24,31,34,38,42];f1=[697,770,852,941];f2=[1209,1336,1477,1633];first_flag=0;TN0=input('please input telephone number (8bit) is =','s'); %输入6位电话号码,以字符型输入TN=str2num(TN0); %将字符型转换为实数类型len=length(TN0);%将字符型数据的长度if len==8 %若输入位数为6位,则顺序执行;否则输入号码不是6位(少于6位或大于6位),则输出错误提示信息TNr=0;for m=1:8d=fix(TN/10^(8-m));TN=TN-d*10^(8-m);temp_number(m)=d; %将每位号码保存在数组中for p=1:4for q=1:4if tm(p,q)==abs(d)break;endendif tm(p,q)==abs(d)break;endendn=0:1023;x=sin(2*pi*n*f1(p)/8000)+sin(2*pi*n*f2 (q)/8000);sound(x,8000);pause(0.2);X=goertzel(x(1:N),K+1);val=abs(X);subplot(4,2,m);stem(K,val,'.');grid;xlabel('K');ylabel('|X(k)|');axis([10 50 0 120]);limit=80;for j=5:8if val(j)>limitbreak;endendfor r=1:4if val(r)>limitbreak;endendTNr=TNr+tm(r,j-4)*10^(8-m);if (m==1)&(TNr==0)first_flag=1;endendif(first_flag==1) %判断首位是否为0,如果为0,显示结果将补0,直至首位非0位add_zero='0';%字符型变量初始化temp_zero='0';for k=2:5if temp_number(k)==0 %判断需要补几位0,此程序的目的是要保证类似“001234、000123、000000”显示正确add_zero=strcat(add_zero,temp_zero); %字符型变量组合elsebreak;endendTNr_disp_0=num2str(TNr); %实数型变量转字符型变量TNr_disp=strcat(add_zero,TNr_disp_0);first_flag=0;elseTNr_disp=num2str(TNr);add_zero='';endTNr_disp_0=num2str(TNr);TNr_disp=strcat(add_zero,TNr_disp_0) disp('telephone number from the receiver is:');disp(TNr_disp);elsedisp(TN0);disp('please input the right telephone number(8 bit)');end%DTMF双音多频拨号信号生成与检测,滤波器组方法%此程序为滤波器组方法的改进程序,与原有滤波器组方法的区别是:%(1)增加了输入电话号码长度判别语句,保证输入位数为6为;%(2)增加了首位非0识别,能保证类似"012345、001234、000123、000000"号码正确识别与显示.clc;clear;%首先设计带通滤波器组,利用滤波器组检测信号rp=1;rs=30;fs=8000; %采样频率8kHzfpl1=677;fph1=717;fsl1=657;fsh1=737; fpl2=750;fph2=790;fsl2=730;fsh2=810; fpl3=832;fph3=872;fsl3=812;fsh3=892; fpl4=921;fph4=961;fsl4=901;fsh4=981; fpl5=1179;fph5=1239;fsl5=1149;fsh5=1269;fpl6=1306;fph6=1366;fsl6=1276;fsh6=1 396;fpl7=1447;fph7=1507;fsl7=1417;fsh7=1 537;fpl8=1603;fph8=1663;fsl8=1573;fsh8=1 693;wpl1=fpl1/(fs/2);wph1=fph1/(fs/2);wsl1=fsl1/(fs/2);wsh1=fsh1/(fs/2);wpl2=fpl2/(fs/2);wph2=fph2/(fs/2);wsl2=fsl2/(fs/2);wsh2=fsh2/(fs/2);wpl3=fpl3/(fs/2);wph3=fph3/(fs/2);wsl3=fsl3/(fs/2);wsh3=fsh3/(fs/2);wpl4=fpl4/(fs/2);wph4=fph4/(fs/2);wsl4=fsl4/(fs/2);wsh4=fsh4/(fs/2);wpl5=fpl5/(fs/2);wph5=fph5/(fs/2);wsl5=fsl5/(fs/2);wsh5=fsh5/(fs/2);wpl6=fpl6/(fs/2);wph6=fph6/(fs/2);wsl6=fsl6/(fs/2);wsh6=fsh6/(fs/2);wpl7=fpl7/(fs/2);wph7=fph7/(fs/2);wsl7=fsl7/(fs/2);wsh7=fsh7/(fs/2);wpl8=fpl8/(fs/2);wph8=fph8/(fs/2);wsl8=fsl8/(fs/2);wsh8=fsh8/(fs/2);wp1=[wpl1 wph1];ws1=[wsl1 wsh1]; wp2=[wpl2 wph2];ws2=[wsl2 wsh2]; wp3=[wpl3 wph3];ws3=[wsl3 wsh3]; wp4=[wpl4 wph4];ws4=[wsl4 wsh4]; wp5=[wpl5 wph5];ws5=[wsl5 wsh5]; wp6=[wpl6 wph6];ws6=[wsl6 wsh6]; wp7=[wpl7 wph7];ws7=[wsl7 wsh7]; wp8=[wpl8 wph8];ws8=[wsl8 wsh8];[N1,wc1]=buttord(wp1,ws1,rp,rs) [Bz1,Az1]=butter(N1,wc1)[N2,wc2]=buttord(wp2,ws2,rp,rs) [Bz2,Az2]=butter(N2,wc2)[N3,wc3]=buttord(wp3,ws3,rp,rs) [Bz3,Az3]=butter(N3,wc3)[N4,wc4]=buttord(wp4,ws4,rp,rs) [Bz4,Az4]=butter(N4,wc4)[N5,wc5]=buttord(wp5,ws5,rp,rs) [Bz5,Az5]=butter(N5,wc5) [N6,wc6]=buttord(wp6,ws6,rp,rs)[Bz6,Az6]=butter(N6,wc6)[N7,wc7]=buttord(wp7,ws7,rp,rs)[Bz7,Az7]=butter(N7,wc7)[N8,wc8]=buttord(wp8,ws8,rp,rs)[Bz8,Az8]=butter(N8,wc8)%产生DTMF信号tm=[1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,6 8]; %DTMF信号代表的16个数字%N=205;%K=[18,20,22,24,31,34,38,42]; %8个基频对应的8个k值f1=[697,770,852,941];f2=[1209,1336,1477,1633];first_flag=0;TN0=input('please input telephone number (6bit) is =','s'); %输入6位电话号码,以字符型输入TN=str2num(TN0); %将字符型转换为实数类型len=length(TN0);%将字符型数据的长度if len==6 %若输入位数为6位,则顺序执行;否则输入号码不是6位(少于6位或大于6位),则输出错误提示信息TNr=0;for m=1:6d=fix(TN/10^(6-m));TN=TN-d*10^(6-m);temp_number(m)=d; %将每位号码保存在数组中for p=1:4for q=1:4if tm(p,q)==abs(d) %检测列号break;endendif tm(p,q)==abs(d) %检测行号break;endendn=0:1023;x=sin(2*pi*n*f1(p)/8000)+sin(2*pi*n*f2 (q)/8000); %产生双频信号sound(x,8000);pause(0.1);%用滤波器组检测DTMFy1=filter(Bz1,Az1,x);y2=filter(Bz2,Az2,x);y3=filter(Bz3,Az3,x);y4=filter(Bz4,Az4,x);y5=filter(Bz5,Az5,x);y6=filter(Bz6,Az6,x);y7=filter(Bz7,Az7,x);y8=filter(Bz8,Az8,x);y=[y1;y2;y3;y4;y5;y6;y7;y8];figure;for k=1:8yy=y(k,:);subplot(4,2,k);plot(n,yy,'-');endlimit=0.6;for j=5:8if (max(abs(y(j,:)))>limit)break;endendfor r=1:4if (max(abs(y(r,:)))>limit)break;endendTNr=TNr+tm(r,j-4)*10^(6-m);if (m==1)&(TNr==0)first_flag=1;endendif(first_flag==1) %判断首位是否为0,如果为0,显示结果将补0,直至首位非0位add_zero='0';%字符型变量初始化temp_zero='0';for k=2:5if temp_number(k)==0 %判断需要补几位0,此程序的目的是要保证类似“001234、000123、000000”显示正确add_zero=strcat(add_zero,temp_zero); %字符型变量组合elsebreak;endendTNr_disp_0=num2str(TNr); %实数型变量转字符型变量TNr_disp=strcat(add_zero,TNr_disp_0);first_flag=0;elseTNr_disp=num2str(TNr);add_zero='';endTNr_disp_0=num2str(TNr);TNr_disp=strcat(add_zero,TNr_disp_0) disp('telephone number from the receiver is:');disp(TNr_disp);elsedisp(TN0);disp('the telepone number is wrong, please input the right telephone number(6 bit)');end3、仿真波形 输入123456输入123456781020304050050100k|X (k )|1020304050050100k|X (k )|1020304050050100k|X (k )|1020304050050100k|X (k )|1020304050050100k|X (k )|1020304050050100k|X (k )|2、 思考题简述DTMF 信号的参数:采样频率、DFT 的变换点数以及观测时间的确定原则。
双音多频拨号系统仿真设计报告
双音多频拨号系统仿真设计报告首先,我们需要了解双音多频拨号系统的原理。
在DTMF系统中,每个按键都被映射到一个由两个频率组成的音调。
这些频率包括低频组(697Hz,770Hz,852Hz,941Hz)和高频组(1209Hz,1336Hz,1477Hz,1633Hz)。
通过同时发送低频和高频信号,我们就可以识别出用户所按下的按键。
为了设计一个可靠的DTMF拨号系统,我们需要进行系统的仿真设计。
首先,我们需要使用MATLAB等工具来实现DTMF信号的产生。
这可以通过使用矩阵乘法来实现,其中每个按键对应一个DTMF信号,并且通过调整每个信号的振幅和长度来控制其音调。
在仿真时,我们可以模拟用户按下按键来产生相应的DTMF信号。
然后,我们需要设计一个数字滤波器来对DTMF信号进行分析和处理。
这个数字滤波器通常被称为带通滤波器,它可以对特定的频率范围内的信号进行增益。
为了实现这个滤波器,我们需要使用数字滤波器设计工具,例如巴特沃斯滤波器或IIR滤波器。
通过将DTMF信号传递给数字滤波器,我们可以将其分解成低频组和高频组,并且可以判断出用户所按下的按键。
通过以上的仿真设计,我们可以模拟出一个完整的双音多频拨号系统。
通过调整输入的按键和观察界面显示的结果,我们可以验证系统的正确性和可靠性。
此外,通过对系统进行性能测试,我们还可以评估系统的响应时间和稳定性等指标。
总结起来,双音多频拨号系统仿真设计报告主要介绍了DTMF系统的原理和设计过程。
通过使用MATLAB等工具,我们可以实现DTMF信号的产生和分析,并通过设计合适的数字滤波器进行信号处理。
通过设计一个交互式界面,我们可以模拟整个DTMF拨号系统的运行过程,并评估其性能和可靠性。
多种信号的产生
深圳大学实验报告
课程名称:现代通信原理
实验项目名称:通信原理多种信号的产生
学院:信息工程
专业:通信工程
指导教师:苏恭超
报告人:王志鹏学号:2012130200 班级:通信2班实验时间:2014.10.23
实验报告提交时间:2014.11.6
教务处制
实验1-3数据
实验结论:
:1、信源编码中用同步信号源后,能避免信号接收不连续的现象,因而实验者能观测到稳定的编码。
、电话拨号有两种,脉冲和音频,所谓音频也称双音多频(
拨号时每按一个键,有两个音频频率叠加成一个双音频信号,十二个按键由七个音频频率区分。
双音多频信号),电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。
双音多频的拨号键盘的矩阵,每一行代表一个低频,每一列代表一个高频。
每按一个键就发送一个高频和低频的正弦信号组'1'相当于697和1209赫兹(Hz)。
交换机可以解码这些频率组合并确定所对应的按键。
:1、绝对码和相对码的变化关系是异或运算。
若绝对码是
,则其相对码与前一个相对码相同。
:1. 双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。
每按一个键就发送一个高频和低频的正弦信号组合,比如'1'相当于697和1209。
频谱分析的应用--话拨号音合成与识别
WNm = e
−
2π N
m
。
由于对 DTMF 信号解码只需其频谱的幅值信息,因而可舍去相位信息,输出频谱的 幅度平方值,即
X [m = ]
2ห้องสมุดไป่ตู้
ym [ N = Qm [ N ] + Qm [ N − 1] − 2 cos ]
2.DTMF 信号识别 DTMF 信号的检测是将两个信号频率提取出来,从而确定所接收的 DTMF 是哪个数 字。利用 DFT 对 DTMF 信号进行 N 点的频谱分析,根据谱峰出现的频率点位置 Ni 就可
以确定 DTMF 信号的频率 fi:
f = Ni × f s / N i
DTMF 信号的解码要求快速、简单、准确,Goertzel 算法比 FFT 算法更为有效适用。 因为 FFT 涉及较多的复数乘法和加法,Goertzel 算法可以将复数运算转化为实数运算,从 而减少了计算量,提高了计算速度。Goertzel 算法的基本思想是对 DFT 公式进行转换, 使其成为一个二阶传输函数:
= x[n] sin(ωH n) + sin(ωL n)
式中:ωH 2 = = π f H / f s , ωL 2π f L / f s 分别表示高频低频频率,电话信号的典型抽样频率 为 f s = 8kHz 。 DTMF 信号的标准是:在传送过程中每个按键字占用 100ms,其中信号必须持续至少 40ms,且不得多于 55ms,100ms 里的其余时间为静音(无信号) 。 表 4.1 按键频率对应表 fL 697 Hz 770 Hz 852 Hz 941 Hz W=2pi*fL/fs rad/s 697 Hz 770 Hz 852 Hz 941 Hz 0.5474 0.6048 0.6692 0.7391 N=106 m 9.2 10.2 11.2 12.47 fH 1209 Hz 1 4 7 * m 取整 9 10 11 12 1209 Hz 1336 Hz 1477 Hz 1336 Hz 2 5 8 0 W=2pi*fH/fs rad/s 0.9495 1.0493 1.1600 1477 Hz 3 6 9 # N=106 m 16.02 17.70 19.57 m 取整 16 18 20
实验一、双音多频信号发生器1
实验一、双音多频信号发生器本实验需要产生两个不同频率的正弦信号,其中一个我们把它设定为750HZ,另外一个设定为1500HZ,然后将两个信号叠加在一起。
我们知道双音多频信号是在两个不同频率正弦波叠加的基础上在100ms时间内产生至少45ms的信号,然后剩下的时间保持静音。
在这里我们用一个计数器来控制时间。
首先进入Matlab,在菜单栏选择File>New>Model新建一个模型文件。
并给这个模型文件取名保存,本示例中,将文件保存为dtmf.mdl。
在dtmf文件窗口的工具栏点击Library Browser按钮,打开Simulink Library Browser窗口。
在Simulink Library Browser窗口中,点击展开Altera DSP Builder目录,可以看到DSP Builder工具支持的各种模型和组件。
这些组件可以被Simulink方便的调用来建立模型,在设计完成并验证通过之后,DspBuilder工具能将其直接转化成硬件描述语言,从而在硬件上实际运行并验证设计。
在Simulink Library中选择Altera DSP Builder>Rate Change>clockaltr,将输入频率设置为24khz,改名为clk。
在Simulink Library中选择Simulink>Sources>Pulse Generator,命名为Pulse,参数设置成如下所示再添加一个计数器模块用来计数控制后面的信号输出,在Simulink Library中选择Altera DSP Builder>Arithmetic>Increment Decrement,命名为Inc,输出位宽设置成11位,因为采样频率为24K,在100ms应该有2400个点,50ms能记1200个点。
让计数器的值与设定的常数1024做比较,当计数超过1024时,输出一个低电平,让随后产生的双音多频信号保持静音。
北邮双音多频MATLAB实验报告
n=0:204; for i=1:10 a1=[0,a10(i)];a2=[0,a20(i)];b1=[1,b11(i),1];b2=[1,b21(i),1]; y(i,:)=filter(a1,b1,h)+filter(a2,b2,h); %两个冲激响应相叠加 end tone=y(d+1,:); %tone 为相应的按键音(正弦函数) figure(1) for t=1:10 subplot(5,2,t) plot(n/205,y(t,:));title(strcat('数字键',num2str(t-1))); end
end disp('双音多频信号已生成并发出') disp('接收端检测到的号码: ') disp(setstr(d_out)) 程序调试截图
信号频谱图:
观察上面的频谱图,说明接收信号正好是‘78934620’ ,输入输出一致,程序运 行无误 实验总结 这次 matlab 实验明显比之前的有难度, 在掌握了第四章 IIR 数字滤波器设计相关 知识的基础上又有了新的拓展和延伸。过程中出现了一些问题,比如 GOERTZEL 函数实现, 矩阵长度不匹配导致程序不断报错,在自己的研究和同学的帮助下总 算完成了实验,对于 matlab 编程有了深入的了解
DTMF 信号检测(GOERTZEL 算法)
VK X(n) z-1 yK(n)
z-1 z-1
MATLAB 代码 f=[697 770 852 941 1209 1336 1477 1633]; fs=8000; fn=fs/N; k=f/fn; x=[ysin,zeros(1,N)]; tic;%timer start Vk(1)=0;Vk(2)=0; for i1=1:8 w=2*cos(2*pi*k(i1)/N); for j1=3:N Vk(j1)=w.*Vk(j1-1)-Vk(j1-2)+x(j1); end Xk(i1)=Vk(N).^2+Vk(N-1).^2-w*Vk(N)*Vk(N-1); end X=Xk/100; 主程序 N=205; tm=[49,50,51;52,53,54;55,56,57;0,48,0]; f=[697 770 852 941 1209 1336 1477 1633]; d_in=input('请输入电话号码: ','s'); %输入信号 d_in for l=1:8 d=d_in(l)-48; d_tone=dsin(d); %产生拨号音 sound(d_tone,8000); %播放拨号音 pause(0.2) X=GOERT(d_tone,N); % GOERT 算法求出接收端信号的频率分量 value=abs(X); figure(2) subplot(4,2,l) stem(f,value,'.');grid; set(gca,'XTick',f); title('FFT x(n)');xlabel('频率 k/Hz');ylabel('幅度|X(k)|'); limit=50; %设置门限值 for s=5:8 if value(s)>limit break; %高频门限检测 end end for r=1:4 if value(r)>limit break; %低频门限检测 end end d_out(l)=tm(r,s-4); %还原信号
双音多频DTMF接收实验
《程控交换》实验报告实验四 双音多频DTMF 接收实验----------------------------------------------------------------------------------------------------------------------一、实验目的1、了解电话号码双音多频信号在程控交换系统中的发送和接收方法。
2、熟悉该电路的组成及工作过程。
二、实验内容1、用示波器观察发送DTMF 信号的波形。
2、用示波器观察DTMF 信号接收的波形。
三、实验原理1、双音多频拨号简单介绍:在电话单机中,有两种拨号方式,即脉冲拨号 和双音多频拨号。
双音多频拨号方式中的双音多频是指用两个特定的单 音频信号的组合来代表数字或功能,两个单音频的频率不同,所代表的 数字和功能也不同,在双音多频电话机中有16个按键,其中有10个数 字键0~9,6个功能键*、#、A 、B 、C 、D ,按照组合的原理,它必须有8 种不同的单音频信号,由于采用的频率有8种,故又称之为多频,又因 以8种频率中任意抽出2种进行组合,又称其为8中取2的编码方式。
2、双音多频接收电路:3、电路的工作原理:它完成典型DTMF 接收器的主要功能:输入信号的高、低频 组带通滤波、限幅、频率检测与确认、译码、锁存与缓冲输出及振荡,监测 等,具体说就是DTMF 信号从芯片的输入端输入,经过输入运放和拨号音抑 制滤波器进行滤波后,分两路分别进入高、低频组滤波器以分离检测出高、 低频组信号。
如果高、低频组信号同时被检测出来,便在EC 0输出高电平作 为有效检测DTMF 信号的标志;如果DTMF 信号消失,则EC 0即返至低电平, 与此同时EC 0通过外接R 向C 充电,得到CI ,GT 。
(通常此两端相短接)积 分波形,如图5-4所示,若经t GTP 延时后,CI ,GT 。
电压高于门限值V Tst 时, 产生内部标志,这样,该电路在出现EC 0标志时,将证实后的两单音送往译 码器,变成4比特码字并送到输出锁存器,而CI 标志出现时,则该码字送信号输入到三态输出端D01——D04,另外CI信号经形成和延时,从CID端输出,提供一选通脉冲,表明该码字已被接收和输出已被更新,如若积分电压降到门限VTst以下,使CID也回到低电平。
双音多频
信号工程处理课设报告——双音多频(DTMF)信号的检测专业:通信工程学号:09024121姓名:宋江雪完成日期:2012.5一.实验目的1.理解 DTMF 信号的产生原理及其检测方法2.提高分析和解决问题的能力3.提高数字信号处理的实际能力二、实验内容1.设置参数,读入电话号码。
2.根据输入的电话号码产生包含两个频率分量的 205 点时域离散DTMF 信号。
3.对时域离散 DTMF 信号利用Goertzel 算法(参见附录)进行频率检测,画出幅度谱。
4.根据幅度谱的两个峰值,分别查找并确定所输入的电话号码。
小提示:因为程序产生的是纯音调信号,所以不需检测二次谐波分量以区分语音和按键音调信号。
三、实验原理双音多频(Dual Tone Multi Frequency, DTMF )信号是音频电话中的拨号信号,由美国AT&T 贝尔公司实验室研制,并用于电话网络中。
这种信号制式具有很高的拨号速度,且容易自动监测识别,很快就代替了原有的用脉冲计数方式的拨号制式。
这种双音多频信号制式不仅用在电话网络中,还可以用于传输十进制数据的其它通信系统中,用于电子邮件和银行系统中。
这些系统中用户可以用电话发送DTMF 信号选择语音菜单进行操作。
DTMF 信号系统是一个典型的小型信号处理系统,它要用数字方法产生模拟信号并进行传输,其中还用到了D/A 变换器;在接收端用A/D 变换器将其转换成数字信号,并进行数字信号处理与识别。
为了系统的检测速度并降低成本,还开发一种特殊的DFT 算法,称为戈泽尔(Goertzel)算法,这种算法既可以用硬件(专用芯片)实现,也可以用软件实现。
下面首先介绍双音多频信号的产生方法和检测方法,包括戈泽尔算法,最后进行模拟实验。
1. 双音多频(DTMF )信号的组成在电话中,数字0~9的中每一个都用两个不同的单音频传输,所用的8个频率分成高频带和低频带两组,低频带有四个频率:679Hz,770Hz,852Hz 和941Hz ;高频带也有四个频率:1209Hz,1336Hz,1477Hz 和1633Hz.。
信与系统实验电话拨音的合成与分解
1. Set
功能:设置对象属性。
基本调用格式:set(H,'PropertyName',PropertyValue,...) 用属性值'PropertyValue'设置关于用参量 H 标志的对象(一个或多个)的属性名'PropertyName'(一个或多个)。H 可以为一句柄的向量。在这种情形下,命令 set 可以设置所有对象的属性值。
n=[1:1000]; % 每个数字 1000 个采样点表示
d0=sin(2*pi*697/8192*n)+sin(2*pi*1209/8192*n); % 对应行频列频叠加
n0=strcat(get,'string'),'1'); % 获取数字号码
set,'string',n0); % 显示号码
space=zeros(1,100); %100 个 0 模拟静音信号
end
t(i)=tel;
c=strcat(number,int2str(tel));
number=c;
i=i+1;
end
msgbox(strcat('拨打的号码为:',number),'分析');
程序解释: 确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率fs=8192Hz ,而做 FFT 的 N=2048,则频谱分辨率为
2. DTMF 信号的产生合成
现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对 文件进行编辑。其主要的功能是使对应的按键,按照表 1 的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。 鉴于 CCITT 对 DTMF 信号规定的指标,这里每个数字信号取 1000 个采样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模拟静音。以便区别连续的两个按键信号。间隔的静音信号也是在按键时产生的。 以按键 1 为例,简单介绍拨号音产生的过程:
双音多频(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输出。
双音多频检测实验
双音多频检测实验一、实验目的1、加强对用户接口信令的认识与理解2、掌握双音多频检测的基本原理3、熟悉CM8870双音多频检测器件的性能及使用方法二、实验仪器1、J H5001通信原理综合实验系统一台2、20MHz双踪示波器一台3、数字存贮示波器一台4、电话机二部三、实验原理用户接口上的信令又可分为线路信令与地址信令(也称之为记发器信令)。
线路信令主要反映了二线用户话机的状态:摘机或挂机,此类信令一般由SLIC电路检测(该方面已包括在前面的实验中);地址信令主要是用户发送的号码信令,该类信令一般由双音多频检测器进行检测。
用户线上的地址信令存在两种技术标准:1、脉冲拨号方式:脉冲拨号方式是按一定的断续比和速率来断、续电话线的环路来发出号码信号。
脉冲拨号主要在早期的步进制交换机中采用,其缺点是拨号速度慢、脉冲产生变异易引起交换机误动作等,随着技术的发展已逐渐被双音多频拨号方式所取代。
2、双音多频DTMF(Dual Tone Multifrequency)是指用两个特定的单音频信号的组合来代表数字或功能,两个单音频的频率不同,所代表的数字和功能也不同,在双音多频电话机中有16个按键,其中有10个数字键(0~9),6个功能键(*、#、A、B、C、D),按照双音组合的原理,它必须有8种不同的单音频信号,由于采用的频率有8种,故又称之为多频,又因以8种频率中任意抽出2种进行组合,又称其为8中取2的编码方法。
根据CCITT的建议,国际上采用697HZ、770 HZ、852 HZ、表6.2.1 DTMF号码组合941HZ、1209HZ、1336HZ、1477HZ和1633HZ,把这8种频率分成两个群,即低频群和高频群,从低频群和高频群中任意各抽出一种频率进行组合,共有16种不同组合,各代表16种不同数字号码或功能,DTMF号码组合见表6.2.1。
在双音多频检测模块中,采用CM8870进行双音频信号的检测。
双音多频信号输入后,经过信号放大和滤波,分两路分别进入高、低频组滤波器以分离检测出高、低频组信号,并对检测的结果按表6.2.2进行译码、锁存。
双音多频信号的产生和检测
摘要所谓双音多频(DTMF ),就是用两个频率一一行频和列频来表示电话机键盘上的一个数字。
DTMF电话的指令正在迅速的取代脉冲指令。
除了在电话呼叫信号中使用外,DTMF还广泛的使用在交互式控制应用,例如电话银行、电子邮件甚至家电远程控制等,用户可以从电话机发送DTMF信号来做菜单选择。
本文基于MATLAB的双音多频拨号系统的仿真实现。
主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用MATLAB软件以及GOERTZEL算法实现对电话通信系统中拨号音的合成与识别。
并进一步利用MATLAB中的图形用户界面GUI制作简单直观的模拟界面,根据提示输入8位电话号码,通过按下输入键可以听见8位电话号码对应的DTMF 信号的声音,通过按下解码键可输出相应的8幅频谱图,并显示检测到的电话号码。
关键词:多音双频MATLAB GOERTZEL算法频谱图第一章、绪论1 • 1研究背景及意义双音多频(Dual Tone Multi Frequency , DTMF)信号是音频电话中的拨号信号,由美国AT&T贝尔公司实验室研制,并用于电话网络中。
这种信号制式具有很高的拨号速度,且容易自动监测识别,很快就代替了原有的用脉冲计数方式的拨号制式。
这种双音多频信号制式不仅用在电话网络中,还可以用于传输十进制数据的其它通信系统中,用于电子邮件和银行系统中。
这些系统中用户可以用电话发送DTMF信号选择语音菜单进行操作。
1.2研究内容及任务说明DTMF编码,是将电话拨号盘上的数字0~9,字母A~D,及*、#,共16个字符,用音频范围的8个频率表示出来,具体来说,将8个频率分为高频群和低频群两组,分别作为列频和行频,每一个键的频率模式由来自于列频和行频的两个频率叠加而成。
要求生成8位电话号码的DTMF信号,并在接受端进行检测。
生成和检测模块要求分开。
第二章双音频信号产生与检测的原理和内容2.1双音频信号产生与检测的原理介绍双音多频(Dual Tone Multi Frequency, DTMF)信号是音频电话中的拨号信号,由美国AT&T贝尔公司实验室研制,并用于电话网络中。
实验1 双音多频电话拨号音产生实验报告
沈阳工程学院学生实验报告实验室名称:通信实验室课程名称:数字传输技术实验名称:双音多频电话拨号音产生实验实验日期:2015年11月6日班级:通信32 姓名:张翼学号:2013312211指导教师:何思远成绩:一、实验目的1. 理解双音多频电话拨号音产生的原理。
2. 掌握使用MATLAB语言产生双音多频电话拨号音的方法。
二、实验原理电话拨号产生的电话号码是通过双音多频(DTMF)格式从电话机传送给交换机的。
所谓双音多频,就是利用两个规定频率的正弦波去代表电话机的某一个按键,当按下某按键时,就发送相应的一组正弦波。
交换机一方通过检测这组正弦波的频率来识别相应的号码信息。
DTMF规定的电话拨号按键与发送正弦波频率组的对应关系如图1所示。
图1 DTMF规定的电话拨号按键与发送正弦波频率组的对应关系此外,Matlab也提供了关于电话拨号的演示程序phone。
图2为使用phone命令打开的演示窗口。
图2 Matlab中的phone演示窗口三、实验内容及要求根据双音多频电话拨号音产生的原理,用一个函数文件(Function File)产生双音多频电话拨号音。
要求该函数能够根据输入的电话号码产生拨号音频,每个号码的DTMF音持续时间为0.3秒,拨号间隔为0.1秒。
四、程序代码function y=myphone(num_str)%输入num_str为电话号码字符串,为1.2.3.4.5.6.7.5.6.0.*.#%输出为相应的拨号音效矩阵%如果不给出输出变量,则从声卡输出拨号音频freq_low=[697 770 852 941]; %低频频率freq_Hgh=[1209 1336 1477]; %高频频率time_of_num=0.3; %每个号码的DTMF音持续时间Fs=8000; %信号采集率wav=inline('0.25*sin(2*pi*p(1)*[1/p(3):1/p(3):p(4)])+0.25*sin(2*pi*p(2)*[1/p(3):1/p(3):p(4)])','p'); %P=[fL,fH,time_of_num]%参数的含义:[高频率,低频率,采样率,持续时间]XX=[]; %提高运行速度for k=1:length(num_str)switch num_str(k) %根据拨号确定双音频对case '1'fL=freq_low(1);fH=freq_Hgh(1);case '2'fL=freq_low(1);fH=freq_Hgh(2);case '3'fL=freq_low(1);fH=freq_Hgh(3);case '4'fL=freq_low(2);fH=freq_Hgh(1);case '5'fL=freq_low(2);fH=freq_Hgh(2);case '6'fL=freq_low(2);fH=freq_Hgh(3);case '7'fL=freq_low(3);fH=freq_Hgh(1);case '8'fL=freq_low(3);fH=freq_Hgh(2);case '9'fL=freq_low(3);fH=freq_Hgh(3);case '0'fL=freq_low(4);fH=freq_Hgh(2);case '*'fL=freq_low(4);fH=freq_Hgh(1);case '#'fL=freq_low(4);fH=freq_Hgh(3);otherwiseerror('输入号码错误');endX=wav([fL,fH,Fs,time_of_num]); %产生拨号频率信号X=[X,zeros(1,Fs*0.1)]; %添加拨号间隔XX=[XX,X]; %多个拨号顺序合成endif nargout==1y=XX; %返回else %如果无返回变量,则播放声音,并做出波形图sound(XX,Fs);plot([1:length(XX)]./Fs,XX);axis([0 length(XX)/Fs -1 1]);xlabel('time(sec)');title(['The telephone number is : ',num_str]);end编辑并存盘为myphone.m后,执行:(1)myphone('31975555');从声卡输出拨号DTMF音,并显示出拨号波形图,如图3所示。
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 算法,从频域搜索两个正弦波的存在。
实验目的掌握 DTMF 信号的产生和检测的 DSP 设计可使学生更加透彻的理解和应用奈奎斯特采样定理,与实际应用相结合,提高学生系统地思考问题和解决实际问题的能力。
通过对 DSP信号处理器及 D/A 和 A/D 转换器的编程,可以培养学生 C 语言编程能力以及使用 DSP 硬件平台实现数字信号处理算法的能力。
技术指标及设计要求基本部分 1) 使用C语言编写DSP下DTMF信号的产生程序,要求循环产生0~9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。
2) 使用C语言编写DSP下DTMF信号的检测程序,检测到的DTMF编码在CCS调试窗口中显示,要求既不能漏检,也不能重复检出。
3) DTMF信号的发送与接收分别使用不同的实验板完成。
发挥部分 1)使用一个DSP工程同时实现DTMF信号的发送和检测功能。
双音多频接收与检测实验总结
双音多频接收与检测实验总结嘿,大家好!今天咱们聊聊最近的一个实验,听着名字有点高大上,其实内容简单得很。
双音多频接收与检测,听起来像是个科技大片里的情节,其实就是研究如何接收和检测不同频率的信号,像是调音师调音一样,调调这儿,捏捏那儿,最后找出最优的组合。
说起来,这个实验就像是一场追逐信号的冒险,特别有意思。
首先,咱们得先搞明白什么是双音多频接收。
简单来说,就是把两种不同的声音信号混合在一起,然后试着把它们分开。
就像是在一个热闹的市场里,你要从喧哗的人群中听到自己想要的声音,难度可想而知!在实验开始之前,大家都挺兴奋的,毕竟能玩儿这些高科技的东西,心里难免有点小激动。
实验的第一步,就是设置设备。
啊,光是看那些仪器,简直就像在科技博物馆里游览,五颜六色的电缆、闪闪发光的指示灯,感觉自己要变成科学家了!不过,设备的调试可没那么简单。
就像是在做一道复杂的菜,调料放错了,味道就全变了。
我们小组成员紧张兮兮,手忙脚乱地调整参数,心里想,千万别出岔子啊。
接下来就是信号的发送。
我们用两种频率的音调,像是在比赛谁的声音更响亮,哎呀,真是比拼的感觉。
不过,声音发出去后,接收的过程就有点悬了。
你知道,这就像是在海里钓鱼,鱼儿的出现与否全看运气。
大家屏息以待,屏幕上的波形图开始动了!哦,终于有信号传过来了,瞬间感觉就像中了大奖一样!然后是信号的检测。
这个环节就像是破解密码,必须细心观察,才能找到那条隐藏的信息。
我们的任务是从杂音中提取出干净的信号。
每个人都聚精会神,仿佛在打怪升级。
有人甚至开玩笑说,感觉自己成了音频侦探,真是好玩得不行!随着数据的分析,信号逐渐清晰,兴奋的氛围蔓延开来。
不过,事情总是有点波折,实验过程中也遭遇了一些小麻烦。
比如,有时候信号出现了干扰,像是旁边有人在打电话,让人烦不胜烦。
但这也让我们明白,科学探索就是这么一回事,总会有意外情况发生。
正所谓“千磨万击还坚劲”,只要坚持不懈,问题总会迎刃而解。
毕业设计(论文)-双音频(dtmf)信号的产生与检测[管理资料]
XXXXXXX大学毕业论文(设计)题目:双音频(DTMF)信号的产生与检测学生姓名学号专业电子信息工程班级2008级1班指导教师学部计算机科学与电气工程答辩日期2012年5月19日黑龙江东方学院本科生毕业论文(设计)任务书双音频(DTMF)信号的产生与检测摘要双音多频DTMF(Dual Tone Multi-Frequency)信令在全世界范围内得到广泛应用,DTMF信令的产生与检测集成到含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。
DTMF作为实现电话号码快速可靠传输的一种技术,它具有很强的抗干扰能力和较高的传输速度,因此,可广泛用于电话通信系统中。
但绝大部分是用作电话的音频拨号,另外,它也可以在数据通信系统中广泛地用来实现各种数据流和语音等信息的远程传输,研究其在MATLAB下的仿真实现有助于其具体系统的优化设计。
本文给出一种实现方案,主要阐述了DTMF的原理及如何在Matlab上产生DTMF信号,并对用Goertzel算法提取的频谱进行分析,然后,得到用Goertzel算法在白噪声的环境下对输入的DTMF信号提取频谱信息,最后,根据提取的频谱信息对输入信号进行检测解码。
关键词:双音多频DTMF;Goertzel算法;MatlabDual Tone Multi-frequency (DTMF) Signal Generationand DetectionAbstractDTMF (Dual Tone Multi-Frequency) signaling in the widely used worldwide, signaling the DTMF generation and detection integrated with digital signal processor (DSP) system, is a more value engineering. DTMF telephone number as to achieve a fast and reliable transmission technology, it has a strong anti-interference ability and high transmission speed, it can be widely used for telephone communication system. But the vast majority of telephone tone dialing is used. In addition, it can also be in the data communication system widely used to achieve a variety of data streams and remote transmission of voice and other information. Under study in the MATLAB Simulation helps optimize the design of their specific paper presents a realization of the program, mainly on the principle of DTMF and how to generate DTMF signals in Matlab, and extracted with Goertzel algorithm to analyze the spectrum, and then, get with the Goertzel algorithm in the context of white noise on the input of the DTMF spectrum information signal extraction, and finally, according to information extracted from the input signal spectrum to detect decoding.Keywords:Dual tone multi-frequency;Goertzel algorithm;Matlab目录摘要 (I)Abstract ........................................................................................................................................ I I 第1章绪论.. (1)引言 (1)课题意义 (1)第2章基本原理 (3)自动电话的制式 (3)DTMF技术 (5)Goertzel算法 (5)Matlab简介 (7)本章小结 (8)第3章DTMF信号产生与检测 (9)DTMF信号的产生 (9)DTMF信号的检测 (10)DTMF信号检测方法 (10)DTMF信号有效性的检测 (12)本章小结 (12)第4章Matlab仿真 (14)设计程序(见附录) (14)Matlab仿真 (14)本章小结 (17)结论 (18)参考文献 (19)附录 (20)致谢 (28)双音频(DTMF)信号的产生与检测第1章绪论1.1 引言电话中的双音多频信号(DTMF)有两种用途:一是用于双音多频信号的拨号,去控制交换机接通被叫的用户话机;二是利用双音多频信号遥控电话机各种动作,如播放留言、语音信箱等,并可以通过附加一些电路来是实现遥控家电设备的开启关闭等智能功能。
DTMF实验报告
DTMF信号的产生及检测实验报告--------在MATLAB环境下的仿真实现学号:20072121016 专业:07电子信息工程姓名:黎天送一、实验目的:DTMF(Double Tone Multi Frequency,双音多频)作为实现电话号码快速可靠传输的一种技术,它具有很强的抗干扰能力和较高的传输速度,因此,可广泛用于电话通信系统中。
但绝大部分是用作电话的音频拨号。
另外,它也可以在数据通信系统中广泛地用来实现各种数据流和语音等信息的远程传输。
此次的目的是研究其在MATLAB下的仿真。
二、实验内容:1、DTMF的原理DTMF是用两个特定的单音频组合信号来代表数字信号以实现其功能的一种编码技术。
两个单音频的频率不同,代表的数字或实现的功能也不同。
这种电话机中通常有16个按键,其中有10个数字键0~9和6个功能键*、#、A、B、C、D。
由于按照组合原理,一般应有8种不同的单音频信号。
因此可采用的频率也有8种,故称之为多频,又因它采用从8种频率中任意抽出2种进行组合来进行编码,所以又称之为“8中取2”的编码技术。
根据CCITT的建议,国际上采用的多种频率为687Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。
用这8种频率可形成16种不同的组合,从而代表16种当按下一个数据键,例如“5”时,则产生频率为770HZ 和1336HZ 的两个正弦波,并叠加。
在用MATLAB 仿真时,用查表法先建立拨号数字的表矩阵,以求出数字键对应的频率。
在处理数字信号时,为了不使信号失真,取样频率要求大于或等于原信号频率的2 倍,对于电话音频信号的取样频率一般定为8kHz 。
DTMF 的解码用傅里叶变换( FFT),首先对接收到的数字信号作FFT分析, 计算出其幅频谱,取样频率fs =8kHz ,源程序:Fs=8000;t=(0:2000)/Fs;pit=2*pi*t;fc1=697;fc2=770;fc3=852;fc4=941;fr1=1209;fr2=1336;fr3=1477;fr4=1663;x=sin(fcn*pit);y=sin(frn*pit); --fcn,frn为上面所列的频率值z=x+y;subplot(1,2,2)f=fft(z,1024);f1=fftshift(f);w1=513:1024;w=4000*(w1-512)/512;F=abs(f1(513:1024));plot(w,F)axis([0,2000,-50,600]);gridsound(z)接收端所检测到的信号源程序:function lts(f1,f2)%f1=770;%f2=1209;fs=8000;t=(0:800-1)/8000;b=sin(t*2*pi*f1)+sin(t*2*pi*f2);tm=[49,50,51,65;52,53,54,66;55,56,57,67;42,48,35,68];N=205;k=[18,20,22,24,31,34,38,42];X=goertzel(b(1:N),k+1);val=abs(X);limit=70;for r=1:4if val(r)>limit;break,endendfor s=5:8if val(s)>limit;break,endenddisp('接收端检测到的号码为:');y=setstr(tm(r,s-4));disp(y);例如:当点击B时 f1=770khz,f2=1663khz检测到的号码为:。
双音多频拨号系统DTMF的实验报告
双音多频拨号系统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)三,运行以上程序调出如下图界面:即可以进行仿真拨号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳工程学院
学生实验报告
实验室名称:通信实验室课程名称:数字传输技术
实验名称:双音多频电话拨号音产生实验实验日期:2015年11月6日
班级:通信32 姓名:张翼学号:2013312211
指导教师:何思远成绩:
一、实验目的
1. 理解双音多频电话拨号音产生的原理。
2. 掌握使用MATLAB语言产生双音多频电话拨号音的方法。
二、实验原理
电话拨号产生的电话号码是通过双音多频(DTMF)格式从电话机传送给交换机的。
所谓双音多频,就是利用两个规定频率的正弦波去代表电话机的某一个按键,当按下某按键时,就发送相应的一组正弦波。
交换机一方通过检测这组正弦波的频率来识别相应的号码信息。
DTMF规定的电话拨号按键与发送正弦波频率组的对应关系如图1所示。
图1 DTMF规定的电话拨号按键与发送正弦波频率组的对应关系
此外,Matlab也提供了关于电话拨号的演示程序phone。
图2为使用phone命令打开的演示窗口。
图2 Matlab中的phone演示窗口
三、实验内容及要求
根据双音多频电话拨号音产生的原理,用一个函数文件(Function File)产生双音多频电话拨号音。
要求该函数能够根据输入的电话号码产生拨号音频,每个号码的DTMF音持续时间为0.3秒,拨号间隔为0.1秒。
四、程序代码
function y=myphone(num_str)
%输入num_str为电话号码字符串,为1.2.3.4.5.6.7.5.6.0.*.#
%输出为相应的拨号音效矩阵
%如果不给出输出变量,则从声卡输出拨号音频
freq_low=[697 770 852 941]; %低频频率
freq_Hgh=[1209 1336 1477]; %高频频率
time_of_num=0.3; %每个号码的DTMF音持续时间
Fs=8000; %信号采集率
wav=inline('0.25*sin(2*pi*p(1)*[1/p(3):1/p(3):p(4)])+0.25*sin(2*pi*p(2)*[1/p(3):1/p(3):p(4)])','p'); %P=[fL,fH,time_of_num]
%参数的含义:[高频率,低频率,采样率,持续时间]
XX=[]; %提高运行速度
for k=1:length(num_str)
switch num_str(k) %根据拨号确定双音频对case '1'
fL=freq_low(1);fH=freq_Hgh(1);
case '2'
fL=freq_low(1);fH=freq_Hgh(2);
case '3'
fL=freq_low(1);fH=freq_Hgh(3);
case '4'
fL=freq_low(2);fH=freq_Hgh(1);
case '5'
fL=freq_low(2);fH=freq_Hgh(2);
case '6'
fL=freq_low(2);fH=freq_Hgh(3);
case '7'
fL=freq_low(3);fH=freq_Hgh(1);
case '8'
fL=freq_low(3);fH=freq_Hgh(2);
case '9'
fL=freq_low(3);fH=freq_Hgh(3);
case '0'
fL=freq_low(4);fH=freq_Hgh(2);
case '*'
fL=freq_low(4);fH=freq_Hgh(1);
case '#'
fL=freq_low(4);fH=freq_Hgh(3);
otherwise
error('输入号码错误');
end
X=wav([fL,fH,Fs,time_of_num]); %产生拨号频率信号X=[X,zeros(1,Fs*0.1)]; %添加拨号间隔XX=[XX,X]; %多个拨号顺序合成
end
if nargout==1
y=XX; %返回
else %如果无返回变量,则播放声音,并做出波形图sound(XX,Fs);
plot([1:length(XX)]./Fs,XX);
axis([0 length(XX)/Fs -1 1]);
xlabel('time(sec)');
title(['The telephone number is : ',num_str]);
end
编辑并存盘为myphone.m后,执行:
(1)myphone('31975555');
从声卡输出拨号DTMF音,并显示出拨号波形图,如图3所示。
(2)y=myphone('31975555');
wavwrite(y,8000,'C:\mytelephonenum31975555.wav');
将拨号声音存盘为wav文件:mytelephonenum31975555.wav
图3 电话号码31975555的拨号波形。