DTMF信号的产生与检测-实验报告Word文档格式.doc
- 文档编号:346997
- 上传时间:2023-04-28
- 格式:DOC
- 页数:32
- 大小:1.08MB
DTMF信号的产生与检测-实验报告Word文档格式.doc
《DTMF信号的产生与检测-实验报告Word文档格式.doc》由会员分享,可在线阅读,更多相关《DTMF信号的产生与检测-实验报告Word文档格式.doc(32页珍藏版)》请在冰点文库上搜索。
V(t)=+
(1)
根据CCITT建议,国际上采用697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz、1633Hz8个频率,并将其分成两个群,即低频群和高频群。
从低频群和高频群中任意抽出一个频率进行叠加组合,具有16种组合形式,让其代表数字和功率,如表3-1所列,则有关系式
(2)。
V(t)=Asint+Bsint
(2)
其中Asint为低频群的值,Bsint为高频组的值,A、B分别为低频群和高频群样值的量化基线,具体见表2-1。
1209
1336
1477
1633
697
1
2
3
A
770
4
5
6
B
852
7
8
9
C
941
*
#
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进行分析:
简单地说,在实际的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
12.031
12
0.3
13.313
13
2.3
14.703
15
2.0
18.891
19
0.6
20.875
21
23.078
23
25.516
25
表3-1N=125时不同的频率值k的舍入误差
17.861
18
0.8
19.731
20
1.4
21.833
22
24.113
24
0.5
30.981
31
0.1
34.235
34
0.7
37.848
38
0.4
41.846
42
表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);
//ConfigMcBSP port1byusepreviouslydefinedstructure
Mcbsp_Config(hMcbsp);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化
inti_AIC();
5.2二极管闪烁程序
//*******************程序正常执行:
二极管闪烁两次***********************
while(cnt--)
{
asm("
BCLRXF"
);
//;
ClearXF
delay(3000);
BSETXF"
SetXF
}
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;
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<
)//基于两个二阶数字正弦振荡器,产生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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DTMF 信号 产生 检测 实验 报告