发布:单片机 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)属本人原创,请勿用作商用,否则保留追究权力。 mark mark.楼主当初的帖子,让我一下子明白了数字信号处理的厉害之处,终于醒悟.谢谢! hendry 大哥!
真谢谢你把源码贴出来,真是感激的万分,给了求学路上的小弟们一个明灯!
崇拜你的小弟:desun 谢谢提供,MICROCHIP好像有一篇文章也讲的这个,不过没搞懂,呵呵 不错,收了,谢谢! 强贴,我通常都用Goertzel算法来递归,就是没有用欧拉公式来直接做表 mark 深挖一下,在PIC的网站上发现一个类似的东西 点击此处下载 ourdev_425128.zip(文件大小:926K) (原文件名:MCHP_DTMFDetv1.2.zip) 支持呀 是把计算分散到每次后,而不是在一段采样后再计算吗?!
和【6楼】 zhuchaohua 一样,我也是常用Goertzel(8k,16位定点,m88,16m晶体)!
LZ强! 请教LZ性能(4k)还可以吗?!
很多都资料推荐8k除谐波!
如果性能还不错,就学习LZ的方法,耗的资源少! 在以前帖子上,我曾经和Goertzel算法进行过理论上的比较,结论是 我的采样率低(4k)、样本少(每50点)、乘法次数多(每样本2次)、省ram、费rom(查表), Goertzel 的采样率高(8k)、样本多(每100点)、乘法次数少(每样本1次)、费ram、省rom(表很小),实时性相同,每都是12.5ms解出一个 dtmf 码。综合来看,若是单片机资源紧张的话,我的算法可能合适些。
从试验情况看,解码准确率还是可以的,为此有一个网友制作了一个 windows 下的测试小软件,可惜我没有保存下来。 Goertzel算法描述:
http://www.miniwiki.org/wiki/index.php?wiki=_content.en_version.presenting..Goertzel_algorithm 【10楼】 tclandmei 小罗:
把计算分散到每次采样后,和采一段样后集中计算,结果是一样的,实际采用哪种都行。 好!谢谢!
学习一下! 好,支持一个 留名 顶你! 谢谢,学习了。。。 MARK!!! 前面提到的那个有心网友(对不起忘记名字了)开发的小工具找到了,下面就是,我代替重发一遍:
?????¨?ü????×???????????????±????????¤??ourdev_426404.rar(文件大小:733K) (原文件名:test tool.rar)
这个工具对比了 我的算法 和 Goertzel 算法的解码效果。 hendry大哥
你能说说你的400查表是怎么计算出来的嘛,知道这个方法后,我还可以应用到其他的频率的检测,谢谢!!
盼复!!!!!!!!!!!!!!!!!!!!!!! 对于AVR来说Goertzel算法还是合适的,AVR资源很宽松。 巨强,看看 非常厉害,打个mark 算法是好东西 mark 牙印 LZ能不能把电路图贴上给我们这些小菜学习学习...谢谢了哈! 论坛中有一个帖子寻求检测背景噪声中特定频率正弦波信号的方法,但是楼主特别指明不用 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,单位秒
其实也没什么啦,就是利用傅里叶积分公式计算了一下,学过信号处理的都知道的,只是为了避免让单片机开方运算,最后计算幅值时我采用了变通方法,改成计算绝对值。 hendry大哥
请教一下,2*PI*f*N*T=2*PI*697*1*0。00025=1.0948450211,然后COS表中怎么得到0X3A呢?谢谢! mark hendry:
我试了运行你的程序,采用MEGA48,测试后不能解码。但是AD转换出来的电压确实正常,实测AD值为0x0203,电源电压5.003V,输入采样电压为2.519V。还有你发布的IAR源码是2K的T1中断,我改到了T0上的CTC模式,用示波器测试确实是4000HZ。我是把AD输入直接接到电话线上,然后按电话号码,串口没有数据出来,可是并接的电话测试仪上确实能显示我按的号码?希望能指点一下,谢谢!!! 有意思 很好! ./bbs_upload/files_15/ourdev_446610.gif</a> 回复30楼:
cos(1.0948450211) * 127 = 0.45818 * 127 = 0x3A
回复32楼:
我试过我的电路是可以解码的,请首先按照我的电路试验一下,包括软硬件都不要改动。 hendry 兄弟
回复32楼:
我试过我的电路是可以解码的,请首先按照我的电路试验一下,包括软硬件都不要改动。
你的电路在哪里啊,找了好久没找到啊:) 说真的,这类东西用带通滤波器做会容易得多,正常会解DTMF的板子也不缺那几个电阻电容的位置…… 真相亲你一下 hendry 兄弟
请问我得到的AD转换的数据是16bit数据呀(0-1023),看你的代码上是写要求输入的是signed char型数据,我该如何处理一下,看32楼,输入的也是16bit数据呀,是不是因为这个所以解不出来呀?还有cos(1.0948450211) * 127中,*127是什么意思? 支持一下 楼上前辈,给点实质性支援吧~ 不错,参考资料 mark 记号 很好! 楼主解码后生成的text里应该每50次采样(4k)送一个数字,也就是没有经过处理数据。
那么具体该怎么处理?
哪些数值是有效的,哪些是静音时段? 我所知道的DTMF是45~55ms音频+静音间隔=100ms,楼主提供的wav似乎只有连续不断的音频而没有静音时间? // 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字符而没有检验是否有效采样。
那么,应该怎样去校验? 多些楼主五四提供 mark avr hao ren zhen duo 不错,好东西顶一下 算法是好东西,思路太好了。 mark MARK DTMF软解码算法 学习了 好东西 那个工具怎么一运行就出错啊
test tool.rar 不错,mark
请问怎样精确偏容忍度?提高采样率么? mark 我详细看了程序,其实就是傅立叶积分.
http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_554204.GIF
(原文件名:DTMF 解码.GIF) mark 有人曾说过,数学可以解决一切问题。深以为然。 这个很有用哦!
可以用解出来的数字做密码和指令,做远程控制! 关于DTMF码判定阀值,大家有什么好方法? mark! 尿个记号,呵呵 mark 记号 mark 多谢分享,mark mark mark 记下啦 是不是搞电话的? mark
想研究时再下载 记号 能搞出双音的高低频率和电平就爽了^_^ 楼主的数学功力深厚啊,佩服佩服!DTMF能软解,那同样电话线上用的FSK是不是也能软解啊?如何实现呢? 楼主上个原理图吧???????? http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_575961.JPG
DTMF 软解码接线图 (原文件名:ad.JPG) 楼主能解释一下,为什么要限幅,和预先做数字处理吗?一下代码是什么意思?!
//
// 限幅
//
if (adc_value < 0x180)
{
adc_value = 0;
}
else if (adc_value > 0x27f)
{
adc_value = 0xff;
}
else
{
adc_value = adc_value - 0x180;
}
谢谢了! 限幅的原因是,解码器输入是 8 bit 数据,A/D 输出是 10 bit 数据,解码器容纳不下,因此要限幅,就是将 10 bit 数据限制到 8 bit 数据。 mark 再请教楼主!如果采集频率提高到8KHz,就要重新计算那两个表,遇到三角函数是负值如何处理?是按照绝对值计算吗?还是取补码?有没有计算好的8KHz频率的表数据!谢谢了! 楼主,你的算法在这种条件下能准确解码吗?电话播放菜单,也就是电话线上有语音信号,这时有DTMF信号,是否也能准确无误的解析出来呢?如果能,采用了什么措施,如果不能,为什么?多谢大侠 感谢楼主!!我已经做出了8KHz频率的采样表,验证时和你的4000样本表比较时有个别值差“1”,应该是编译器的差别吧!再次感谢!! 记号一下,期待更加完善的电路图 关于按照 8K 采样率重新计算表格,29楼有说。
三角函数sin, cos 取值范围是 -1.0 ~ 1.0,表格是8位有符号字符型数据,最大可以容纳下 -128 ~ 127 的数,因此,要将 -1.0 ~ 1.0 范围变换到 -128 ~ 127 范围。 当输入的DTMF信号存在干扰时,例如92楼所说,只要干扰频率不在 DTMF 8个特征频率点上,对解码没有影响,哪怕干扰幅度很大,甚至干扰信号强度超过了DTMF强度也没关系。
但是一旦干扰频率和 DTMF 8个特征频率重叠了,哪怕是很小幅度的干扰,解码也会影响,甚至解码失败。 hao 但是我解码出来始终不对,总是不正确的那些结果,挺烦人!我是摘机后进行按键操作,实时采集数据解码显示,解出的键码就是不对!但也是随着按键的不同而产生变化,现象如下:9BBB1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB8CCBB8CCBB2CCBBA8CCBB5CCBBBCCBBBCCCB6B63B6ABCBBB697B6CCBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA9CCBB4B81B8AB2BBCBBCBC1B8CB5BB5BB9BCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBCB9BBB6B6CB5ABBB6B46BCBBBB9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBCBBCBBBC83B8AC9BB3BCB637BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9C6BC15BBBC5BBBB96B69B56BBBBABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB3CCBB68CC6B8C9BB3CCBB68CCBB8C9BB3CCB664 受楼主感动,做了一个提取DTMF采样数据的小工具,供大家使用,再次感谢楼主! 怎么上传文件?上传后看不见? 在这呢!DTMF样本数据采集工具。点击此处下载 ourdev_580645CBAME4.rar(文件大小:3K) (原文件名:DTMF bps.rar) mark 以下现象,如何滤波?实际按键为:3、6、9、#,怎么每次显示一个,并去除误码?
B44411###661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111445558888800***00777880000000088777880000088877000##00000777880000000088777880000088877000#####0077788000##0008888888000##88877***33000003333333333333333333333333333663333333333333333333333333333333333333333AAA335550077788000##8888888888#####888882221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111005444##99966666666666666666666666666666666666666666666666666446666666666666663336666666666666666666611666006661111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111336666699999999999999999999999999999999999999999999999999999999999999999999999999999999999999944DDD66666111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111115500088DDD###############################################################################################AAA660006611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 如何滤波,没有人给出意见吗?
页:
[1]
2