hendry 发表于 2009-3-5 21:57:21

发布:单片机 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:07

mark

mdwctguan 发表于 2009-3-5 22:09:03

mark.楼主当初的帖子,让我一下子明白了数字信号处理的厉害之处,终于醒悟.谢谢!

dygpyy 发表于 2009-3-12 09:03:12

hendry 大哥!
   
      真谢谢你把源码贴出来,真是感激的万分,给了求学路上的小弟们一个明灯!


         崇拜你的小弟:desun

OurWay 发表于 2009-3-12 09:15:44

谢谢提供,MICROCHIP好像有一篇文章也讲的这个,不过没搞懂,呵呵

zc3909 发表于 2009-3-12 09:16:59

不错,收了,谢谢!

zhuchaohua 发表于 2009-3-12 09:56:49

强贴,我通常都用Goertzel算法来递归,就是没有用欧拉公式来直接做表

yin66 发表于 2009-3-12 09:58:46

mark

zhuchaohua 发表于 2009-3-12 10:20:10

深挖一下,在PIC的网站上发现一个类似的东西 点击此处下载 ourdev_425128.zip(文件大小:926K) (原文件名:MCHP_DTMFDetv1.2.zip)

cgbabc 发表于 2009-3-12 10:41:15

支持呀

tclandmei 发表于 2009-3-12 11:00:24

是把计算分散到每次后,而不是在一段采样后再计算吗?!

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

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

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

hendry 发表于 2009-3-14 14:31:58

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

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

hendry 发表于 2009-3-14 14:41:32

Goertzel算法描述:
http://www.miniwiki.org/wiki/index.php?wiki=_content.en_version.presenting..Goertzel_algorithm

hendry 发表于 2009-3-14 14:47:35

【10楼】 tclandmei 小罗:

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

tclandmei 发表于 2009-3-14 15:04:07

好!谢谢!

学习一下!

cgbabc 发表于 2009-3-14 18:32:17

好,支持一个

xullin 发表于 2009-3-14 19:15:19

留名

iam35200 发表于 2009-3-14 20:08:18

顶你!

antonine 发表于 2009-3-14 20:36:04

谢谢,学习了。。。

yhyf_heart 发表于 2009-3-14 20:44:10

MARK!!!

hendry 发表于 2009-3-18 23:28:59

前面提到的那个有心网友(对不起忘记名字了)开发的小工具找到了,下面就是,我代替重发一遍:

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

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

dygpyy 发表于 2009-3-22 12:14:56

hendry大哥
       你能说说你的400查表是怎么计算出来的嘛,知道这个方法后,我还可以应用到其他的频率的检测,谢谢!!

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

walker 发表于 2009-3-22 15:03:18

对于AVR来说Goertzel算法还是合适的,AVR资源很宽松。

ouravr1000 发表于 2009-3-26 23:36:45

巨强,看看

QZDZ 发表于 2009-3-27 09:49:52

非常厉害,打个mark

YourARM 发表于 2009-3-27 10:08:50

算法是好东西

pinocchio 发表于 2009-3-27 10:24:02

mark

miraclelife 发表于 2009-3-27 15:49:04

牙印

homexxhh 发表于 2009-3-27 17:39:43

LZ能不能把电路图贴上给我们这些小菜学习学习...谢谢了哈!

hendry 发表于 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,单位秒

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

Stupid 发表于 2009-5-7 00:09:17

hendry大哥
请教一下,2*PI*f*N*T=2*PI*697*1*0。00025=1.0948450211,然后COS表中怎么得到0X3A呢?谢谢!

banyan_city 发表于 2009-5-7 00:23:27

mark

xoxo 发表于 2009-5-24 10:46:43

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

chairang 发表于 2009-5-24 11:24:04

有意思

xiaowei0588 发表于 2009-5-25 08:07:39

很好!

helloshi 发表于 2009-5-25 15:37:18

./bbs_upload/files_15/ourdev_446610.gif</a>

