📄 hc941a.m
字号:
%《数字信号处理教程——MATLAB释义与实现》第九章例9.4.1程序hc941
% DTMF双频拨号信号的生成和检测程序
% 电子工业出版社出版 陈怀琛编著 2004年9月
%
%
d=input('键入一位电话号码= ','s'); % 输入一个字符
symbol=abs(d); % 求它的ASCII码
tm=[49,50,51,65;52,53,54,66;55,56,57,67;42,48,35,68]; % 16个ASCII码
for p=1:4;
for q=1:4;
if tm(p,q)==abs(d); break,end % 检测码相符的列号q
end
if tm(p,q)==abs(d); break,end % 检测码相符的行号p
end
f1=[697,770,852,941]; % 行频率向量
f2=[1209,1336,1477,1633]; % 列频率向量
n=0:2040; % 为了发声,加长序列
x = sin(2*pi*n*f1(p)/8000) + sin(2*pi*n*f2(q)/8000);% 构成双频信号
sound(x); % 发出声音
disp('双频信号已经生成并发出'),pause
% 接收检测端的程序
k = [18 20 22 24 31 34 38 42]; % 要求的DFT样本序号
N=205;
X=goertzel(x(1:N),k+1); % 用Goertzel算法计算八点DFT样本
val = abs(X); % 列出八点DFT向量
stem(k,val,'.');grid;xlabel('k');ylabel('|X(k)|') % 画出DFT(k)幅度
set(gcf,'color','w') % 置图形背景色为白
shg,disp('图上显示的是检测到的八个近似基频的DFT幅度');pause %
limit = 80; %
for s=5:8;
if val(s) > limit, break, end % 查找列号
end
for r=1:4;
if val(r) > limit, break, end % 查找行号
end
disp(['接收端检测到的号码为',setstr(tm(r,s-4))]) % 显示接收到的字符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -