dtmf信号的产生与检测实验报告.docx
- 文档编号:30592133
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:28
- 大小:118.93KB
dtmf信号的产生与检测实验报告.docx
《dtmf信号的产生与检测实验报告.docx》由会员分享,可在线阅读,更多相关《dtmf信号的产生与检测实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
dtmf信号的产生与检测实验报告
DSP课程设计实验报告
DTMF信号的产生与检测
指导老师:
申艳老师
时间:
2014年7月18日
1设计任务书
双音多频DTMF(DualToneMultiFrequency)信号是在按键式电话机上得到广泛应用的音频拨号信令,一个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编码加倍。
3)发送的DTMF信号的幅度在一定范围内可调,此时仍能完成DTMF信号的正常检测。
1.3方案完成情况
在实现基本要求的基础上,我们又完成了发挥部分的全部要求:
能够实现在一个DSP实验箱上同时实现自发自收,基本能实现无差错传输。
通过改变处理信号的点数N的数值实现了DTMF信号编码加倍,能够在一秒内传送够多的数据。
通过gel添加滑动条的方法实现输入信号幅度可调,并实现判决门限的自适应处理,能随着幅度的变化自动调整门限的值,进而了判决传输信号的正确性。
2设计内容
2.1DTMF信号的的定义
双音多频(DTMF)信号是由两个不同频率的信号叠加而成,设V(t)为DTMF信号、
和
分别为构成V(t)的两个信号,则它们应满足关系式
(1)。
V(t)=
+
(1)
根据CCITT建议,国际上采用697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz、1633Hz8个频率,并将其分成两个群,即低频群和高频群。
从低频群和高频群中任意抽出一个频率进行叠加组合,具有16种组合形式,让其代表数字和功率,如表3-1所列,则有关系式
(2)。
V(t)=Asin
t+Bsin
t
(2)
其中Asin
t为低频群的值,Bsin
t为高频组的值,A、B分别为低频群和高频群样值的量化基线,具体见表2-1。
1209
1336
1477
1633
697
1
2
3
A
770
4
5
6
B
852
7
8
9
C
941
*
0
#
D
表2-1DTMF频率及其对应的键值
2.2DTMF信号生成方法
2.2.1利用math.h采用数学方法产生DTMF信号
buffer[k]=sin(2*pi*k*f0/fs)+sin(2*pi*k*f1/fs)(式2-1)
f0为行频频率,f1为列频频率,fs为8000采样频率,k为对信号的采样。
2.2.2利用两个二阶数字正弦波振荡器产生DTMF信号(本课程设计实际采用方法)
DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。
向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。
典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,即可满足Nyquist条件。
由数字振荡器对的框图,可以得到该二阶系统函数的差分方程
(式2-2)
其中a1=-2cosω0,a2=1,ω0=2πf0/fs,fs为采样频率,f0为输出正弦波的频率,A为输出正弦波的幅度。
该式初值为y(-1)=0,y(-2)=-Asinω0。
CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。
代表数字的音频信号必须持续至少45ms,但不超过55ms。
100ms内其他时间为静音,以便区别连续的两个按键信号。
编程的流程如图1所示,由CCITT的规定,数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。
每个任务结束后,启动下一个任务前(音频信号任务或静音任务),都必须复位决定其持续时间的定时器变量。
在静音任务结束后,DSP从数字缓存中调出下一个数字,判决该数字信号所对应的行频和列频信号,并根据不同频率确定其初始化参数a1=-2cosω0与y(-2)=-Asinω0。
该流程图可采用C语言实现,双音信号的产生则由54x汇编代码实现。
整个程序作为C54x的多通道缓冲串口(McBsp)的发射串口中断服务子程序,由外部送入的16000Hz串口时钟触发中断,可实时处理并通过D/A转换器输出DTMF信令信号。
图2-1DTMF编码流程
2.3DTMF信号的检测方法
DTMF信号的检测方法可以有多种。
主要分为从信号时间域处理和从信号频率域处理两大类。
前一种方法包括:
过零点位置检测法、信号峰值位置检测法、过零点位置及信号幅值检测法。
其特点是实现简单,可以通过MT8880等芯片加上外围电路实现,易于集成化。
缺点是易受干扰,对信噪比要求高。
现在广泛应用于一般的脉冲拨号电话机。
通过神经网络等辅助判别方法可以大大提高信号的识别率。
后一种方法包括:
频率判断、能量判断两类。
频率判断主要通过滤波器提取DTMF相应的频率信号进行比较判断,滤波器可以用窄带、低通、高通滤波器,应用方式可以有并联、级联、混合联接等方式。
能量判断是直接对DTMF信号相应的能量进行计算,找出高、低频率群中最强的信号,进行判断,包括有DFT法(DiscreteFourierTransform)、FFT(FastFourierTransform)、Goertzel法等。
本次实验我们采用的是能量判断法,并采用了Goertzel算法。
3设计方案、算法原理说明
3.1Goertzel算法原理
Goertzel算法信号解码是将两个音频信号提取出来,并通过他们的频率,确定所接受的DTMF数字。
原来使用模拟技术音频信号频率进行检测,一般通过模拟电路进行过零点检测,通过零点计数完成对输入信号的频率检测。
在数字信号检测电路中,一般使用频域计算技术代替时域信号处理。
我们可以直接通过付立叶变换,直接得到输入的信号频率。
信号各个频率分量的幅值直接计算可以使用DFT。
对于N点数据序列{x(n)}的DFT为:
(式3-1)
如果用FFT算法来实现DFT计算,计算将涉及复数乘法和加法,并且计算量为
。
虽然我们可以得到DFT的所有N个值,然而,如果希望计算DFT的M个点,并且M<
时,可以看到,直接计算DFT则更加有效。
下面我们用到Goertzel法,是一种直接计算DFT有效的方法。
我们应用Goertzel算法对DTMF信号的检测,并且对其进行改进。
Goertzel算法,从根本上说,是计算DFT的一种线性滤波算法,它可以通过调整滤波器的中心频率和带宽,直接计算出DFT的系数。
Goertzel算法利用相位因子
的周期性。
我们可以同时将DFT运算表示为线性滤波运算,由于
=1,我们可以用该因子对公式(4)(DFT表达式)两边相乘,得到:
(式3-2)
我们注意到,上式就是卷积形式。
可以定义序列
为:
(式3-3)
显然,Yk(n)就是长度为N的有限长输入序列
与具有如下单位脉冲响应的滤波器的卷积:
(式3-4)
可以看到,当n=N时,该滤波器的输出就是DFT在频点
值
即
(式3-5)
我们可以通过比较式(6)和式(7)来验证上式。
对于单位脉冲响应为
的滤波器来说,其系统函数为:
(式3-6)
这个滤波器只有一个位于单位圆上的极点,其频率为
。
因此,可以使用输入数据块通过N个并行的单极点滤波器或者谐振器组来计算全部的DFT,其中每个滤波器有一个位于DFT响应频率的极点。
因此,对于式(7)的卷积计算,我们可以使用差分方程形式来表示用式(9)给出的滤波器,通过迭代的方法计算
,从而得出DFT的计算结果:
(式3-7)
计算涉及复数加法和复数乘法,计算量大。
由于我们只需要计算幅值信息,而不关心相位信息。
我们在单位圆上另外引入一个极点,与原有的极点形成一对共扼极点。
将两个滤波器组成一对复数共轭极点的谐振器。
原有的单极点滤波器计算方式变成形如式(10)的方式。
其系统函数为:
(式3-8)
上式中:
,为差分方程的系数。
由于引入了复数共扼极点,避免了式(9)中复杂的复数加法和复数乘法。
显然,对式(10)无法进行直接计算。
为了便于计算实现,我们引入中间变量
,将式(9)表示为差分方程形式:
(式3-9)
式中,初始条件为:
(式3-10)
其中,
3.2Goertzel算法改进与实现
Goertzel算法是计算离散傅立叶变换的方法,需要计算的频率点数不超过21092N时Goertzel算法将比FFT(FastFourierTransform)更为有效。
Goertzel算法相当于一个二阶IIR滤波器,(10)式是它的转移函数我们可以根据(10)式画出改进Goertzel算法的模拟框图,如图3-1所示
图3-1Goertzel算法的模拟框图
图2中可看到,整个计算过程分为两部分:
前向通路式(11)和反馈通路式(12)。
显然,对于式(11)的递推关系计算需要重复N=1,?
,N重复N+1次,但是式(12)中的反向计算只需要在n=N时计算一淡。
每次计算只需要计算一次实数乘法和两次实数加法。
所以,对实数序列x(n),由于对称性,用这种算法求出X(k)和X(N-k)的值需要N+1次实数乘法运算。
我们现在可应用Goertzel算法完成实现DTMF解码器了。
由于有8种可能的音频信号需要检测。
所以需要至少8个由式(9)给出的滤波器,将每个滤波器调谐到这8个频率值上。
在完成信号判决时,我们并不需要相位信息,只需要幅值信息|X(k)|。
因此,对式(12)两边进行平方,计算幅度的平方值|X(k)|2。
我们将递推方程式(9,11,12)进一步简化,得到滤波器计算的前向部分的简化表达方式,即滤波表达式的分子项部分:
由于我们只需要幅值信息,不需要相位信息,因此,对前向部分进行改进,输出幅度平方值。
(式3-1)
3.3改进Goertzel算法原理小结
在式(12)中可以使用A,B分别代替递归项,令
,
将离散付里叶变换DFT的改进计算过程总结写为:
(式3-2)
其中
,
可以看到,由于上面两式中:
忽略相位信息,使用实数运算,无复数运算。
等式右边全部是实数运算,大大提高了运算速度,降低计算量。
3.4实际实现中误差分析
3.4.1舍入误差问题
我们再次回到公式3-1进行分析:
(式3-1)
简单地说,在实际的DSP实现中将使用(4)式和(6)式来得到DTMF信号的频谱信息,(4)式实际就是一个递归线性滤波器的表达式,它在n=0…N之间进行循环。
每N个样点对公式(6)进行了一次计算。
在这个算法中,DTMF频率(fi)变换成了离散傅立叶系数(k),它们之间存在如下关系:
这里,N是滤波器的长度,fs是采样频率。
在给定的采样频率下,我们可以通过调整N和K值,得到相应的DTMF频率(
)上的能量幅值。
但是,由于k和N是整数,有可能不能取到合适的DTMF频率(fi)。
实际上,计算时如果采用FFT变换,计算字长N将被限定为2得n次方,每次计算可以同时得到N/2个频率点的幅度值。
而对于DFT或Goertzel算法来说,对于N长度的算法,其可以分辨的最高频率为采样频率的一半。
其输出序列为
{X(0)、X
(1)……,X(N)}
对应的信号计算频率为fi,i=0,1,…,N。
所以,我们可以知道,可计算的信号频率存在一定的限制。
式(4-12)给出了Goertzel算法的频率分辨率。
对于不是正好在输出序列计算点上的信号频率,其计算结果分布在相近的频率值上,将会出现泄漏,这不是我们所期望的。
3.4.2计算字长N的问题提出
N和k的选择不同,计算的误差会有很大不同。
缩小N值,将显着减少计算量,所以N值的选取,是完成实时计算的核心。
在相关文献中,N值的选取也有很大的不同。
有使用16个106字长计算完成信号监测及语音检测的,也有使用105字长或205字长完成Goertzel算法完成检测的,由此我们提出这样一个问题,在文所利用的Goertzel算法中,进行DTMF信号检测的最佳字长是多少?
由采样频率公式可知,在采样率一定的情况下,N值的取值同时决定Goertzel算法计算时对应的频率,即Goertzel滤波器的中心频率。
通过改变N值,计算出我们感兴趣的对应一组k值,即完成DTMF频率检测。
但是,由式(14)可知k取整数,计算中心频率的位置与实际的DTMF频率必然会产生一定的舍入误差。
我们将Goertzel算法中的中心频率与实际的DTMF频率的差值定义为D。
可以计算出D的最大值为
Dmax=
当k的误差
=0.5时,对应的频率百分比为:
为所需计算的DTMF频率。
这实际上是DTMF频率位于“所计算的信号窗口的边缘”。
当N值取较大值时,同时采取较高的采样频率可以取得较准确的检测结果,但是也加大了计算量。
由于N的取值,影响了计算时的Goertzel滤波器的中心频率的位置。
实际应用中,首先需要确定N,同时对应不同的DTMF频率,取相应的k值,通过Goertzel算法,得到相应的X(k)。
可以看到,N的取值是Goertzel算法设计DTMF信号检测器的关键,它直接决定了检测器的性能及对ITU建议的满足性。
以下讨论在满足ITU要求的情况下,寻找的N值的过程,同时,我们在这里讨论的是误差的百分比,因此,可以通过计算点数的误差百分比来估计频率的百分比。
3.4.3Goertzel算法中N的选择要求
N的选择应考虑如下的因素:
频率偏移度不但要求主瓣宽度存在一定的范围之内,同时也和计算窗口中心频率有关。
Goertzel算法种计算长度N的取值也影响到计算窗口中心频率的取值。
例如,如果N=125,fs=8000Hz,对于770Hz信号的完成检测,频域分辨率为8000/125=64Hz,ITU规定的对于频率误差大于3.5%的信号拒识,即对于770Hz信号为中心,宽度为743.05到769.95。
39.0Hz的频率分辨率将矗立的信号为780.488Hz为中心,其他范围的频率则不满足规定要求。
3.4.4舍入误差的寻优
根据
,在Goertzel算法进行递归计算时k要取整数,因而存在舍入误差。
舍入误差是随机和离散的,不同的N值和不同的fi舍入误差是不同的,因此造成的频率的偏移也是不同的。
由于k的舍入误差反映的是频率的偏移,因此必须兼顾每个频率,选择k舍入误差小得N值。
表3-1列出了当N=125时,不同的频率k值的舍入误差,表3-2列出了当N=205时,不同的频率k值的舍入误差.
信号频率(Hz)
k计算值
k
相对偏差(%)
679
10.891
11
1.0
770
12.031
12
0.3
852
13.313
13
2.3
941
14.703
15
2.0
1209
18.891
19
0.6
1336
20.875
21
0.6
1477
23.078
23
0.3
1633
25.516
25
2.0
表3-1N=125时不同的频率值k的舍入误差
信号频率(Hz)
k计算值
k
相对偏差(%)
679
17.861
18
0.8
770
19.731
20
1.4
852
21.833
22
0.8
941
24.113
24
0.5
1209
30.981
31
0.1
1336
34.235
34
0.7
1477
37.848
38
0.4
1633
41.846
42
0.4
表3-2N=205时不同的频率值k的舍入误差
由于k的舍入误差反映的是频率的偏移,因此必须选择k舍入误差小的N值。
同时还要兼顾每个频率,每个频率k舍入误差都比较小,或者尽可能的都取“舍”或者都取“入”,这样就会使偏移比较小或者都向同一个方向偏移。
3.4.5复杂度比较
直接计算离散傅里叶变换,对于每一个k值,需要4N次实数乘法及4N-2次的实数加法,N点的傅里叶变换需要
次实数乘法及N(4N-2)次实数加法,因此,采用直接法计算的计算复杂度为O(
)。
对于Goertzel算法来说。
其输入的X(n),Wk,是复数,每计算一个新输出Y值需要做四次实数加法和四次实数乘法。
由于我们只需要幅值信息,对于相位信息可以忽略,通过变换得到幅值信息。
因此,共需要N+l次实数乘法,计算复杂度为O(
)。
对于单个解码器来说,对于每次成功完成DTMF信号解码的时间估计十分重要。
通过对解码器的处理时间估计,我们可以得到其处理性能,通过对处理性能评价,就可以预计单个解码器工作时可以承载的最大信道个数。
在这里,定义DTMF解码器成功完成两个DTMF信号解码之间所耗费的时间可以这样估算:
每处理一个采样样本的时间间隔允许的最大值为:
125
(式3-3)
前向计算所需的时间为:
可以看到,计算时间主要决定于计算字长N。
对于每一个需要检测的频率,都必须进行(N+4)次实数乘法和(N十2)次加法。
检测8个DTMF频率需要的总共的计算量为:
(8N+32)次乘法与(16N十16)次实数加法。
4算法流程图
图4-1程序算法流程图
5源程序注释
5.1初始化程序
//*****************************初始化**********************************
//InitializeCSLlibrary-ThisisREQUIRED!
!
!
CSL_init();
//Themainfrequencyofsystemis240MHz
//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数
PLL_setFreq(1,0xC,0,1,3,3,0);
//EMIF初始化
Emif_Config();
//OpenMcBSPport1andgetaMcBSPtypehandle
hMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
//ConfigMcBSPport1byusepreviouslydefinedstructure
Mcbsp_Config(hMcbsp);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化
inti_AIC();
5.2二极管闪烁程序
//*******************程序正常执行:
二极管闪烁两次***********************
while(cnt--)
{
asm("BCLRXF");//;ClearXF
delay(3000);
asm("BSETXF");//;SetXF
delay(3000);
}
5.3DTMF信号产生,发送与接收
//**********************DTMF信号产生,发送,接收*************************
for(i=0;i<16;i++)
{
f0=freq[i][0];//顺序获取各符号低频数据
row_freq[i][0]=cos(2*pi*f0/fs);
row_freq[i][1]=sin(2*pi*f0/fs);
}
for(i=0;i<16;i++)
{
f0=freq[i][1];//顺序获取各符号高频数据
column_freq[i][0]=cos(2*pi*f0/fs);
column_freq[i][1]=sin(2*pi*f0/fs);
}
for(k=0;k<16;)//基于两个二阶数字正弦振荡器,产生DTMF信号
{
ax1=row_freq[k][0];
x_n_2=-row_freq[k][1];
ay1=column_freq[k][0];
y_n_2=-column_freq[k][1];
x_n_1=0;
y_n_1=0;
for(j=0;j<200;j++)//传输信号采样值,设产生信号的持续时间为50ms,所以j为200。
{
x_n=2*ax1*x_n_1-x_n_2;
y_n=2*ay1*y_n_1-y_n_2;
z_n=x_n+y_n;
x_n_2=x_n_1;
x_n_1=x_n;
y_n_2=y_n_1;
y_n_1=y_n;
dtmf[j]=z_n*gain;//gain(可变)改变产生信号的幅度,使之在一定范围内可调,
while(!
MCBSP_xrdy(hMcbsp)){};//左声道信号发送
MCBSP_write16(hMcbsp,dtmf[j]);//采样值的装入,前二百个点为双音信号采样值
while(!
MCBSP_xrdy(hMcbsp)){};//右声道信号发送
MCBSP_write16(hMcbsp,dtmf[j]);//采样值的装入,前二百个点为双音信号采样值
while(!
MCBSP_rrdy(hMcbsp)){};//左声道信号接收
dtmfr[j]=MCBSP_read16(hMcbsp);
while(!
MCBSP_rrdy(hMcbsp)){};//右声道信号接收
dtmfr[j]=MCBSP_read16(hMcbsp);
}
for(j=0;j<200;j++)//传输静音信号,设产生信号的持续时间为50ms,所以j为200。
{
dtmf[j+200]=0;//后二百个点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dtmf 信号 产生 检测 实验 报告