利用DTMF拨号音识别周鸿伟的手机号码
前几天在报纸上看到南京有个大学生通过分析采访视频里面的拨号音知道了周鸿伟的手机,当时想了感觉原理并不复杂,拨号音是双音多频的,首先去除噪声,然后分析DTMF(双音多频)拨号音就应该可以了。
媒体总是喜欢夸大,呵呵,其实我以前也在电视媒体做过。
附一个MATLAB相关识别技术的介绍,改天有空弄个android识别拨号音应用
1.实验目的
3.实验内容
(1).图形电话拨号面板的制作
以按键 0 为例,简单介绍拨号音产生的过程: % 按键 0 的响应函数
function varargout = pushbutton0_Callback(h, eventdata, handles, varargin)
n=[1:1000]; % 每个数字 1000 个采样点表示
d0=sin(0.7217*n)+sin(1.0247*n); % 对应行频列频叠加
n0=strcat(get(handles.edit1,'string'),'0'); % 获取数字号码
set(handles.edit1,'string',n0); % 显示号码
space=zeros(1,100); %100 个 0 模拟静音信号
global NUM
phone=[NUM,d0];
NUM=[phone,space]; % 存储连续的拨号音信号
wavplay(d0,8192); % 产生拨号音
程序解释:
d0=sin(0.7217*n)+sin(1.0247*n) 中的行频与列频是由表 1 中 0 键对应的 ,计算得出,已知声音取样频率 ,则取样后,。
% 删除键的响应函数
function varargout = pushbuttonback_Callback(h, eventdata, handles, varargin)
n=[1:1000];
num=get(handles.edit1,'string');
l=length(num);
n11=strrep(num,num,num(1:l-1)); %去掉末尾号码在面板上的显示
d11=sin(0.7217*n)+sin(0.9273*n);
set(handles.edit1,'string',n11);
global NUM
L=length(NUM);
NUM=NUM(1:L-1100); %删除末尾号码在拨号音信号中的存储
wavplay(d11,8192);
(3).DTMF 信号的检测识别
global NUM
wavplay(NUM,8192);
L=length(NUM);
n=L/1100;
number='';
for i=1:n
j=(i-1)*1100+1;
d=NUM(j:j+999); % 截取出每个数字
f=fft(d,2048); % 以 N=2048 作 FFT 变换
a=abs(f);
p=a.*a/10000; % 计算功率谱
num(1)=find(p(1:250)==max(p(1:250))); % 找行频
num(2)=300+find(p(300:380)==max(p(300:380))); % 找列频
if (num(1) < 180) row=1; % 确定行数
elseif (num(1) < 200) row=2;
elseif (num(1) < 220) row=3;
else row=4;
end
if (num(2) < 320) column=1; % 确定列数
elseif (num(2) < 340) column=2;
else column=3;
end
z=[row,column]; % 确定数字
if z==[4,2] tel=0;
elseif z==[1,1] tel=1;
elseif z==[1,2] tel=2;
elseif z==[1,3] tel=3;
elseif z==[2,1] tel=4;
elseif z==[2,2] tel=5;
elseif z==[2,3] tel=6;
elseif z==[3,1] tel=7;
elseif z==[3,2] tel=8;
elseif z==[3,3] tel=9;
end
t(i)=tel;
c=strcat(number,int2str(tel));
number=c;
i=i+1;
end
set(handles.edit3,'string',number);
程序解释:
确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率 ,而做FFT的N=2048,则频谱分辨率为 ,由此可算出频谱图上任意点对应的频率 。例如,数字8的高、低端频率为,则在谱图上对应的点。