DTMF软编解码

最近做了一个DTMF软编解码的项目,现把学习过程作下总结:
     DTMF CCITT Q.23标准,根据CCITT Q。23 建议, DTMF信号的技术指标是:传送/接收率为每秒10个号码,或每个号码100ms, 每个号码传送过程中,信号存在时间至少45m, 且不多于55ms, 100ms 其余时间是静音。
    本项目,由于没找到参考代码,只能根据相关的文档和一些前人写的简单的代码为基础去自己实现。好在项目要求中,服务器向终端发送DTMF信号时,没有别的语音,这就为项目开发降低了难度,同时准确性也提升了,没有误识别过程。
     DTMF原理:
     DTMF 是用两个特定的单音频组合信号来代表数字信号以实现其功能的一种编码技术。两个单音频的频率不同,代表的数字或实现的功能也不同。这种电话机中通常有 16 个按键,其中有 10 个数字键 0 9 6 个功能键 * # A B C D 。由于按照组合原理,一般应有 8 种不同的单音频信号。因此可采用的频率也有 8 种,故称之为多频,又因它采用从 8 种频率中任意抽出 2 种进行组合来进行编码,所以又称之为 “8 中取 2” 的编码技术。  
     根据 CCITT 的建议,国际上采用的多种频率为 687Hz 770Hz 852Hz 941Hz 1209Hz 1336Hz 1477Hz 1633Hz 8 种。用这 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 信号频率范围是 700 1700Hz ,根据 Nyquist 条件,采样频率 fs=|f (max) *2+ Δ f|, f (max) =1700 ,所以 fs>3400 。为了减少码元间干扰,因此我们选取 8000Hz 作为采样频率。取 t=50ms 作为双音多频信号标准持续时间,因此每个信号含400 个点的信息和4 00 点的间隔。  
       3. 先用MATLAB对算法进行仿真,然后再用C来实现
       4. 由于DTMF要在移动终端上跑,还实现了定点化过程。
       5. 按要求整一下API.


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


      (欢迎交流DTMF知识)

你可能感兴趣的:(DTMF软编解码)