📄 dtmf.m
字号:
function H = dtmf()
% 函数完成6位号码的双音多频信号的检测
% 1 2 3 A 697Hz
% 4 5 6 B 770Hz
% 7 8 9 C 852Hz
% * 0 # D 941Hz
% 1209Hz 1336Hz 1477Hz 1633Hz
%频率分辨力要求 F0<=10Hz
%音频信号 fs = 8000Hz
%抽样时间间隔 T = 1/fs = 1/8000 = 0.125ms
%最小记录长度 T0 = 1/F0 >= 0.1s
%所允许处理的信号最高频率 fh < 0.5*fs = 1/T = 1/0.1*1000 =4000Hz
%在一个记录中的最少点数 N =T0/T >= 0.1/0.125*1000 =800
%N取2的整数幂 N = 1024
tm=[1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,68]; %按键号码表
N=205;
fs=8000;
K=[18,20,22,24,31,34,38,42];
f1=[697,770,852,941];
f2=[1209,1336,1477,1633];
TN=input('输入六位电话号码=');
TNr=0;
for m=1:6;
d=fix(TN/10^(6-m));
TN=TN-d*10^(6-m);
for p=1:4;
for q=1:4;
if tm(p,q)==abs(d);break,end
end
if tm(p,q)==abs(d);break,end
end
n=0:1023;
x=sin(2*pi*n*f1(p)/fs)+sin(2*pi*n*f2(q)/fs);
figure(1),subplot(3,2,m),plot(n,x);
sound(x,fs);
pause(0.1);
%接收检测端的程序
X=goertzel(x(1:N),K+1);
val=abs(X);
figure(2),subplot(3,2,m);stem(K,val,'.');grid;xlabel('k');ylabel('|X(k)|');
limit=80;
for s=5:8;
if val(s)>limit,break,end
end
for r=1:4;
if val(r)>limit,break,end
end
TNr=TNr+tm(r,s-4)*10^(6-m);
end
disp('接收检测到的号码为:')
disp(TNr)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -