电话拨键号码(DTMF信号)识别 您所在的位置:网站首页 声音fft分析 电话拨键号码(DTMF信号)识别

电话拨键号码(DTMF信号)识别

2023-09-04 14:21| 来源: 网络整理| 查看: 265

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(energyAss & max(X(floor(N*(fsH(1)+ferror)/Fs)))>Ass number(i)=1; elseif max(X(floor(N*(fsL(1)+ferror)/Fs)))>Ass & max(X(floor(N*(fsH(2)+ferror)/Fs)))>Ass number(i)=2; elseif max(X(floor(N*(fsL(1)+ferror)/Fs)))>Ass & max(X(floor(N*(fsH(3)+ferror)/Fs)))>Ass number(i)=3; elseif max(X(floor(N*(fsL(2)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(1)+ferror)/Fs)))>Ass number(i)=4; elseif max(X(floor(N*(fsL(2)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(2)+ferror)/Fs)))>Ass number(i)=5; elseif max(X(floor(N*(fsL(2)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(3)+ferror)/Fs)))>Ass number(i)=6; elseif max(X(floor(N*(fsL(3)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(1)+ferror)/Fs)))>Ass number(i)=7; elseif max(X(floor(N*(fsL(3)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(2)+ferror)/Fs)))>Ass number(i)=8; elseif max(X(floor(N*(fsL(3)/Fs)+ferror)))>Ass & max(X(floor(N*(fsH(3)+ferror)/Fs)))>Ass number(i)=9; elseif X(floor(N*(fsL(4)/Fs)+ferror))>Ass & X(floor(N*(fsH(2)+ferror)/Fs))>Ass number(i)=0; end subplot(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 Frequency Fstop1 = 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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有