amobbs.com 阿莫电子技术论坛

标题: 发布:单片机 DTMF 软解码算法的实现 [打印本页]

作者: hendry    时间: 2009-3-5 21:57
标题: 发布:单片机 DTMF 软解码算法的实现
我在2008年发布了一个用 mega8 软解码 DTMF 的例子,后来网站遭攻击丢了,感谢有好心人进行了恢复,但还不完整,现看到有人打听此事,就再重发一遍如下:

   DTMF 软解码算法 + VC 验证程序ourdev_423854.rar(文件大小:55K) (原文件名:发布dtmf解码程序.rar)
DTMF 软解码算法 + mega 验证程序ourdev_423855.rar(文件大小:65K) (原文件名:发布DTMF解码Mega程序.rar)

  说明:
  
  1)包含两个工程文件,一个 VC 平台的,一个 IAR for avr 平台的。

  2)每个工程文件里面都包含 DTMF 软解码算法文件,算法文件完全相同。

  3)属本人原创,请勿用作商用,否则保留追究权力。
作者: shmily    时间: 2009-3-5 22:07
mark
作者: mdwctguan    时间: 2009-3-5 22:09
mark.楼主当初的帖子,让我一下子明白了数字信号处理的厉害之处,终于醒悟.谢谢!
作者: dygpyy    时间: 2009-3-12 09:03
hendry 大哥!
   
        真谢谢你把源码贴出来,真是感激的万分,给了求学路上的小弟们一个明灯!


         崇拜你的小弟:desun
作者: OurWay    时间: 2009-3-12 09:15
谢谢提供,MICROCHIP好像有一篇文章也讲的这个,不过没搞懂,呵呵
作者: zc3909    时间: 2009-3-12 09:16
不错,收了,谢谢!
作者: zhuchaohua    时间: 2009-3-12 09:56
强贴,我通常都用Goertzel算法来递归,就是没有用欧拉公式来直接做表
作者: yin66    时间: 2009-3-12 09:58
mark
作者: zhuchaohua    时间: 2009-3-12 10:20
深挖一下,在PIC的网站上发现一个类似的东西 点击此处下载 ourdev_425128.zip(文件大小:926K) (原文件名:MCHP_DTMFDetv1.2.zip)
作者: cgbabc    时间: 2009-3-12 10:41
支持呀
作者: tclandmei    时间: 2009-3-12 11:00
是把计算分散到每次后,而不是在一段采样后再计算吗?!

和【6楼】 zhuchaohua 一样,我也是常用Goertzel(8k,16位定点,m88,16m晶体)!

LZ强! 请教LZ性能(4k)还可以吗?!
很多都资料推荐8k除谐波!

如果性能还不错,就学习LZ的方法,耗的资源少!
作者: hendry    时间: 2009-3-14 14:31
在以前帖子上,我曾经和Goertzel算法进行过理论上的比较,结论是 我的采样率低(4k)、样本少(每50点)、乘法次数多(每样本2次)、省ram、费rom(查表), Goertzel 的采样率高(8k)、样本多(每100点)、乘法次数少(每样本1次)、费ram、省rom(表很小),实时性相同,每都是12.5ms解出一个 dtmf 码。综合来看,若是单片机资源紧张的话,我的算法可能合适些。

从试验情况看,解码准确率还是可以的,为此有一个网友制作了一个 windows 下的测试小软件,可惜我没有保存下来。
作者: hendry    时间: 2009-3-14 14:41
Goertzel算法描述:
http://www.miniwiki.org/wiki/index.php?wiki=_content.en_version.presenting..Goertzel_algorithm
作者: hendry    时间: 2009-3-14 14:47
【10楼】 tclandmei 小罗:

把计算分散到每次采样后,和采一段样后集中计算,结果是一样的,实际采用哪种都行。
作者: tclandmei    时间: 2009-3-14 15:04
好!谢谢!

学习一下!
作者: cgbabc    时间: 2009-3-14 18:32
好,支持一个
作者: xullin    时间: 2009-3-14 19:15
留名
作者: iam35200    时间: 2009-3-14 20:08
顶你!
作者: antonine    时间: 2009-3-14 20:36
谢谢,学习了。。。
作者: yhyf_heart    时间: 2009-3-14 20:44
MARK!!!
作者: hendry    时间: 2009-3-18 23:28
前面提到的那个有心网友(对不起忘记名字了)开发的小工具找到了,下面就是,我代替重发一遍:

?????¨?ü????×???????????????±????????¤??ourdev_426404.rar(文件大小:733K) (原文件名:test tool.rar)

这个工具对比了 我的算法 和 Goertzel 算法的解码效果。
作者: dygpyy    时间: 2009-3-22 12:14
hendry大哥
       你能说说你的400查表是怎么计算出来的嘛,知道这个方法后,我还可以应用到其他的频率的检测,谢谢!!

                 盼复!!!!!!!!!!!!!!!!!!!!!!!
作者: walker    时间: 2009-3-22 15:03
对于AVR来说Goertzel算法还是合适的,AVR资源很宽松。
作者: ouravr1000    时间: 2009-3-26 23:36
巨强,看看
作者: QZDZ    时间: 2009-3-27 09:49
非常厉害,打个mark
作者: YourARM    时间: 2009-3-27 10:08
算法是好东西
作者: pinocchio    时间: 2009-3-27 10:24
mark
作者: miraclelife    时间: 2009-3-27 15:49
牙印
作者: homexxhh    时间: 2009-3-27 17:39
LZ能不能把电路图贴上给我们这些小菜学习学习...谢谢了哈!
作者: hendry    时间: 2009-3-27 20:40
论坛中有一个帖子寻求检测背景噪声中特定频率正弦波信号的方法,但是楼主特别指明不用 FFT,所以我推荐其用 LM567 锁相环硬件实现。

其实,解其他频率也是可以的,21 楼不是在问吗,那个表格是这样计算来的:
table1 = list of cos(2*PI*f*N*T), N = 0, 1, 2, ...49
table2 = list of sin(2*PI*f*N*T), N = 0, 1, 2, ...49
PI = 3.1415926
f = 检测频点频率,单位 Hz
T = 采样周期, 采样率的倒数, 取值 1/4000Hz,单位秒

其实也没什么啦,就是利用傅里叶积分公式计算了一下,学过信号处理的都知道的,只是为了避免让单片机开方运算,最后计算幅值时我采用了变通方法,改成计算绝对值。
作者: Stupid    时间: 2009-5-7 00:09
hendry大哥
请教一下,2*PI*f*N*T=2*PI*697*1*0。00025=1.0948450211,然后COS表中怎么得到0X3A呢?谢谢!
作者: banyan_city    时间: 2009-5-7 00:23
mark
作者: xoxo    时间: 2009-5-24 10:46
hendry:
    我试了运行你的程序,采用MEGA48,测试后不能解码。但是AD转换出来的电压确实正常,实测AD值为0x0203,电源电压5.003V,输入采样电压为2.519V。还有你发布的IAR源码是2K的T1中断,我改到了T0上的CTC模式,用示波器测试确实是4000HZ。我是把AD输入直接接到电话线上,然后按电话号码,串口没有数据出来,可是并接的电话测试仪上确实能显示我按的号码?希望能指点一下,谢谢!!!
作者: chairang    时间: 2009-5-24 11:24
有意思
作者: xiaowei0588    时间: 2009-5-25 08:07
很好!
作者: helloshi    时间: 2009-5-25 15:37
</a>
作者: hendry    时间: 2009-5-25 17:34
回复30楼:
   cos(1.0948450211) * 127 = 0.45818 * 127 = 0x3A

回复32楼:
   我试过我的电路是可以解码的,请首先按照我的电路试验一下,包括软硬件都不要改动。
作者: tigerding    时间: 2009-5-25 19:59
hendry 兄弟

回复32楼:
   我试过我的电路是可以解码的,请首先按照我的电路试验一下,包括软硬件都不要改动。


你的电路在哪里啊,找了好久没找到啊:)
作者: watercat    时间: 2009-5-25 20:10
说真的,这类东西用带通滤波器做会容易得多,正常会解DTMF的板子也不缺那几个电阻电容的位置……
作者: jhdtry    时间: 2009-6-1 11:23
真相亲你一下
作者: sunlei419    时间: 2009-7-8 14:58
hendry 兄弟
   请问我得到的AD转换的数据是16bit数据呀(0-1023),看你的代码上是写要求输入的是signed char型数据,我该如何处理一下,看32楼,输入的也是16bit数据呀,是不是因为这个所以解不出来呀?还有cos(1.0948450211) * 127中,*127是什么意思?
