大连理工大学数字信号处理实验二电话拨号音的合成与识别

合集下载

数字信号处理在多音频拨号系统中的应用实验

数字信号处理在多音频拨号系统中的应用实验

实验四:数字信号处理在多音频拨号系统中的应用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 的变换点数以及观测时间的确定原则。

电话拨号音的识别——MATLAB之旅-A01-20150416

电话拨号音的识别——MATLAB之旅-A01-20150416

电话拨号⾳的识别——MATLAB之旅-A01-20150416技术博客对于程序员来说,是很重要的。

《暗时间》的作者刘未鹏,⼤⼆就开始写技术博客,最后其博客访问量超过了百万。

写技术博客好处众多,有两点是突出的。

⼀⽅⾯,写是为了更好的思考,写作是理清思维过程的重要⽅式;另⼀⽅⾯,写作是为了与他⼈更好地交流,⼀个单独个体的思维的局限性只有经过与他⼈思维碰撞的过程才能体现出来,这样⼀个⼈才能进步。

基于上述理由,我今天开始写MATLAB编程相关的技术博客。

MATLAB对⼀个学⼯程的⼈的重要性不必多说,⾃⼰考研的⽅向专业今后主要⼯具也是MATLAB,⾃⼰⼜⽐较喜欢⽤MATLAB写程序,说到这⾥,理由⽅⾯的充分性我想已经说完了。

技术博客要长期坚持,这⼀点是⾄关重要的。

坚持对于⽆论何种成功,都是核⼼因素之⼀。

博客的主要内容主要有:MATLAB笔记,遇到的问题,需要主要的关键点,优秀例程,和⼼得体会。

----------------------------------------------------------------------------------------------传统电话的拨号⾳是有两个不同频率的纯⾳合成的,现在的问题是,如何从⼀串合成的拨号⾳中找到对应的电话号码?⼀个⽐较正常的思路是:第⼀步,先对独⽴的每个合成⾳进⾏处理和分析,找到对应的两个频率,然后得到⼀个对应关系表;第⼆步,对要处理的⼀串拨号⾳进⾏处理,得到时域上的对应频率分布图,通过查表得到拨号⾳代表的数字。

下⾯是m主程序:%% 这⾥的%%是对程序进⾏分块,每块可分步执⾏,快捷键为Ctrl+Enter%problem1clear all;folder='D:\documents\Matlab\DSPLAB\dsp2\'; %folder addressfiles=dir([folder '*.wav']) %dir函数读取folder路径下所有wav结尾的⽂件,并存⼊矩阵filesfor i=1:length(files)file=[folder files(i).name];res(i).file=file;try[y,Fs,bits]=wavread(file); %wav⽂件的读⼊res(i).y=y; %定义结构数组res(i).Fs=Fs;res(i).bits=bits;catchwarning(['No suppot for the format.'])endendfor k=1:11wavplay(res(1,k).y,res(1,k).Fs)end%% problem2for n=1:11A(1,n).y=mean(res(1,n).y,2); %对左右声道进⾏平均,合成单声道A(1,n).y=detrend(A(1,n).y); %去基线,即去直流分量end%% problem3figure(1) %若要单独输出多个图形,⽤figure函数for u1=1:5subplot(5,1,u1),plot(A(1,u1).y) %注意结构数组的数据调⽤,在workspace⾥可以理清其结构xlabel('t')ylabel('A')endfigure(2)cs=1;for u2=6:10subplot(5,1,cs),plot(A(1,u2).y)xlabel('t')ylabel('A')cs=cs+1;endfigure(3) %这⼀段是画短时傅⾥叶变换频谱图的通⽤程序for h=1:10fs=Fs;N=length(A(1,h).y); %numhn=0:N-1;t=n/fs;x=A(1,h).y; %numhy1=fft(x,N);mag=abs(y1);f=n*fs/N;subplot(5,2,h),plot(f,mag);xlim([650,1500])xlabel('Frenquency/Hz');ylabel('Amp');grid on;end%% probblem4&5figure(4)plot(A(1,11).y)xlabel('t')ylabel('A')%% problem6A(1,11).y=downsample(A(1,11).y,10); %降采样处理%% problem7fs1=Fs/10;figure(5)spectrogram(A(1,11).y,1024,1020,1024,fs1) %画出时频分布图,注意spectrogram函数的参数xlim([680 1500])%% problem8phonenumber='188********'%%problem9Phonenumber_s_master='JiaYiMin'通过%problem3中的步骤,figure3中,可以得出拨号⾳对于频率表。

