DTMF信号的产生及检测要点.pdf
《DTMF信号的产生及检测要点.pdf》由会员分享,可在线阅读,更多相关《DTMF信号的产生及检测要点.pdf(18页珍藏版)》请在三一文库上搜索。
1、DSP课程设计 实验报告 DTMF 信号的产生及检测 院(系):电子信息工程学院 - 通信工程 设计人员: 周钰哲学号: 08211052 苗祚雨08212075 1 目录 一、设计任务书2 二、设计内容2 三、设计方案、算法原理说明3 四、程序设计、调试与结果分析6 五、设计(安装)与调试的体会16 六、参考文献16 2 一设计任务要求 双音多频 DTMF (Dual Tone Multi Frequency)是在按键式电话机上得到广泛应 用的音频拨号信令, 一个 DTMF 信号由两个频率的音频信号叠加构成。这两个音频信 号的频率分别来自两组预定义的频率组:行频组和列频组。 每组分别包括 4
2、 个频率, 分别抽出一个频率进行组合就可以组成16 种 DTMF 编码,分别记作 09、*、#、A、 B、C、D。如下图 1 所示。 图 1 DTMF 信令的编码 要用 DSP 产生 DTMF 信号,只要产生两个正弦波叠加在一起即可;DTMF 检测时采 用改进的 Goertzel 算法,从频域搜索两个正弦波的存在。 1、基本部分: (1)使用 C语言编写 DTMF 信号的发生程序,要求循环产生09、*、#、A、B、 C、D对应的 DTMF 信号,并且符合CCITT对 DTMF 信号规定的指标。 (2) 使用 C语言编写 DTMF 信号的检测程序, 检测到的 DTMF 编码在屏幕上显示。 2、发
3、挥部分: 利用 DTMF 信号完成数据通讯的功能,并试改进DTMF 信号的规定指标,使每秒 内传送的 DTMF 编码越多越好。 3、要求完成的任务 (1)编写 C语言程序,并在 CCS 集成开发环境下调试通过。 (2)实现设计所要求的各项功能。 (3)按要求撰写设计报告。 二、设计内容 DTMF 发生器基于两个二阶数字正弦振荡器,一个用于产生行频,一个用于产生 列频。 在输入信号中检测DTMF 信号,需要在输入的数据信号流中连续地搜索DTMF 信 号频谱的存在。 整个检测过程分两步: 首先采用 Goertzel算法在输入信号中提取频 3 谱信息;接着作检测结果的有效性检查。Goertzel 算
4、法实质是一个两极点的IIR 滤 波器。 三、设计方案、算法原理说明 要用 DSP 产生 DTMF 信号,只要通过两个正弦波叠加在一起即可;DTMF 检测时 采用改进的 Goertzel 算法,从频域搜索两个正弦波的存在。 (1)DTMF 信号的产生 DTMF 编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产 生列频。向 DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八 个音频信号。典型的DTMF 信号频率范围是 7001700Hz ,选取 8000Hz作为采样频 率,即可满足 Nyquist 条件。 DTMF 数字振荡器对的二阶系统函数的差分方程为: 其中,为采
5、样频率,为输出 正弦波的频率,为输出正弦波的幅度。该式初值为,。 用 sin 函数产生离散的正弦值,生成DTMF 的公式为: buffert=sin(t*2*pi*f1/fs)+sin(t*2*pi*f2/fs) 其中 t 为采样序数, 由 0 开始递增;f1 ,f2 为生成 DTMF 信号的两个正弦波的频 率;fs 为采样频率; buffert为序数 t 时的得出的采样值。 将这些数据转换为Q15 格式然后通过 codec 发送出去。 CCITT对 DTMF 信号规定的指标是,传送 / 接收率为每秒 10 个数字,即每个数字 100ms 。代表数字的音频信号必须持续至少45ms ,但不超过
6、55ms 。100ms内其他时 间为静音,以便区别连续的两个按键信号。我们使用 8000Hz的采样频率(电话信号 的典型抽样频率为 sam f =8kHZ ),即 1 秒采样 8000个点,则 100ms采样 800个点, 我们设置 800 个点的缓存,其中用 400个存产生的 DTMF 信号值,即音频信号必须持 续 50ms ,另外 400个存 0 值,即静音信号。 (2)DTMF 信号的检测 DTMF 检测是对进入解码端的信号进行检测,并把双音频信号转换成对应的数字 信息。它是一个比DTMF 产生更加复杂过程。由于数据流是连续的,为了保证DTMF 检测的实时性,因此要求检测过程必须是实时连
7、续的。 4 在输入信号中检测DTMF 信号,需要在输入的数据信号流中连续地搜索DTMF 信 号频谱的存在。整个检测过程分两步:首先采用Goertzel 算法在输入信号中提取 频谱信息;接着作检测结果的有效性检查。 DTMF 解码时在输入信号中搜索出有效的行频和列频。计算数字信号的频谱可以 采用 DFT 及其快速算法 FFT ,而在实现 DTMF 解码时,采用 Goertzel 算法要比 FFT 更快。通过 FFT 可以计算得到信号所有谱线, 了解信号整个频域信息, 而对于 DTMF 信号只需关心其 8 个行频 / 列频及其二次谐波信息即可,二次谐波的信息用于将 DTMF 信号与声音信号区别开。
8、 此时 Goertzel 算法能更加快速的在输入信号中提取 频谱信息。 Goertzel 算法实质是一个两极点的IIR 滤波器。 Goertzel 算法原理: DTMF 检测器的核心是 Goertzel算法。 该算法利用二极点的IIR 滤波器计算离散 傅立叶变换值,能够快速高效地提取输入信号的频谱信息。由于IIR 滤波器是一个 递归结构,它利用只有一个实系数的差分方程进行操作,并不像DFT或 FFT算法那 样需要计算数据块,而是每输入一个样值就执行一次算法。 完成时域到频域的变换可以用离散傅立叶变换(DFT)或快速傅立叶变 (FFT) FFT 计算出所有点频率,而DFT可以只计算感兴趣的频率点
9、如果要计算的频率点数少 于 log 2N(N 为输入信号点数 ),采用 DFT的计算速度比 FFT更快。 直接计算 DFT ,需要很多复系数, 即使只计算一点的DFT也需要 N个复系数采 用数字信号处理中的Goertzel算法,如图 2,则可明显地提高速度。 图 2 Goertzel算法原理框图 inputnx vv nxnvnvknv kk kkNk )( 0)2(0)1( )()2()1()cos(2)( 2 在实际的 DTMF 检测中,只需 DFT的幅度(本算法为平方幅度)信息就足够了, 因此在 Goertzel 滤波器中,当 N点 (相当于 DFT数据块的长度)样值输入滤波器后, 滤波
10、器输出伪 DFT值 vk(n),由 vk(n)即可确定频谱的平方幅度。 5 ) 1()()cos(2)1()( )()()( 2 22 2 NvNvkNvNv NyNykX kkNkk kk 其中 k=f*N/fs ,当 N取值为 125 时, k 的取值经计算如表1 所示: 信号频率 (Hz) 计算值 k 取整值 k 绝对误差相对误差 697 10.890625 11 0.109375 1.00430% 770 12.03125 12 0.03125 0.25974% 852 13.3125 13 0.3125 2.34741% 941 14.703125 15 0.296875 2.019
11、12% 1209 18.890625 19 0.109375 0.57899% 1336 20.875 21 0.125 0.59880% 1477 23.078125 23 0.078125 0.33852% 1633 25.515625 25 0.515625 2.02082% 表 1 一旦得到行 / 列频率的频谱平方幅度信息, 就可以通过一系列的判决来确定音频 及数字结果的有效性。 首先,检测可能 DTMF 信号的强度是否足够大。 行频率分量和列频率分量的平方 幅度和应高于某一确定门限。 注意与 DTMF 频率相符的正弦波的能量集中在频域内一 段很窄的范围当中,所以门限取值应占动态范围的
12、大部分。 第二,如果 DTMF 信号存在,由于构成DTMF 信号的行频都低于列频,因此从小 到大依次判断各个频率点的频谱幅度,得到的第一个达到门限要求的的频率点即为 行频,第二个即为列频,综合行频和列频即可得出检测到的按键信息。 检测流程图: 6 图 3 检测流程图 四、程序设计、调试与结果分析 (1)发送源程序代码如下: /*/ /* DTMFsignal 发送程序 send.c */ /*/ #include #include #include #include #include #include void delay(int period); void generate(int num)
13、; HANDLE hHandset; float buffer800; s16 num=0; 7 int count=0; float freq162= 941,1336, /键值 0对应的行频列频 697,1209, /1 697,1336, /2 697,1477, /3 770,1209, /4 770,1336, /5 770,1477, /6 852,1209, /7 852,1336, /8 852,1477, /9 697,1633, /A 770,1633, /B 852,1633, /C 941,1633, /D 941,1209, /* 941,1477 /# ; floa
14、t pi=3.1415926; void main() int cnt=2; if(brd_init(100) return; /* blink the leds a couple times */ while ( cnt- ) /* 二极管闪两次 */ brd_led_toggle(BRD_LED0); /brd_delay_msec(1000); delay(1000); brd_led_toggle(BRD_LED1); /brd_delay_msec(1000); delay(1000); brd_led_toggle(BRD_LED2); /brd_delay_msec(1000);
15、 delay(1000); /* Open Handset Codec */ hHandset = codec_open(HANDSET_CODEC); /* Acquire handle to codec */ /* Set codec parameters */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */ codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */ codec_ain_gain(hHandset, CODEC
16、_AIN_6dB);/* 6dB gain on analog input to ADC */ 8 codec_aout_gain(hHandset, CODEC_AOUT_MINUS_12dB); /* -12dB gain on analog */ /* output from DAC */ codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */ generate(num); void generate(int num) f32 x,y; int k=0; int i; i=0; while(1) / Wait for s
17、ample from handset while (!MCBSP_XRDY(HANDSET_CODEC) ; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=bufferi; i+; if(i=800) i=0; num+; if(num=16) num=0; x=freqnum0/8000; y=freqnum1/8000; for(k=0;k1; j+); (2)检测源程序代码如下: /*/ 9 /* DTMFsignal 检测程序 receive.c */ /*/ #include #include #include #include #include
18、#include HANDLE hHandset; float buffer125; float pi=3.1415926; s16 receive125; s16 dacdata; int k=0; int detect_result100=0; int l=0; int flag=0; void delay(int period); void detect(); void main() int cnt=2; /* Description: * vk(n) = 2*coef*vk(n-1) - vk(n-2) + x(n) * * Coefficients are in w8 * x(n)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DTMF 信号 产生 检测 要点
链接地址:https://www.31doc.com/p-5196755.html