作者: FREEXP    时间: 2009-8-28 08:53
支持一下
作者: Sader    时间: 2009-8-28 09:04
楼上前辈,给点实质性支援吧~
作者: lee345    时间: 2009-8-28 09:38
不错,参考资料
作者: cowboy    时间: 2009-8-28 09:49
mark
作者: wear778899    时间: 2009-8-28 10:25
记号
作者: xiaowei0588    时间: 2009-8-28 11:30
很好!
作者: Sader    时间: 2009-8-28 11:44
楼主解码后生成的text里应该每50次采样(4k)送一个数字,也就是没有经过处理数据。
那么具体该怎么处理?
哪些数值是有效的,哪些是静音时段?
作者: Sader    时间: 2009-8-28 14:09
我所知道的DTMF是45~55ms音频+静音间隔=100ms,楼主提供的wav似乎只有连续不断的音频而没有静音时间?
作者: Sader    时间: 2009-8-28 15:00
// find max value of low freq
                for (low_freq = 0, i = 1; i < 4; i ++)
                {
                        if (s_dtmf_real > s_dtmf_real[low_freq])
                        {
                                low_freq = i;
                        }
                }

                // find max value of high freq
                for (high_freq = 4, i = 5; i < 8; i ++)
                {
                        if (s_dtmf_real > s_dtmf_real[high_freq])
                        {
                                high_freq = i;
                        }
                }

无论采样结果如何每隔50次采样就会返回一个DTMF字符而没有检验是否有效采样。
那么,应该怎样去校验?
作者: joneywei    时间: 2009-9-9 16:27
多些楼主五四提供
作者: loongsuns    时间: 2009-9-9 16:29
mark
作者: maxiao5231    时间: 2009-12-8 20:55
avr hao ren zhen duo
作者: 001friend    时间: 2009-12-8 21:50
不错,好东西顶一下
作者: kebaojun305    时间: 2009-12-8 21:55
算法是好东西,思路太好了。
作者: oufuqiang    时间: 2009-12-8 22:13
mark
作者: eduhf_123    时间: 2009-12-8 22:14
MARK DTMF软解码算法
作者: markloveyou    时间: 2009-12-8 23:16
学习了
作者: potatoES    时间: 2009-12-8 23:31
好东西
作者: ldh119    时间: 2010-5-8 16:16
那个工具怎么一运行就出错啊
test tool.rar
作者: 63502925    时间: 2010-5-14 14:21
不错,mark
请问怎样精确偏容忍度?提高采样率么?
作者: charlie2008    时间: 2010-5-14 21:09
mark
作者: lzf713    时间: 2010-5-14 23:25
我详细看了程序,其实就是傅立叶积分.

(原文件名:DTMF 解码.GIF)
作者: myhonour    时间: 2010-6-2 19:09
mark
作者: yangyi    时间: 2010-6-2 19:57
有人曾说过,数学可以解决一切问题。深以为然。
作者: xslff    时间: 2010-6-2 21:29
这个很有用哦!
可以用解出来的数字做密码和指令,做远程控制!
作者: hendry    时间: 2010-6-2 21:35
关于DTMF码判定阀值,大家有什么好方法?
作者: Forever    时间: 2010-6-2 21:37
mark!
作者: linnjing    时间: 2010-6-2 21:58
尿个记号,呵呵
作者: renxupeng    时间: 2010-6-2 22:22
mark
作者: lv998127    时间: 2010-6-2 23:41
记号
作者: liurangzhou    时间: 2010-6-3 09:40
mark
作者: xininye    时间: 2010-6-3 10:52
多谢分享,mark
作者: joni    时间: 2010-6-3 13:07
mark
作者: James_King    时间: 2010-6-8 07:38
mark
作者: win2kddk    时间: 2010-6-8 09:01
记下啦
作者: clever0725    时间: 2010-6-8 11:44
是不是搞电话的?
作者: cu_ice    时间: 2010-6-8 13:05
mark
想研究时再下载
作者: markloveyou    时间: 2010-6-8 13:12
记号
作者: yanwuxu    时间: 2010-7-9 15:21
能搞出双音的高低频率和电平就爽了^_^
作者: dragonwww    时间: 2010-7-9 15:52
楼主的数学功力深厚啊,佩服佩服!DTMF能软解,那同样电话线上用的FSK是不是也能软解啊?如何实现呢?
作者: hbzxx    时间: 2010-7-23 08:56
楼主上个原理图吧????????
作者: hendry    时间: 2010-8-18 21:11

DTMF 软解码接线图 (原文件名:ad.JPG)
作者: lionlike    时间: 2010-8-29 08:17
楼主能解释一下,为什么要限幅,和预先做数字处理吗?一下代码是什么意思?!
  //
  // 限幅
  //
  if (adc_value < 0x180)
  {
        adc_value = 0;
  }
  else if (adc_value > 0x27f)
  {
        adc_value = 0xff;
  }
  else
  {
        adc_value = adc_value - 0x180;
  }
