1、流程

图1 流程图

2、MATLAB实现

(1)主程序

clear all
clc
[x0,Fs]=audioread('1234567890.wav');
%sound(x0,Fs);
N=length(x0);                              %采样点
k=(0:N-1);
f=(k/N-1/2)*Fs;
X0=fft(x0);
figure
subplot(2,1,1),plot(x0)
title('原始按键音(时域)'),xlabel('t'),ylabel('振幅')
subplot(2,1,2),plot(f,abs(fftshift(X0)));xlim([0,4000])
title('原始按键音(频域)'),xlabel('f/Hz'),ylabel('幅度')
% -----------------------------------------带通滤波
Hd=band_pass;                              %带通滤波器
x1=filter(Hd,x0);                          %滤波
%sound(x1,Fs)
X1=fft(x1);
figure
subplot(2,1,1),plot(x1)
title('滤波后的按键音(时域)'),xlabel('t'),ylabel('振幅')
subplot(2,1,2),plot(f,abs(fftshift(X1))),xlim([0,2000])
title('滤波后的按键音(频域)'),xlabel('f/Hz'),ylabel('幅度')
% -------------------------------------------过零率与短时能量
len=2000;                                   %帧长
d=50;                                       %帧重叠样点长
s=fra(len,len-d,x1);                        %分帧,s为帧数
es=s.^2;                                    %一帧内各样点能量
energy=sum(es,2);                           %一帧的能量,行求和
zcr=zcro(s);                                %求过零率
figure
subplot(3,1,1),plot(x1)
title('按键音1234567890'),ylabel('幅度')
subplot(3,1,2),plot(energy)
title('短时能量'),xlabel('帧编号'),ylabel('E')
subplot(3,1,3),plot(zcr)
title('信号过零率'),xlabel('帧编号'),ylabel('过零次数')
%-------------------------------------------端点检测
flag=energy;                                %有效信号标志
Ethresh=0.02;                               %短时能量阈值
flag(find(energy>Ethresh))=1;
flag(find(energy<=Ethresh))=0;
desired_signal=[];                          %有效信号标志
desired_signal(1)=0;
for i=1:length(flag)for j=2:iif flag(j-1)*flag(j)==0desired_signal(i)=0;elsedesired_signal(i)=1;endend
end
figure,plot(desired_signal),ylim([0,1.2])
title('有效信号标志(0无效,1有效)'),xlabel('帧编号'),ylabel('y')
for i=2:length(desired_signal)if desired_signal(i)-desired_signal(i-1)==1left(i)=i;                      %左端点elseif desired_signal(i)-desired_signal(i-1)==-1right(i)=i;                     %右端点end
end
left_end=find(left~=0);                 %左端点
right_end=find(right~=0);               %右端点
%---------------------------------------分帧后的恢复,分割信号
[leftend1,leftend2]=inverse_fra(left_end,len-d,len);
[rightend1,rightend2]=inverse_fra(right_end,len-d,len);
figure
subplot(3,1,1),plot(x1)
title('按键音1234567890'),ylabel('幅度'),xlabel('t')
for i=1:length(leftend1)line([leftend1(i) leftend1(i)],[-0.1 0.1],'Color','red')line([rightend1(i) rightend1(i)],[-0.1 0.1],'Color','red')
end
subplot(3,1,2),plot(energy),ylim([-0.1,0.6])
title('短时能量'),xlabel('帧编号'),ylabel('E')
for i=1:length(left_end)line([left_end(i) left_end(i)],[-0.1 1],'Color','red')line([right_end(i) right_end(i)],[-0.1 1],'Color','red')
end
subplot(3,1,3),plot(zcr)
for i=1:length(left_end)line([left_end(i) left_end(i)],[-200,200],'Color','red')line([right_end(i) right_end(i)],[-200,200],'Color','red')
end
title('信号过零率'),xlabel('帧编号'),ylabel('过零次数')
%------------------------------------提取信号,识别号码
Ass=15;                                       %单个检测阈值
ferror=-10:10;                                %频率误差
fsL=[697 770 852 941];                        %信号低频
fsH=[1209 1336 1477];                         %信号高频
number=zeros(1,length(leftend1));             %存号码
figure
for i=1:length(leftend1)x=x1(leftend1(i):rightend1(i));N=length(x);fk=(0:N-1)/N*Fs;X=abs(fft(x));if max(X(floor(N*(fsL(1)+ferror)/Fs)))>Ass & max(X(floor(N*(fsH(1)+ferror)/Fs)))>Assnumber(i)=1;elseif max(X(floor(N*(fsL(1)+ferror)/Fs)))>Ass & max(X(floor(N*(fsH(2)+ferror)/Fs)))>Assnumber(i)=2;elseif max(X(floor(N*(fsL(1)+ferror)/Fs)))>Ass & max(X(floor(N*(fsH(3)+ferror)/Fs)))>Assnumber(i)=3;elseif max(X(floor(N*(fsL(2)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(1)+ferror)/Fs)))>Assnumber(i)=4;elseif max(X(floor(N*(fsL(2)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(2)+ferror)/Fs)))>Assnumber(i)=5;elseif max(X(floor(N*(fsL(2)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(3)+ferror)/Fs)))>Assnumber(i)=6;elseif max(X(floor(N*(fsL(3)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(1)+ferror)/Fs)))>Assnumber(i)=7;elseif max(X(floor(N*(fsL(3)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(2)+ferror)/Fs)))>Assnumber(i)=8;elseif max(X(floor(N*(fsL(3)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(3)+ferror)/Fs)))>Assnumber(i)=9;elseif X(floor(N*(fsL(4)/Fs)+ferror))>Ass & X(floor(N*(fsH(2)+ferror)/Fs))>Assnumber(i)=0;endsubplot(3,4,i),plot(fk,X),title('按键音(频域)'),xlim([500,1500])
end
disp('该号码为:')
disp(num2str(number))                        %转换为字符串输出