大连理工大学通信网实验-实验一预习报告剖析

大连理工大学通信网实验-实验一预习报告剖析

大连理工大学实验预习报告学院(系):信息与通信工程专业:通信工程班级:电通1402姓名:糜智华学号:201483051 组:___实验时间:2016年11月14日实验室:C221 实验台:实验一程控交换机语音通信实验预习报告一、实验目的和要求通过该实验使学生理解通信网络的基本概念,了解和掌握现代通信网的网络拓扑结构、通信网使用的设备连接方法和信号传输过程。

本实验将进行基于数字程控交换机的语音通信实验。

通过对交换机的简单配置,了解电话网的基本组成和交换机构成及各部分的功能,熟悉固定电话的接续流程,以对将来通信行业的硬件和软件工作有一定的了解。

二、实验原理和内容实验内容:a)熟悉实验室通信设备,了解各通信设备基本功能,能够简单配置和操作设备。

b)操作和配置程控交换机,实现电话之间通话实验实验原理:电话网是传递电话信息的电信网,是可以进行交互型话音通信、开放电话业务的电信网。

电话网包括本地电话网、长途电话网、国际电话网等多种类型。

是业务量最大、服务面最广的电信网。

电话网经历了由模拟电话网向综合数字电话网的演变。

除了电话业务,还可以兼容许多非电话业务。

因此电话网可以说是电信网的基础。

最早的电话通信形式只是两部电话机中间用导线连接起来便可通话。

电话网采用电路交换方式,由发送和接收电话信号的用户终端设备(如电话机)进行电路交换的交换设备(电话交换机)、连接用户终端和交换设备的线路(用户线)和交换设备之间的链路(中继线)组成。

电话网基本结构形式分为多级汇接网和无级网两种。

端局:端局就是直接下挂用户或者直接拨入(DID局)的交换机。

在移动通信中,端局之间若没有进行直连,则通过汇接局进行连接,运营商之间的中继互联是通过关口局来进行连接的。

关口局是出网的局点。

各个端局通过中继的方式汇聚到一个局点,再上行到关口局或长途局。

汇接局:汇接局属于本地网内的一种交换局,它汇接各端局通过中继线送来的话务量,然后送至相应的端局。

实验4 双音多频信号的合成与检测.

实验4 双音多频信号的合成与检测.

实验四双音多频信号的合成与检测一实验目的1.理解电话拨号音的合成与检测的基本原理;2.深入理解信号频谱分析理论中相关参数的作用和意义; 3.了解频谱分析在实际工程中的应用实例。

