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