DTMF电话中的拨号信号发生
与检测系统仿真
摘要
信号处理的基本概念和分析方法已应用于许多不同领域和学科中,尤其是数字计算机的出现和大规模集成技术的高度发展,有力地推动了数字信号处理技术的发展和应用。信号处理的目的就是对被观测到的信号进行分析,变换,综合,估计和识别等。数字信号处理可以用硬件和软件两种方法来实现。主要阐述了DTMF 编码的原理以及通过MATLAB产生DTMF 信号的方法,利用Goertzel 算法对输入的DTMF 信号提取频谱信息, 从而对输入信号进行检测、解码.
1、任务、性质与意义
用数学模型的方法对信息传输的过程进行仿真,是分析、
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
及改进通信系统性能的重要手段。本次课程设计的任务是综合运用通信原理、数字信号处理等课程所学知识,实现一个双音多频(DTMF)信号传输过程的软件仿真。
本次课程设计的性质是通信原理、数字信号处理等课的综合实践环节。它的意义在于,通过本次课程设计可以从理论上加深对有关通信、数字信号处理原理的综合理解,了解DTMF信号原理和用数字信号处理的方法实现DTMF信号的产生、传输与检测的过程。还可以从实践能力上掌握一门新的计算机编程工具——MATLAB语言。
2、基本原理
2.1 双音多频(DTMF)信号
双音多频(DTMF)信号就是用两个不同频率的音频信号的组合来传输信息的一种通信信号形式,可以用数学式表示为
(1)
式中fH和fL分别是高频组和低频组的两个信号频率。对这两个频率的要求是:1、位于人而能够听到的音频频率范围内;2、频率间隔近似为乐音音阶的频率间隔(按十二平均律,相邻各个音的频率呈等比关系,其比值约为1.059463,例如C3 130.8Hz,C4=261.7Hz,D4 293.7)。这种信号在电话线路上传输,而且声音悦耳。
2.2 双音多频信号软件产生与检测
为了产生DTMF信号,DSP用软件产生两个正弦波叠加在一起后发送,软件具体实现方式可以有三种方法:
(1)用软件模拟DSP的方式产生两个数字正弦波振荡器并把输出合成起来,建立所希望的双音频。
(2)通过产生的某频率的方波后再附加滤波器滤出二次以上的谐波,产生DTMF信号。
(3)查表输出产生DTMF信号。
软件检测DTMF信号主要有以下方法:
(1)利用离散傅立叶变换(DFT)及其快速算法(FFT),求取DTMF信号频谱的峰值点,进而利用峰值点的频率判断发送的数字。这种方法的缺点是计算量大,不利于实时处理。但是如果使用MATLAB软件仿真则可以用很简单的几条语句实现。
(2)对于DTMF信号的波形,波形过零点数量决定了低频信号的频率,而极值点数量决定了高频信号的频率。因此通过软件分别计算出高频频率和低频频率,从而实现DTMF的解码。
这里选择采样频率为8K,已知每一个信号的频率至少持续40ms的时间,我们对DTMF采样160个点,即20ms,这样总会有一个20ms的采样点全部落在40ms的发送范围内,对采样的点进行6次求和取平均,去掉噪声成分,然后分别计算过零点的数目a和极值点的数目b,对应频率可以计算为:
既然可以求出DTMF信号的一组频率值,那么就可以得出对应电话号码值。这种算法比较适合于单片机硬件实现,但是其抗噪声性能较差。
(3)计算接收到的DTMF信号在8个既定频率的能量,进而确定是否有DTMF信号到达以及收到的是哪一对信号,此外通过计算接收信号的总能量来防止误判。采用Geortzel算法可进一步提高计算效率,Goertzel算法实质是一个两极点的IIR滤波器,对应每一个频点有一个匹配滤波器,在抽样时刻检测。这种方法理论上属于最佳接收方法,而且算法有利于用DSP实现。在本次课程设计中要求使用这种方法。
DTMF解码即是在输入信号中搜索出有效的行频和列频。
2.3 数字正弦波振荡器原理
数字正弦波振荡器的功能是利用数字信号处理的方法产生正弦波信号
的抽样序列
。基本原理是:
设数字正弦波振荡器要产生的波形为
(1)
则其Z变换为
上式的分子与分母同时乘以
y(n)可以看作是一个单位冲击函数激励了一个线性系统的冲击响应。这个线性系统的传递函数就是Y(z)。由Y(z)可以写出该线性系统的差分方程:
式中
为数字角频率。
令输入x(n)为单位冲击函数,即
则可以得到下面的递推方程
当n<0时,y(n)=0
当n=0时,y(0)=0
当n=1时,
当n=2时,
当n>2时,
(2)
实现时,首先将每个频率常数存在一个表中,用来初始化给定键的振荡器;再按照(2)进行迭代计算,就得到正弦序列的输出;将两个这样的输出叠加即可得到双音频的输出。每个数字输出的样本数取决于数字速率与采样速率。双音频中的每一个音调之后都是同样长度的无音周期,从而可以检测到按键的释放。
2.4 数字匹配滤波器原理(Geortzel算法)
计算接收到的DTMF信号在8个既定频率的能量,进而 确定是否有DTMF信号到达以及收到的是哪一对信号,此外通过计算接收信号的总能量来防止误判。为满足检测8个DTMF频点(偏差1.5%),需计算256点FFT,因只对8个频点感兴趣,故可以直接计算8个频点附近的DFT
,
计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只用关心其8个行频/列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。此时Goertzel算法能更加快速地在输入信号中提取频谱信息。Goertzel算法实质是一个两极点的IIR滤波器,其算法原理框图如图5。
图5 Geortzel算法信号流图
对应每一个频点有一个匹配滤波器,第k个频率匹配滤波器的传递函数为
其中
,
,
,
对应的前、后向差分方程为:
后一个方程无需全部计算,只需要在n=N时刻,即最后的输出时刻计算。
如果考虑同步相位误差,也可以在n=N时刻附近计算一段时间内的输出。
前向差分方程也可以改写为便于计算的递归形式:
并令初始值为
。在n=N时刻既可以得到所需要的X(k)。
由于在DTMF检测中,输入的信号是实数序列,并不需要检测出8个行频/列频的相位,只需要计算出其幅度平方即可。因此计算|X(k)|2如下:
这里
分别表示状态变量在N和N-1时刻的值。
在输入信号中检测DTMF信号,并将其转换为实际的数字,这一解码过程本质是连续的过程,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。整个检测过程分两步:首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。
软件流程图
(1) 输入键号
(2) 生成DTMF信号(时域、频域显示)
(3) 产生高斯噪声(时域、频域显示)
(4) 信道传输(高斯白噪声信道,可选作带限滤波器信道)
(5) 接收端随机延迟(30个点以内)
(6) 匹配滤波接收
(7) DTMF信号到达检测
(8) DTMF信号识别(时域、频域显示)
(9) DTMF键号识别
3. 工作内容
3.1.图形电话拨号面板的制作
利用 GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和电话机的键盘矩阵对应起来。其中选用我们熟悉的 10 个数字键 0 — 9 , 2 个功能键“ * ”、“#”,另四个键省略。按照图 1 电话机键盘矩阵的排列方式制作四行三列的按键控件。每个按键可用
( Push Button )添加。
然后,为了更直观的反映对应的按键号码,可以设置一个编辑框,用于动态的显示拨号号码,模拟实际电话的拨号显示窗口。编辑框可用
( Edit Text )添加。
另外,为了图形电话拨号面板的简洁美观,可以添加空白区域作为背景,并用静态文本框制作文字信息。背景可用
( Frame )添加,静态文本框可用
( Static Text )添加。
最终利用 GUI 图形用户界面设计工具生成的图形电话拨号面板用于拨号音的合成产生部分,如下图所示。这里将其保存为tu1.fig文件。
3.2. DTMF 信号的产生合成
现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对 tu1.m 文件进行编辑。其主要的功能是使对应的按键,按照表 1 的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。
鉴于 CCITT 对 DTMF 信号规定的指标,这里每个数字信号取 1000 个采样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模拟静音。以便区别连续的两个按键信号。间隔的静音信号也是在按键时产生的。
以按键 0 为例,简单介绍拨号音产生的过程:
% 按键 0 的响应函数
function varargout = 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,'string',n0); % 显示号码
space=zeros(1,100); %100 个 0 模拟静音信号
global NUM
phone=[NUM,d0];
NUM=[phone,space]; % 存储连续的拨号音信号
wavplay(d0,8192); % 产生拨号音
wavplay(d11,8192);
3.3.DTMF 信号的检测识别
要实现电话拨号音( DTMF )信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。这里采用 FFT 算法对信号进行解码分析。首先对接收到的数字信号作 FFT 分析,计算出其幅频谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。对于连续的双音多频( DTMF )信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用 FFT 算法对信号进行解码分析。
MATLAB 实现信号音的识别如下:
function varargout = pushbuttonNUM_Callback(h, eventdata, handles, varargin)
global NUM
wavplay(NUM,8192);
L=length(NUM);
n=L/1100;
number='';
for i=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;
elseif (num(1) < 220) row=3;
else row=4;
end
if (num(2) < 320) column=1; % 确定列数
elseif (num(2) < 340) 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.edit3,'string',number);
4. 仿真结果
仿真结果---数字“0”的模拟