hendry 发表于 2009-5-25 17:34:14

回复30楼:
   cos(1.0948450211) * 127 = 0.45818 * 127 = 0x3A

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

tigerding 发表于 2009-5-25 19:59:15

hendry 兄弟

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


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

watercat 发表于 2009-5-25 20:10:15

说真的,这类东西用带通滤波器做会容易得多,正常会解DTMF的板子也不缺那几个电阻电容的位置……

jhdtry 发表于 2009-6-1 11:23:27

真相亲你一下

sunlei419 发表于 2009-7-8 14:58:50

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

FREEXP 发表于 2009-8-28 08:53:02

支持一下

Sader 发表于 2009-8-28 09:04:57

楼上前辈,给点实质性支援吧~

lee345 发表于 2009-8-28 09:38:46

不错,参考资料

cowboy 发表于 2009-8-28 09:49:02

mark

wear778899 发表于 2009-8-28 10:25:41

记号

xiaowei0588 发表于 2009-8-28 11:30:03

很好!

Sader 发表于 2009-8-28 11:44:34

楼主解码后生成的text里应该每50次采样(4k)送一个数字,也就是没有经过处理数据。
那么具体该怎么处理?
哪些数值是有效的,哪些是静音时段?

Sader 发表于 2009-8-28 14:09:54

我所知道的DTMF是45~55ms音频+静音间隔=100ms,楼主提供的wav似乎只有连续不断的音频而没有静音时间?

Sader 发表于 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 = 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 = i;
                        }
                }

无论采样结果如何每隔50次采样就会返回一个DTMF字符而没有检验是否有效采样。
那么,应该怎样去校验?

joneywei 发表于 2009-9-9 16:27:39

多些楼主五四提供

loongsuns 发表于 2009-9-9 16:29:30

mark

maxiao5231 发表于 2009-12-8 20:55:58

avr hao ren zhen duo

001friend 发表于 2009-12-8 21:50:26

不错,好东西顶一下

kebaojun305 发表于 2009-12-8 21:55:32

算法是好东西,思路太好了。

oufuqiang 发表于 2009-12-8 22:13:48

mark

eduhf_123 发表于 2009-12-8 22:14:48

MARK DTMF软解码算法

markloveyou 发表于 2009-12-8 23:16:44

学习了

potatoES 发表于 2009-12-8 23:31:13

好东西

ldh119 发表于 2010-5-8 16:16:02

那个工具怎么一运行就出错啊
test tool.rar

63502925 发表于 2010-5-14 14:21:58

不错,mark
请问怎样精确偏容忍度?提高采样率么?

charlie2008 发表于 2010-5-14 21:09:52

mark

lzf713 发表于 2010-5-14 23:25:18

我详细看了程序,其实就是傅立叶积分.
http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_554204.GIF
(原文件名:DTMF 解码.GIF)

myhonour 发表于 2010-6-2 19:09:15

mark

yangyi 发表于 2010-6-2 19:57:12

有人曾说过,数学可以解决一切问题。深以为然。

xslff 发表于 2010-6-2 21:29:29

这个很有用哦!
可以用解出来的数字做密码和指令,做远程控制!

hendry 发表于 2010-6-2 21:35:38

关于DTMF码判定阀值,大家有什么好方法?

Forever 发表于 2010-6-2 21:37:29

mark!

linnjing 发表于 2010-6-2 21:58:23

尿个记号,呵呵

renxupeng 发表于 2010-6-2 22:22:47

mark

lv998127 发表于 2010-6-2 23:41:55

记号

liurangzhou 发表于 2010-6-3 09:40:47

mark

xininye 发表于 2010-6-3 10:52:15

多谢分享,mark

joni 发表于 2010-6-3 13:07:44

mark

James_King 发表于 2010-6-8 07:38:11

mark

win2kddk 发表于 2010-6-8 09:01:46

记下啦

clever0725 发表于 2010-6-8 11:44:50

是不是搞电话的?

cu_ice 发表于 2010-6-8 13:05:43

mark
想研究时再下载

markloveyou 发表于 2010-6-8 13:12:41

记号

yanwuxu 发表于 2010-7-9 15:21:55

能搞出双音的高低频率和电平就爽了^_^

dragonwww 发表于 2010-7-9 15:52:56

楼主的数学功力深厚啊,佩服佩服!DTMF能软解,那同样电话线上用的FSK是不是也能软解啊?如何实现呢?

hbzxx 发表于 2010-7-23 08:56:49

楼主上个原理图吧????????

hendry 发表于 2010-8-18 21:11:37

http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_575961.JPG
DTMF 软解码接线图 (原文件名:ad.JPG)

lionlike 发表于 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;
}
谢谢了!

hendry 发表于 2010-8-30 19:33:49

限幅的原因是,解码器输入是 8 bit 数据,A/D 输出是 10 bit 数据,解码器容纳不下,因此要限幅,就是将 10 bit 数据限制到 8 bit 数据。

cuikai12345 发表于 2010-8-30 22:24:32

mark

lionlike 发表于 2010-9-1 22:36:46

再请教楼主!如果采集频率提高到8KHz,就要重新计算那两个表,遇到三角函数是负值如何处理?是按照绝对值计算吗?还是取补码?有没有计算好的8KHz频率的表数据!谢谢了!

xjjiang 发表于 2010-9-2 10:53:39

楼主,你的算法在这种条件下能准确解码吗?电话播放菜单,也就是电话线上有语音信号,这时有DTMF信号,是否也能准确无误的解析出来呢?如果能,采用了什么措施,如果不能,为什么?多谢大侠

lionlike 发表于 2010-9-2 21:26:50

感谢楼主!!我已经做出了8KHz频率的采样表,验证时和你的4000样本表比较时有个别值差“1”,应该是编译器的差别吧!再次感谢!!

lcqqcl 发表于 2010-9-3 14:06:44

记号一下,期待更加完善的电路图

hendry 发表于 2010-9-5 08:42:39

关于按照 8K 采样率重新计算表格,29楼有说。

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

hendry 发表于 2010-9-5 08:46:23

当输入的DTMF信号存在干扰时,例如92楼所说,只要干扰频率不在 DTMF 8个特征频率点上,对解码没有影响,哪怕干扰幅度很大,甚至干扰信号强度超过了DTMF强度也没关系。

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

miminzhang 发表于 2010-9-5 09:07:48

hao

lionlike 发表于 2010-9-5 22:35:42

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

lionlike 发表于 2010-9-5 22:39:12

受楼主感动,做了一个提取DTMF采样数据的小工具,供大家使用,再次感谢楼主!

lionlike 发表于 2010-9-5 22:41:35

怎么上传文件?上传后看不见?

lionlike 发表于 2010-9-5 22:47:00

在这呢!DTMF样本数据采集工具。点击此处下载 ourdev_580645CBAME4.rar(文件大小:3K) (原文件名:DTMF bps.rar)

orange2348 发表于 2010-9-16 08:27:59

mark

lionlike 发表于 2010-9-16 09:33:17

以下现象,如何滤波?实际按键为:3、6、9、#,怎么每次显示一个,并去除误码?
B44411###661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111445558888800***00777880000000088777880000088877000##00000777880000000088777880000088877000#####0077788000##0008888888000##88877***33000003333333333333333333333333333663333333333333333333333333333333333333333AAA335550077788000##8888888888#####888882221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111005444##99966666666666666666666666666666666666666666666666666446666666666666663336666666666666666666611666006661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111336666699999999999999999999999999999999999999999999999999999999999999999999999999999999999999944DDD66666111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111115500088DDD###############################################################################################AAA660006611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

lionlike 发表于 2010-9-24 08:48:52

如何滤波,没有人给出意见吗?
页: [1] 2
查看完整版本: 发布:单片机 DTMF 软解码算法的实现