二实验基础双音多频(dual-tone multifrequency, DTMF信号的产生及检测在现代通信系统中有着广泛的应用,家用电话、移动电话以及公共程控交换机(PBX都采用DTMF 信号发送和接收电话拨号号码。

本实验要求利用信号的时域分析和频域分析的基本理论实现DTMF 的合成和检测。

1. DTMF信号合成DTMF 信号由低频组和高频组两组频率信号构成。

按键电话上每个按键都由对应的两个频率组成,如表4.1。

当按下某个键时,所得到的按键信号是由相应两个频率的正弦信号叠加而成。

设x(n为DTMF 信号,产生方式为:x (n =sin (ωH n +sin (ωH n式中:ωH =f s,ωL =f sf s =8KHz 。

DTMF 信号的标准是:在传送过程中每个按键字占用100ms ,其中信号必须持续至少40ms ,且不得多于55ms ,100ms 里的其余时间为静音(无信号)。

表4.1按键频率对应表2. DTMF信号检测DTMF 信号的检测是将信号的两个频率提取出来,从而确定接收到的DTMF 对应的按键。

利用DFT 对DTMF 信号进行N 点的频谱分析,N 的选取决定了频率分辨率以及捕捉N 个样值所需要的时间。

根据谱峰出现的频率点位置m 就可以确定DTMF 信号的频率f k:/k s f kf N =这样计算出的DTMF 信号频率可能与实际的DTMF 信号频率有一定的差别,但可以通过加大N 的选取来减小这种频率差异。

然而从另外一方面来考虑,虽然加大N 值会减小检测频率误差,但这势必会带来捕捉N 个样值所需要的时间增加,从而会对检测的效果造成一定影响。

由DTMF 信号频率所具有的特性不难发现要选取一定的N 值使得计算出的频率和真实的DTMF 信号的频率相一致几乎不可能,而实际中也并不需要计算出来的频率值与其真实频率相一致,只需偏差保持在±1.5%即可认为是DTMF 信号的真实频率。

频谱分析的应用--话拨号音合成与识别

频谱分析的应用--话拨号音合成与识别
式中:k=0,1,2, … ,N; 初始条件 Qm [ −1]= Qm [ −2]= 0;
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

MATLAB电话拨号音的合成与识别

MATLAB电话拨号音的合成与识别

知识就昱力量MATLAB 电话拨号音的合成与识别1. 实验目的1.本实验内容基于对电话通信系统中拨号音合成与识别的仿真实现。

主要涉及到电话拨号音合成的基本原 理及识别的主要方法,利用 MATLAB 软件以及FFT 算法实现对电话通信系统中拨号音的合成与识别。

并进一步利用 MATLAB 中的图形用户界面 GUI 制作简单直观的模拟界面。

使其对电话通信系统拨号音 的合成与识别有个基本的了解。

2. 能够利用矩阵不同的基频合成 0 — 9不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实 现由拨号音解析出电话号码的过程。

进一步利用 GUI 做出简单的图形操作界面。

要求界面清楚,画面简洁,易于理解,操作简单。

从而实现对电话拨号音系统的简单的实验仿真。

2.实验原理 1. DTMF 信号的组成双音多频 DTMF ( Dual Tone Multi-Frequency )信号,是用两个特定的单音频率信号的组合来代表数 字或功能。

在DTMF 电话机中有16个按键,其中10个数字键0 — 9, 6个功能键*、#、A 、D 。

其中12个按键是我们比较熟悉的按键,另外由第4列确定的按键作为保留,作为功能 1209Hz 、 1336Hz 、 1477H:、 1633Hz 高频群。

从低频群和高频群任意各抽出一种频率进行组合, 共有16种组合,代表16种不同的数字键或功能,每个按键唯一地由一组行频和列频组成,如表 示。

V4 Z Z.+DTMF 的组合功能3. 实验步骤1. DTMF 信号的产生合成现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置, 即对tu1.m 文件进行编辑。

其主要的功能是使对应的按键,按照表1的对应关系产生相应的拨号音,完成对应行频及列频的叠加输岀。

此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。

键留为今后他用。

根据CCITT 建议,国际上采用 697Hz 、770Hz 、 852Hz 、 941Hz 低频群及■I知识就昱力量鉴于CCITT对DTMF信号规定的指标,这里每个数字信号取1000个采样点模拟按键信号,并且每两个数字之间用100个0来表示间隔来模拟静音。

信与系统实验电话拨音的合成与分解

信与系统实验电话拨音的合成与分解
3.涉及的MATLAB相关内容
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)
双音多频 DTMF ( Dual Tone Multi-Frequency )信号,是用两个
特定的单音频率信号的组合来代表数字或功能。在 DTMF 电话机中有 16 个按键,其中 10 个数字键 0 — 9 , 6 个功能键 * 、 # 、 A 、 B 、 C 、 D 。其中 12 个按键是我们比较熟悉的按键,另外由第 4 列 确定的按键作为保留,作为功能键留为今后他用。 根据 CCITT 建议, 国际上采用 697Hz 、 770Hz 、 852Hz 、 94lHz 低频群及 1209Hz 、 1336Hz 、 1477H: 、 1633Hz 高频群。从低频群和高频群任意各抽出一 种频率进行组合,共有 16 种组合,代表 16 种不同的数字键或功能, 每个按键唯一地由一组行频和列频组成,如表 1 所示:
DTMF产生合成
现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化 进行设置,即对 tu1.m 文件进行编辑。其主要的功能是使对应的按键,
按照表 1 的对应关系产生相应的拨号音,完成对应行频及列频的叠加
输出。此外,对于图形界面的需要,还要使按键的号码数字显示在拨 号显示窗口中。 鉴于 CCITT 对 DTMF 信号规定的指标,这里每个数字信号取 1000 个采 样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模 拟静音。以便区别连续的两个按键信号。间隔的静音信号也是在按键 时产生的。程序代码见论文。
实现步骤
制作拨号面板
DTMF产生合成
DTMF检测识别
仿真结果
电话拨号面板的制作
利用 GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和 电话机的键盘矩阵对应起来。其中选用我们熟悉的 10 个数字键 0 — 9 , 2 个功能键“ * ”、“#”,另四个键省略。按照图 1 电话机键盘矩 阵的排列方式制作四行三列的按键控件。每个按键可用 ( Push
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大连理工大学实验报告
学院(系):电子信息与电气工程专业:电子信息工程班级:姓名:学号:组:___
实验时间:实验室:实验台:指导教师签字:成绩:实验二、电话拨号音的合成与识别一、实验题目和代码
实现对电话通信系统中拨号音合成与识别的仿真实现。

系统界面设计:
源程序:
function varargout = zuoye(varargin)
function zuoye_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDA TA)
% varargin command line arguments to zuoye (see V ARARGIN)
% Choose default command line output for zuoye
handles.output = hObject;
handles.fs = 8192;
handles.DTMFsum=820;
handles.DTMFnum = handles.DTMFsum/2;
handles.NUM=[];
handles.number = [];
function num1_Callback(hObject, eventdata, handles)
% hObject handle to num1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDA TA)
n0=strcat(get(handles.numshow,'string'),'1'); % 获取数字号码
set(handles.numshow,'string',n0); % 显示号码
n=[1:handles.DTMFnum]; % 每个数字410 个采样点表示
d0=sin(2*pi*697/handles.fs*n)+sin(2*pi*1209/handles.fs*n); % 对应行频列频叠加space=zeros(1,handles.DTMFnum); %400 个0 模拟静音信号
phone=[handles.NUM,d0];
handles.NUM=[phone,space]; % 存储连续的拨号音信号
guidata(hObject, handles);
wavplay(d0,8192);
function num10_Callback(hObject, eventdata, handles)
% hObject handle to num10 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDA TA)
n=[1:1000];
num=get(handles.numshow,'string');
L=length(num);
n11=strrep(num,num,num(1:L-1));
d11=sin(0.7217*n)+sin(0.9273*n);
set(handles.numshow,'string',n11);
L=length(handles.NUM);
handles.NUM=handles.NUM(1:L-820);
guidata(hObject, handles);
wavplay(d11,8192);
function num11_Callback(hObject, eventdata, handles)
% hObject handle to num11 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDA TA)
L=length(handles.NUM);
n=L/handles.DTMFsum;
number='';
for i=1:n
j=(i-1)*handles.DTMFsum+1;
d=handles.NUM(j:j+(handles.DTMFnum-1)); % 截取出每个数字f=fft(d,8192); % 以N=2048 作FFT 变换
a=abs(f);
p=a.*a/handles.fs; % 计算功率谱
% p=a.*a/10000; % 计算功率谱
num(1)=find(p(1:1000)==max(p(1:1000))); % 找行频
num(2)=1000+find(p(1000:1700)==max(p(1000:1700))); % 找列频if (num(1) < 730)
row=1; % 确定行数
elseif (num(1) < 810)
row=2;
elseif (num(1) < 900)
row=3;
else
row=4;
end
if (num(2) < 1260)
column=1; % 确定列数elseif (num(2) < 1400)
column=2;
else
column=3;
end
z=[row,column]; % 确定数字
if z==[4,2]
tel=0;
elseif z==[1,1]
tel=1;
elseif z==[1,2]
tel=2;
elseif z==[1,3]
tel=3;
elseif z==[2,1]
tel=4;
elseif z==[2,2]
tel=5;
elseif z==[2,3]
tel=6;
elseif z==[3,1]
tel=7;
elseif z==[3,2]
tel=8;
elseif z==[3,3]
tel=9;
end
t(i)=tel;
c=strcat(number,int2str(tel));
number=c;
i=i+1;
end
set(handles.numshow2,'string',number);
实验结果:
拨号:识别:
二、总结、讨论和建议
本次试验是第一次接触matlab中的gui功能,对其还不是特别熟悉,在老师的指导下完成了任务。

在本次试验中,主要遇到的问题就是编代码时没有考虑清屏操作,导致前一次的显示结果也会保留在窗口上,加入set(handles.numshow2,'string',number);这段代码后程序功能才正常运行;运行程序的时候,没有完成语音信号的识别。

其他部分没有太大的问题。

同时通过本次实验进一步熟悉了MATLAB中GUI的操作。

相关文档
最新文档