DTMF 信号是将拨号盘上的 0~F 共16 个数字,用音频范围的 8 个频率来表示的一种编码方式。8 个频率分为高频群和低频群两组,分别作为列频和行频。每个字符的信号由来自列频和行频的两个频率的正弦信号叠加而成。频率组合方式如下表格所示。
频率 | 1209Hz | 1336Hz | 1477Hz | 1633Hz |
---|---|---|---|---|
697Hz | 1 | 2 | 3 | A |
770Hz | 4 | 5 | 6 | B |
852Hz | 7 | 8 | 9 | C |
941Hz | */E | 0 | F | D |
据 ITU Q.23 建议,DTMF信号的技术指标是:传送/接收率为每秒10个号码,或每个号码100ms。每个号码传送过程中,信号存在时间至少45ms,且不多于55ms,100ms的其余时间是静音。在每个频率点上允许有不超过±1.5的频率误差。任何超过给定频率±3.5%的信号,均被认为是无效的,拒绝承认接收。另外,在最坏的检测条件下,信噪比不得低于15dB。
DTMF 信号的编码:对电话号码 DTMF 编码,生成为一个 .wav 文件。其中关键是不同频率的正弦波的产生,要求采用滤波法生成所要求的 DTMF信号。
%输入信号即冲激信号δ(n)
deltan=impseq(1,1,400);
%设置差分方程的各个系数
%响应前的系数
b697=[1,-1.7077,1];
b770=[1,-1.6453,1];
b852=[1,-1.5687,1];
b941=[1,-1.4782,1];
b1209=[1,-1.1641,1];
b1336=[1,-0.9964,1];
b1477=[1,-0.7986,1];
b1633=[1,-0.5685,1];
%输入前的系数
a697=[0,0.5204];
a770=[0,0.5686];
a852=[0,0.6203];
a941=[0,0.6736];
a1209=[0,0.8131];
a1336=[0,0.8671];
a1477=[0,0.9168];
a1633=[0,0.9652];
%解差分方程,通过滤波法获得单频信号
h697=filter(a697,b697,deltan);
h770=filter(a770,b770,deltan);
h852=filter(a852,b852,deltan);
h941=filter(a941,b941,deltan);
h1209=filter(a1209,b1209,deltan);
h1336=filter(a1336,b1336,deltan);
h1477=filter(a1477,b1477,deltan);
h1633=filter(a1633,b1633,deltan);
%获取号码0~9对应的双频信号
p1=h697+h1209;
p2=h697+h1336;
p3=h697+h1477;
p4=h770+h1209;
p5=h770+h1336;
p6=h770+h1477;
p7=h852+h1209;
p8=h852+h1336;
p9=h852+h1477;
p0=h941+h1336;
%手机号XXXXXXXXXXX
z=zeros(1,400);%剩余50ms设置为静音,并追加到已有信号之后
%自行填充手机号码
sound=[pX,z,pX,z,pX,z,pX,z,pX,z,pX,z,pX,z,pX,z,pX,z,pX,z,pX,z];
sound=sound/max(abs(sound));
%写出音频,audiowrite是Matlab中目前使用的音频写出函数,wav开头的函数会逐渐废弃
audiowrite('my_phone_number_sound.wav',sound,8000);
%读出音频文件,绘制图线
[phone_sound,fs]=audioread('my_phone_number_sound.wav');
plot(phone_sound);
数字信号处理
Matlab仿真实验三