(2)带通滤波器,此滤波器是使用fdatool生成

function Hd = band_pass
%BAND_PASS Returns a discrete-time filter object.% MATLAB Code% Butterworth Bandpass filter designed using FDESIGN.BANDPASS.% Generated by MATLAB(R) 9.0 and the Signal Processing Toolbox 7.2.
% Generated on: 18-Dec-2019 14:51:03
% All frequency values are in Hz.
Fs = 44100;  % Sampling FrequencyFstop1 = 500;         % First Stopband Frequency
Fpass1 = 697;         % First Passband Frequency
Fpass2 = 1477;        % Second Passband Frequency
Fstop2 = 1600;        % Second Stopband Frequency
Astop1 = 20;          % First Stopband Attenuation (dB)
Apass  = 1;           % Passband Ripple (dB)
Astop2 = 30;          % Second Stopband Attenuation (dB)
match  = 'stopband';  % Band to match exactly% Construct an FDESIGN object and call its BUTTER method.
h  = fdesign.bandpass(Fstop1, Fpass1, Fpass2, Fstop2, Astop1, Apass, ...Astop2, Fs);
Hd = design(h, 'butter', 'MatchExactly', match);% [EOF]

(3)分帧

function [f] = fra(len,inc,x)
%fra 对语音信号分帧
%   len-帧长,inc-非重叠样点长度,x-语音信号
fh=fix((size(x,1)-len+inc)/inc);  %计算帧数
f=zeros(fh,len);                  %行为帧长,列为帧数
i=1;n=1;
while i<fh                        %帧间循环j=1;while j<len                   %帧内循环f(i,j)=x(n);j=j+1;n=n+1;endn=n-len+inc;                  %下一帧开始的位置i=i+1;
end
end

(4)过零率

function [f] = zcro(x)
%zcro 计算过零率
%   f-过零率,x-帧长
f=zeros(size(x,1),1);
for i=1:size(x,1)z=x(i,:);for j=1:(length(z)-1)if z(j)*z(j+1)<0f(i)=f(i)+1;endend
end
end

(5)分帧后的复原

function [end1,end2] = inverse_fra(k,inc,len)
%inverse_fra 将帧数编号时,还原到原始语音部分
%输出   end1-起始端点,end2-结束端点
%输入   k-帧编号,inc-帧非重叠样点长度,len-帧长
end1=(k-1)*inc+1;
end2=(k-1)*inc+len;
end

3、程序结果

图2 原始按键音

图3 滤波后的按键音

图4 短时能量与过零率

图5 有效信号区域

图6 分割信号


图7 各按键音频率

图8 识别结果

在此程序中,端点检测并未用到短时过零率,是通过短时能量进行判断的,短时过零率仅仅是用来辅助判断。由于本人录音时间较长,且每段信号所含信息相同,因此可以用短时能量进行糙的端点检测,若进行更细致的检测则需要使用双门限检测,甚至是多门限检测法。由于电话号码当中并未出现A、B、C、D四个信号,因此滤波时可将高于1477Hz的频率滤除,滤波是为了排除杂波的影响。

识别结果如图8所示,录音顺序确为“1234567890”,表明该程序是正确的。

