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
|
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个点的信息和400点的间隔。
3. 先用MATLAB对算法进行仿真,然后再用C来实现
4. 由于DTMF要在移动终端上跑,还实现了定点化过程。
5. 按要求整一下API.
测试一下,能达到要求,就ok了。
(欢迎交流DTMF知识)