搜索
bottom↓
回复: 159

发布:单片机 DTMF 软解码算法的实现

  [复制链接]

出0入0汤圆

发表于 2009-3-5 21:57:21 | 显示全部楼层 |阅读模式
我在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)属本人原创,请勿用作商用,否则保留追究权力。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2009-3-5 22:07:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-5 22:09:03 | 显示全部楼层
mark.楼主当初的帖子,让我一下子明白了数字信号处理的厉害之处,终于醒悟.谢谢!

出0入0汤圆

发表于 2009-3-12 09:03:12 | 显示全部楼层
hendry 大哥!
   
        真谢谢你把源码贴出来,真是感激的万分,给了求学路上的小弟们一个明灯!


         崇拜你的小弟:desun

出0入0汤圆

发表于 2009-3-12 09:15:44 | 显示全部楼层
谢谢提供,MICROCHIP好像有一篇文章也讲的这个,不过没搞懂,呵呵

出0入0汤圆

发表于 2009-3-12 09:16:59 | 显示全部楼层
不错,收了,谢谢!

出0入0汤圆

发表于 2009-3-12 09:56:49 | 显示全部楼层
强贴,我通常都用Goertzel算法来递归,就是没有用欧拉公式来直接做表

出0入0汤圆

发表于 2009-3-12 09:58:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-12 10:20:10 | 显示全部楼层
深挖一下,在PIC的网站上发现一个类似的东西 点击此处下载 ourdev_425128.zip(文件大小:926K) (原文件名:MCHP_DTMFDetv1.2.zip)

出0入0汤圆

发表于 2009-3-12 10:41:15 | 显示全部楼层
支持呀

出0入0汤圆

发表于 2009-3-12 11:00:24 | 显示全部楼层
是把计算分散到每次后,而不是在一段采样后再计算吗?!

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

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

如果性能还不错,就学习LZ的方法,耗的资源少!

出0入0汤圆

 楼主| 发表于 2009-3-14 14:31:58 | 显示全部楼层
在以前帖子上,我曾经和Goertzel算法进行过理论上的比较,结论是 我的采样率低(4k)、样本少(每50点)、乘法次数多(每样本2次)、省ram、费rom(查表), Goertzel 的采样率高(8k)、样本多(每100点)、乘法次数少(每样本1次)、费ram、省rom(表很小),实时性相同,每都是12.5ms解出一个 dtmf 码。综合来看,若是单片机资源紧张的话,我的算法可能合适些。

从试验情况看,解码准确率还是可以的,为此有一个网友制作了一个 windows 下的测试小软件,可惜我没有保存下来。

出0入0汤圆

 楼主| 发表于 2009-3-14 14:41:32 | 显示全部楼层
Goertzel算法描述:
http://www.miniwiki.org/wiki/index.php?wiki=_content.en_version.presenting..Goertzel_algorithm

出0入0汤圆

 楼主| 发表于 2009-3-14 14:47:35 | 显示全部楼层
【10楼】 tclandmei 小罗:

把计算分散到每次采样后,和采一段样后集中计算,结果是一样的,实际采用哪种都行。

出0入0汤圆

发表于 2009-3-14 15:04:07 | 显示全部楼层
好!谢谢!

学习一下!

出0入0汤圆

发表于 2009-3-14 18:32:17 | 显示全部楼层
好,支持一个

出0入0汤圆

发表于 2009-3-14 19:15:19 | 显示全部楼层
留名

出0入0汤圆

发表于 2009-3-14 20:08:18 | 显示全部楼层
顶你!

出0入0汤圆

发表于 2009-3-14 20:36:04 | 显示全部楼层
谢谢,学习了。。。

出0入0汤圆

发表于 2009-3-14 20:44:10 | 显示全部楼层
MARK!!!

出0入0汤圆

 楼主| 发表于 2009-3-18 23:28:59 | 显示全部楼层
前面提到的那个有心网友(对不起忘记名字了)开发的小工具找到了,下面就是,我代替重发一遍:

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

这个工具对比了 我的算法 和 Goertzel 算法的解码效果。

出0入0汤圆

发表于 2009-3-22 12:14:56 | 显示全部楼层
hendry大哥
       你能说说你的400查表是怎么计算出来的嘛,知道这个方法后,我还可以应用到其他的频率的检测,谢谢!!

                 盼复!!!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2009-3-22 15:03:18 | 显示全部楼层
对于AVR来说Goertzel算法还是合适的,AVR资源很宽松。

出0入0汤圆

发表于 2009-3-26 23:36:45 | 显示全部楼层
巨强,看看

出0入0汤圆

发表于 2009-3-27 09:49:52 | 显示全部楼层
非常厉害,打个mark

出0入0汤圆

发表于 2009-3-27 10:08:50 | 显示全部楼层
算法是好东西

出0入0汤圆

发表于 2009-3-27 10:24:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-27 15:49:04 | 显示全部楼层
牙印

出0入0汤圆

发表于 2009-3-27 17:39:43 | 显示全部楼层
LZ能不能把电路图贴上给我们这些小菜学习学习...谢谢了哈!

出0入0汤圆

 楼主| 发表于 2009-3-27 20:40:41 | 显示全部楼层
论坛中有一个帖子寻求检测背景噪声中特定频率正弦波信号的方法,但是楼主特别指明不用 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,单位秒

其实也没什么啦,就是利用傅里叶积分公式计算了一下,学过信号处理的都知道的,只是为了避免让单片机开方运算,最后计算幅值时我采用了变通方法,改成计算绝对值。

出0入0汤圆

发表于 2009-5-7 00:09:17 | 显示全部楼层
hendry大哥
请教一下,2*PI*f*N*T=2*PI*697*1*0。00025=1.0948450211,然后COS表中怎么得到0X3A呢?谢谢!

出0入0汤圆

发表于 2009-5-7 00:23:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-5-24 10:46:43 | 显示全部楼层
hendry:
    我试了运行你的程序,采用MEGA48,测试后不能解码。但是AD转换出来的电压确实正常,实测AD值为0x0203,电源电压5.003V,输入采样电压为2.519V。还有你发布的IAR源码是2K的T1中断,我改到了T0上的CTC模式,用示波器测试确实是4000HZ。我是把AD输入直接接到电话线上,然后按电话号码,串口没有数据出来,可是并接的电话测试仪上确实能显示我按的号码?希望能指点一下,谢谢!!!

出0入0汤圆

发表于 2009-5-24 11:24:04 | 显示全部楼层
有意思

出0入0汤圆

发表于 2009-5-25 08:07:39 | 显示全部楼层
很好!

出0入0汤圆

发表于 2009-5-25 15:37:18 | 显示全部楼层
</a>

出0入0汤圆

 楼主| 发表于 2009-5-25 17:34:14 | 显示全部楼层
回复30楼:
   cos(1.0948450211) * 127 = 0.45818 * 127 = 0x3A

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

出0入0汤圆

发表于 2009-5-25 19:59:15 | 显示全部楼层
hendry 兄弟

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


你的电路在哪里啊,找了好久没找到啊:)

出0入0汤圆

发表于 2009-5-25 20:10:15 | 显示全部楼层
说真的,这类东西用带通滤波器做会容易得多,正常会解DTMF的板子也不缺那几个电阻电容的位置……

出0入0汤圆

发表于 2009-6-1 11:23:27 | 显示全部楼层
真相亲你一下

出0入0汤圆

发表于 2009-7-8 14:58:50 | 显示全部楼层
hendry 兄弟
   请问我得到的AD转换的数据是16bit数据呀(0-1023),看你的代码上是写要求输入的是signed char型数据,我该如何处理一下,看32楼,输入的也是16bit数据呀,是不是因为这个所以解不出来呀?还有cos(1.0948450211) * 127中,*127是什么意思?

出0入0汤圆

发表于 2009-8-28 08:53:02 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2009-8-28 09:04:57 | 显示全部楼层
楼上前辈,给点实质性支援吧~

出0入0汤圆

发表于 2009-8-28 09:38:46 | 显示全部楼层
不错,参考资料

出0入0汤圆

发表于 2009-8-28 09:49:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-28 10:25:41 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-8-28 11:30:03 | 显示全部楼层
很好!

出0入0汤圆

发表于 2009-8-28 11:44:34 | 显示全部楼层
楼主解码后生成的text里应该每50次采样(4k)送一个数字,也就是没有经过处理数据。
那么具体该怎么处理?
哪些数值是有效的,哪些是静音时段?

出0入0汤圆

发表于 2009-8-28 14:09:54 | 显示全部楼层
我所知道的DTMF是45~55ms音频+静音间隔=100ms,楼主提供的wav似乎只有连续不断的音频而没有静音时间?

出0入0汤圆

发表于 2009-8-28 15:00:17 | 显示全部楼层
// 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字符而没有检验是否有效采样。
那么,应该怎样去校验?

出0入0汤圆

发表于 2009-9-9 16:27:39 | 显示全部楼层
多些楼主五四提供

出0入0汤圆

发表于 2009-9-9 16:29:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-8 20:55:58 | 显示全部楼层
avr hao ren zhen duo

出0入0汤圆

发表于 2009-12-8 21:50:26 | 显示全部楼层
不错,好东西顶一下

出0入8汤圆

发表于 2009-12-8 21:55:32 | 显示全部楼层
算法是好东西,思路太好了。

出0入0汤圆

发表于 2009-12-8 22:13:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-8 22:14:48 | 显示全部楼层
MARK DTMF软解码算法

出0入0汤圆

发表于 2009-12-8 23:16:44 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-12-8 23:31:13 | 显示全部楼层
好东西

出0入0汤圆

发表于 2010-5-8 16:16:02 | 显示全部楼层
那个工具怎么一运行就出错啊
test tool.rar

出0入0汤圆

发表于 2010-5-14 14:21:58 | 显示全部楼层
不错,mark
请问怎样精确偏容忍度?提高采样率么?

出0入0汤圆

发表于 2010-5-14 21:09:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 23:25:18 | 显示全部楼层
我详细看了程序,其实就是傅立叶积分.

(原文件名:DTMF 解码.GIF)

出0入0汤圆

发表于 2010-6-2 19:09:15 | 显示全部楼层
mark

出10入10汤圆

发表于 2010-6-2 19:57:12 | 显示全部楼层
有人曾说过,数学可以解决一切问题。深以为然。

出0入0汤圆

发表于 2010-6-2 21:29:29 | 显示全部楼层
这个很有用哦!
可以用解出来的数字做密码和指令,做远程控制!

出0入0汤圆

 楼主| 发表于 2010-6-2 21:35:38 | 显示全部楼层
关于DTMF码判定阀值,大家有什么好方法?

出0入0汤圆

发表于 2010-6-2 21:37:29 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-6-2 21:58:23 | 显示全部楼层
尿个记号,呵呵

出0入0汤圆

发表于 2010-6-2 22:22:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-2 23:41:55 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-6-3 09:40:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-3 10:52:15 | 显示全部楼层
多谢分享,mark

出0入0汤圆

发表于 2010-6-3 13:07:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-8 07:38:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-8 09:01:46 | 显示全部楼层
记下啦

出0入0汤圆

发表于 2010-6-8 11:44:50 | 显示全部楼层
是不是搞电话的?

出0入0汤圆

发表于 2010-6-8 13:05:43 | 显示全部楼层
mark
想研究时再下载

出0入0汤圆

发表于 2010-6-8 13:12:41 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-7-9 15:21:55 | 显示全部楼层
能搞出双音的高低频率和电平就爽了^_^

出0入0汤圆

发表于 2010-7-9 15:52:56 | 显示全部楼层
楼主的数学功力深厚啊,佩服佩服!DTMF能软解,那同样电话线上用的FSK是不是也能软解啊?如何实现呢?

出0入0汤圆

发表于 2010-7-23 08:56:49 | 显示全部楼层
楼主上个原理图吧????????

出0入0汤圆

 楼主| 发表于 2010-8-18 21:11:37 | 显示全部楼层

DTMF 软解码接线图 (原文件名:ad.JPG)

出0入0汤圆

发表于 2010-8-29 08:17:22 | 显示全部楼层
楼主能解释一下,为什么要限幅,和预先做数字处理吗?一下代码是什么意思?!
  //
  // 限幅
  //
  if (adc_value < 0x180)
  {
        adc_value = 0;
  }
  else if (adc_value > 0x27f)
  {
        adc_value = 0xff;
  }
  else
  {
        adc_value = adc_value - 0x180;
  }
谢谢了!

出0入0汤圆

 楼主| 发表于 2010-8-30 19:33:49 | 显示全部楼层
限幅的原因是,解码器输入是 8 bit 数据,A/D 输出是 10 bit 数据,解码器容纳不下,因此要限幅,就是将 10 bit 数据限制到 8 bit 数据。

出0入0汤圆

发表于 2010-8-30 22:24:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-1 22:36:46 | 显示全部楼层
再请教楼主!如果采集频率提高到8KHz,就要重新计算那两个表,遇到三角函数是负值如何处理?是按照绝对值计算吗?还是取补码?有没有计算好的8KHz频率的表数据!谢谢了!

出0入0汤圆

发表于 2010-9-2 10:53:39 | 显示全部楼层
楼主,你的算法在这种条件下能准确解码吗?电话播放菜单,也就是电话线上有语音信号,这时有DTMF信号,是否也能准确无误的解析出来呢?如果能,采用了什么措施,如果不能,为什么?多谢大侠

出0入0汤圆

发表于 2010-9-2 21:26:50 | 显示全部楼层
感谢楼主!!我已经做出了8KHz频率的采样表,验证时和你的4000样本表比较时有个别值差“1”,应该是编译器的差别吧!再次感谢!!

出0入0汤圆

发表于 2010-9-3 14:06:44 | 显示全部楼层
记号一下,期待更加完善的电路图

出0入0汤圆

 楼主| 发表于 2010-9-5 08:42:39 | 显示全部楼层
关于按照 8K 采样率重新计算表格,29楼有说。

三角函数sin, cos 取值范围是 -1.0 ~ 1.0,表格是8位有符号字符型数据,最大可以容纳下 -128 ~ 127 的数,因此,要将 -1.0 ~ 1.0 范围变换到 -128 ~ 127 范围。

出0入0汤圆

 楼主| 发表于 2010-9-5 08:46:23 | 显示全部楼层
当输入的DTMF信号存在干扰时,例如92楼所说,只要干扰频率不在 DTMF 8个特征频率点上,对解码没有影响,哪怕干扰幅度很大,甚至干扰信号强度超过了DTMF强度也没关系。

但是一旦干扰频率和 DTMF 8个特征频率重叠了,哪怕是很小幅度的干扰,解码也会影响,甚至解码失败。

出0入0汤圆

发表于 2010-9-5 09:07:48 | 显示全部楼层
hao

出0入0汤圆

发表于 2010-9-5 22:35:42 | 显示全部楼层
但是我解码出来始终不对,总是不正确的那些结果,挺烦人!我是摘机后进行按键操作,实时采集数据解码显示,解出的键码就是不对!但也是随着按键的不同而产生变化,现象如下:9BBB1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB8CCBB8CCBB2CCBBA8CCBB5CCBBBCCBBBCCCB6B63B6ABCBBB697B6CCBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA9CCBB4B81B8AB2BBCBBCBC1B8CB5BB5BB9BCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBCB9BBB6B6CB5ABBB6B46BCBBBB9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBCBBCBBBC83B8AC9BB3BCB637BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9C6BC15BBBC5BBBB96B69B56BBBBABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB3CCBB68CC6B8C9BB3CCBB68CCBB8C9BB3CCB664

出0入0汤圆

发表于 2010-9-5 22:39:12 | 显示全部楼层
受楼主感动,做了一个提取DTMF采样数据的小工具,供大家使用,再次感谢楼主!

出0入0汤圆

发表于 2010-9-5 22:41:35 | 显示全部楼层
怎么上传文件?上传后看不见?

出0入0汤圆

发表于 2010-9-5 22:47:00 | 显示全部楼层
在这呢!DTMF样本数据采集工具。点击此处下载 ourdev_580645CBAME4.rar(文件大小:3K) (原文件名:DTMF bps.rar)

出0入0汤圆

发表于 2010-9-16 08:27:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-16 09:33:17 | 显示全部楼层
以下现象,如何滤波?实际按键为:3、6、9、#,怎么每次显示一个,并去除误码?
B44411###661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111445558888800***00777880000000088777880000088877000##00000777880000000088777880000088877000#####0077788000##0008888888000##88877***33000003333333333333333333333333333663333333333333333333333333333333333333333AAA335550077788000##8888888888#####888882221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111005444##99966666666666666666666666666666666666666666666666666446666666666666663336666666666666666666611666006661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111336666699999999999999999999999999999999999999999999999999999999999999999999999999999999999999944DDD66666111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111115500088DDD###############################################################################################AAA660006611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

出0入0汤圆

发表于 2010-9-24 08:48:52 | 显示全部楼层
如何滤波,没有人给出意见吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 07:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表