电话拨键号码(DTMF信号)识别相关推荐

  1. 安卓dtmf识别_电话拨键号码(DTMF信号)识别

    1.流程 图1 流程图 2.MATLAB实现 (1)主程序 clear all clc [x0,Fs]=audioread('1234567890.wav'); %sound(x0,Fs); N=le ...

  2. matlab电话拨号音的合成与识别代码,实验报告 电话拨号音的合成与识别

    大连理工大学实验报告 学院(系): 电信 专业: 电子信息工程 班级: 电子1302 姓名: 曾昱 学号: 201311066 组: 实验时间: 实验室: 实验台: 指导教师签字: 成绩: 电话拨号音 ...

  3. matlab判断电话播键音,MATLAB电话拨号音的合成与识别

    1.实验目的1.本实验内容基于对电话通信系统中拨号音合成与识别的仿真实现.主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用 MATLAB 软件以及 FFT 算法实现对电话通信系统中拨号音的合成 ...

  4. 安卓dtmf识别_基于Python的DTMF信号识别

    前言 我这标题起得怎么这么像课程论文呢-- 啊,放心啦,这不是课程论文,这只是一个有趣(且值钱)的程序. 起因是这样的.我加了几个软件兼职群,前几天我发现其中有一个项目,是利用FFT识别信号啥的,报价 ...

  5. 安卓dtmf识别_安卓dtmf识别_基于Python的DTMF信号识别

    前言 我这标题起得怎么这么像课程论文呢-- 啊,放心啦,这不是课程论文,这只是一个有趣(且值钱)的程序. 起因是这样的.我加了几个软件兼职群,前几天我发现其中有一个项目,是利用FFT识别信号啥的,报价 ...

  6. 安卓dtmf识别_使用Goertzel算法识别DTMF信号

    Goertzel算法 Goertzel算法由Gerald Goertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评 ...

  7. android识别 dtmf信号,Android 拨号音DTMF 编码解码理论和实战

    一.原理,公式推导 f(n)=2*cos(w*Ts)*f(n-1) - f(n-2) float a1=2*cos(w*Ts); float a2=-1; 假如我们需要产生取样频率为8KHz的440H ...

  8. matlab 双音多频 接收端检测到的号码,信号语音论文,关于基于MATLAB的双音多频信号识别相关参考文献资料-免费论文范文...

    导读:本论文可用于信号语音论文范文参考下载,信号语音相关论文写作参考研究. (河南师范大学计算机与信息工程学院,河南新乡453007) [摘 要]本文采用FFT和戈泽尔算法对计算机模拟产生双音多频信号 ...

  9. 电话主叫号码信息的识别及实现CID

    如何用单片机实现FSK来电显示解码 原理: 此项目的关键是,FSK是连续相位的,且高电平与低电位的频率不成倍数关系(1200Hz与2200Hz).采用测量脉冲宽度的话不容易确定上升沿与下降沿.理论上用 ...

最新文章

  1. css毛玻璃效果白边_CSS3毛玻璃效果(blur)有白边问题的解决方法
  2. 第十八章 33用重载输出运算符函数实现字符串的输出
  3. c语言编码表白,C语言告白代码,一闪一闪亮晶晶~
  4. 适用于WinForm的一个定时器类
  5. [云炬创业基础笔记]第十章企业的利润计划测试3
  6. stm32f405xx.h头文件的问题Undefined symbol IS_TIM_BREAK_INSTANCE
  7. python一键取消注释_Python文件去除注释的方法
  8. WebAPI(part4)--操作元素
  9. c语言构建栈_选择技术栈构建通用平台
  10. 4.openSession() 、 getCurrentSession()与session上下文
  11. 【API进阶之路】API带来的微创新,打动投资人鼓励我创业
  12. css动漫效果库,Animate.css功能强大的纯CSS3动画库 - 资源分享
  13. 支持商用,开源的商城系统,推荐给你
  14. 51单片机DS18B20(单总线)温度读取
  15. modbus模拟器使用
  16. 量子计算机窦文涛,中国式浪漫,美到哭泣!
  17. 470余万条疑似12306用户数据遭贩卖 嫌疑人被刑拘
  18. 物理层(网线)、数据链路层(交换机)、网络层(IP协议、ARP协议、ICMP协议、路由器)、VLAN(虚拟局域网)、HSRP协议、ACL、NAT
  19. GBase 8c 安全特性
  20. fatal error C1088

热门文章

  1. 【博学谷学习记录】超强总结,用心分享 | shell基础
  2. 我的MACBOOK安装的软件
  3. 虚幻引擎图文笔记:使用布料模拟(Cloth Simulation)系统制作一面可以随风飘动的旗帜(更新)
  4. java 传值为不可变_Java函数传参(String的不可变性)
  5. InputNumber 数字输入框
  6. 树与二叉树基本概念与性质
  7. PTA1018 锤子剪刀布
  8. 百度地图开发-在百度地图上面显示出运动的轨迹
  9. 微信网页授权并获取用户信息
  10. 417页16万字智慧医院信息化大数据建设 设计方案