DTMF(Dual tone MultiFrequency)
一、文献简介
[1]介绍了DTMF由Bell实验室发明,实现电话系统自动长途呼叫,用以代替机械拨号转盘按键。
[2]补充介绍了DTMF matlab实现方式
[3]中给出了信号模拟生成的方式代码
[4]中介绍了音频格式以及基本声学概念:(采样值)、(采样(频)率)、(取样率或比特率或位速)、(位深)、(声道,如mono或stereo)
[5]中视频演示了AU对声音信号FFT处理
[6]种介绍了一中电话拨号系统的GUI样式
二、程序样例
1.下面的程序对应于当按键为1时(对应于fr(1)和fc(1))的情况
fr=[697 770 852 941];%fre_row
fc=[1209 1336 1447];%fre_column
Fs=32768;%sample frequency,但是一般选取8k
t=0:1/Fs:0.25;
y1=sin(2*pi*fr(1)*t);
y2=sin(2*pi*fc(1)*t);
y=(y1+y2)/2;
plot(t,y);
sound(y,Fs);
2.下面的程序对应于按下按键“123456789”的情况【本代码可直接复制到MATLAB命令行测试,可听到清脆的“拨号声”】
%DTMF code
clc;
clear;
fl=[697 770 852 941];%fre_row/low fre
fh=[1209 1336 1447];%fre_column/high fre
Fs=8000;%sample frequency,一般选取8k
lasttime=0.25;%单音持续时间
numstring='123456789';
ratio=3;%调整两次拨号之间的间隔
compound=[];%最终的模拟出的信号,是一个行向量
t=1/Fs:1/Fs:lasttime;%单音的时间长度,这里单音长度为0.25s
for i=1:length(numstring)
switch numstring(i)
case'1'
freq_low=fl(1);freq_hgh=fh(1);
case'2'
freq_low=fl(1);freq_hgh=fh(2);
case'3'
freq_low=fl(1);freq_hgh=fh(3);
case'4'
freq_low=fl(2);freq_hgh=fh(1);
case'5'
freq_low=fl(2);freq_hgh=fh(2);
case'6'
freq_low=fl(2);freq_hgh=fh(3);
case'7'
freq_low=fl(3);freq_hgh=fh(1);
case'8'
freq_low=fl(3);freq_hgh=fh(2);
case'9'
freq_low=fl(3);freq_hgh=fh(3);
case'0'
freq_low=fl(4);freq_hgh=fh(2);
case'*'
freq_low=fl(4);freq_hgh=fh(1);
case'#'
freq_low=fl(4);freq_hgh=fh(3);
otherwise
error('error occurred!');
end
y1=sin(2*pi*freq_low*t);
y2=sin(2*pi*freq_hgh*t);
y=(y1+y2)/2;
single=[y,zeros(1,Fs*lasttime*ratio)];%相邻两个单音之间补零,模拟按键后的停顿
compound=[compound,single];
end
sound(compound,Fs);%按键的声音播放
%画图
n=length(compound);
t1=1:n;%图形横轴单位划归为秒
subplot(1,2,1);
plot(t1/Fs,compound);
title('电话按键时域图形');
axis([0 length(numstring) -2 2]);
xlabel('时间/s');
ylabel('幅值')
% audiowrite('test.wav',compound,Fs);%可选保存声音文件
subplot(1,2,2);
p=abs(fft(compound));%快速傅里叶变换
plot(t1*Fs/n,p);
title('电话按键频域图形');
xlabel('频率/Hz');
ylabel('幅值/dB')
3.双音信号的频谱分析代码(这里选取了直流\50Hz\75Hz成分的混合)
%双音信号的频谱 fft
Fs=256;%采样频率
N=256;%采样点数
Ts=1/Fs;%采样周期
n=0:1:N-1;
t=n*Ts;%采样步长
y=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);
Y1=y;
subplot(2,1,1);
plot(t,Y1);
f=n*Fs/(N) ;%真实的频率
Y2=fft(y)/N*2;%真实的幅值
subplot(2,1,2);
plot(f,abs(Y2));
xlabel('频率/Hz');
ylabel('振幅');title('fft');grid on;
Fig.test.wav声音波形在AU中的展现
这里选取的是时间在【2.070s,2.100s】之间的波形,横轴代表时间,单位是s,纵轴代表20lg(采样值),单位是dB。特别注意纵轴,又上到下分别0dBz到负无穷再到0dB,坐标轴这样刻画的目的在于满足当采样值为负数下的表达式成立。
波形时间长度:9s,采样(频)率:8KHz,声道:mono,位深:16bit.
根据上述信息计算文件大小:
位速:8K*16bit=128Kbps=16KBps,文件大小:16KBps*9s=144KB.
综上,matlab中生成的声音数据大小为144KB.
link:
[1] DTMF百度百科
[2]《matlab 数值计算》-Cleve.B.Moler-第8章 傅里叶分析-8.1 按键式拨号盘
[3] 代码参考
[4] wav文件格式讲解
[5] B站:用AU通过按键声判断号码