DTMF软编解码

最近做了一个DTMF软编解码的项目,现把学习过程作下总结:
     DTMF CCITT Q.23标准,根据CCITT Q。23 建议, DTMF信号的技术指标是:传送/接收率为每秒10个号码,或每个号码100ms, 每个号码传送过程中,信号存在时间至少45m, 且不多于55ms, 100ms 其余时间是静音。
    本项目,由于没找到参考代码,只能根据相关的文档和一些前人写的简单的代码为基础去自己实现。好在项目要求中,服务器向终端发送DTMF信号时,没有别的语音,这就为项目开发降低了难度,同时准确性也提升了,没有误识别过程。
     DTMF原理:
     DTMF是用两个特定的单音频组合信号来代表数字信号以实现其功能的一种编码技术。两个单音频的频率不同,代表的数字或实现的功能也不同。这种电话机中通常有16个按键,其中有10个数字键096个功能键*#ABCD。由于按照组合原理,一般应有8种不同的单音频信号。因此可采用的频率也有8种,故称之为多频,又因它采用从8种频率中任意抽出2种进行组合来进行编码,所以又称之为“8中取2”的编码技术。 
    根据CCITT的建议,国际上采用的多种频率为687Hz770Hz852Hz941Hz1209Hz1336Hz1477Hz1633Hz8种。用这8种频率可形成16种不同的组合,从而代表16种不同的数字或功能键,具体组合见下表1:
     

        行频/Hz
    
列频/Hz

1209

1336

1477

1633

697

1

2

3

A

770

4

5

6

B

852

7

8

9

C

941

*

0

#

D

 

 

 

 

 



  






   DTMF信号产生MATLAB:
    就是一正弦波形,是上述二种频率的组合。
   out[i] = A*sin(2*pi*f1*i/fs) + B*sin(2*pi*f2*i/fs);

   DTMF信号检测MATLAB,核心算法是GOERTZEL算法,GOERTZEL算法详细内容大家可以上网搜,好多相关介绍:
     k=f/fn;

vk(1)=0;

vk(2)=0;

for i1=1:8

    w=2*cos(2*pi*k(i1)/N);

    for i2=3:202

        vk(i2)=w.*vk(i2-1)-vk(i2-2)+x(i2);

    end;

    Xk(i1)=vk(202).^2+vk(201).^2-w*vk(202)*vk(201);

end;
        DTMF软编解码原理就是这么简单。

我开发过程:
        1. 认真研究项目需求
        2. 确认DTMF信号的表现形式
          典型的DTMF信号频率范围是7001700Hz,根据Nyquist条件,采样频率fs=|f(max)*2+Δf|, f(max)=1700,所以fs>3400。为了减少码元间干扰,因此我们选取8000Hz作为采样频率。取t=50ms作为双音多频信号标准持续时间,因此每个信号含400个点的信息和400点的间隔。 
       3. 先用MATLAB对算法进行仿真,然后再用C来实现
       4. 由于DTMF要在移动终端上跑,还实现了定点化过程。
       5. 按要求整一下API.


       测试一下,能达到要求,就ok了。


      (欢迎交流DTMF知识)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值