谢谢了!
作者: hendry    时间: 2010-8-30 19:33
限幅的原因是,解码器输入是 8 bit 数据,A/D 输出是 10 bit 数据,解码器容纳不下,因此要限幅,就是将 10 bit 数据限制到 8 bit 数据。
作者: cuikai12345    时间: 2010-8-30 22:24
mark
作者: lionlike    时间: 2010-9-1 22:36
再请教楼主!如果采集频率提高到8KHz,就要重新计算那两个表,遇到三角函数是负值如何处理?是按照绝对值计算吗?还是取补码?有没有计算好的8KHz频率的表数据!谢谢了!
作者: xjjiang    时间: 2010-9-2 10:53
楼主,你的算法在这种条件下能准确解码吗?电话播放菜单,也就是电话线上有语音信号,这时有DTMF信号,是否也能准确无误的解析出来呢?如果能,采用了什么措施,如果不能,为什么?多谢大侠
作者: lionlike    时间: 2010-9-2 21:26
感谢楼主!!我已经做出了8KHz频率的采样表,验证时和你的4000样本表比较时有个别值差“1”,应该是编译器的差别吧!再次感谢!!
作者: lcqqcl    时间: 2010-9-3 14:06
记号一下,期待更加完善的电路图
作者: hendry    时间: 2010-9-5 08:42
关于按照 8K 采样率重新计算表格,29楼有说。

三角函数sin, cos 取值范围是 -1.0 ~ 1.0,表格是8位有符号字符型数据,最大可以容纳下 -128 ~ 127 的数,因此,要将 -1.0 ~ 1.0 范围变换到 -128 ~ 127 范围。
作者: hendry    时间: 2010-9-5 08:46
当输入的DTMF信号存在干扰时,例如92楼所说,只要干扰频率不在 DTMF 8个特征频率点上,对解码没有影响,哪怕干扰幅度很大,甚至干扰信号强度超过了DTMF强度也没关系。

但是一旦干扰频率和 DTMF 8个特征频率重叠了,哪怕是很小幅度的干扰,解码也会影响,甚至解码失败。
作者: miminzhang    时间: 2010-9-5 09:07
hao
作者: lionlike    时间: 2010-9-5 22:35
但是我解码出来始终不对,总是不正确的那些结果,挺烦人!我是摘机后进行按键操作,实时采集数据解码显示,解出的键码就是不对!但也是随着按键的不同而产生变化,现象如下:9BBB1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB8CCBB8CCBB2CCBBA8CCBB5CCBBBCCBBBCCCB6B63B6ABCBBB697B6CCBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA9CCBB4B81B8AB2BBCBBCBC1B8CB5BB5BB9BCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBCB9BBB6B6CB5ABBB6B46BCBBBB9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBCBBCBBBC83B8AC9BB3BCB637BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9C6BC15BBBC5BBBB96B69B56BBBBABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB3CCBB68CC6B8C9BB3CCBB68CCBB8C9BB3CCB664
作者: lionlike    时间: 2010-9-5 22:39
受楼主感动,做了一个提取DTMF采样数据的小工具,供大家使用,再次感谢楼主!
作者: lionlike    时间: 2010-9-5 22:41
怎么上传文件?上传后看不见?
作者: lionlike    时间: 2010-9-5 22:47
在这呢!DTMF样本数据采集工具。点击此处下载 ourdev_580645CBAME4.rar(文件大小:3K) (原文件名:DTMF bps.rar)
作者: orange2348    时间: 2010-9-16 08:27
mark
作者: lionlike    时间: 2010-9-16 09:33
以下现象,如何滤波?实际按键为:3、6、9、#,怎么每次显示一个,并去除误码?
B44411###661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111445558888800***00777880000000088777880000088877000##00000777880000000088777880000088877000#####0077788000##0008888888000##88877***33000003333333333333333333333333333663333333333333333333333333333333333333333AAA335550077788000##8888888888#####888882221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111005444##99966666666666666666666666666666666666666666666666666446666666666666663336666666666666666666611666006661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111336666699999999999999999999999999999999999999999999999999999999999999999999999999999999999999944DDD66666111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111115500088DDD###############################################################################################AAA660006611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
作者: lionlike    时间: 2010-9-24 08:48
如何滤波,没有人给出意见吗?




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4