刘品
学以致用---博主简介:专注语音、视频数字信号处理方面的研究以及算法在手机平台上面的移植和优化。涉及语音/音频编解码,语音增强,语音识别,语音音质客观评估,VOIP语音引擎 Qos算法模块和声音变速不变调和变调不变速等功能实现。熟悉ARM 各个系列的CPU,用ARMv4,ARMv5,ARMv6 and Cortex Neon 汇编优化相关算法代码,争取perforamance 最优。目前主要Windows mobile and Android platform上做相关speech/audio算法以及应用开发, HEVC 编解码器PC 和手机上的开发与应用。(交流Email:liupin.2008@gmail.com)
最近做了一个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知识)
posted on 2008-07-13 17:15  liupin  阅读(8464)  评论(4编辑  收藏  举报

-->