matlab识别电话音

基于电话通信系统中拨号音合成原理,对其识别进行仿真实现。主要涉及到电话拨号音合成的基本原理及识别的主要方法,通过MATLAB软件来实现仿真。

双音多频 DTMF(Dual Tone Multi-Frequency)信号

双音多频信号是用两个特定的单音频率信号的组合来代表数字或功能。在DTMF电话机中有16个按键,其中10个数字键 0-9, 6个功能键*、#、A、B、C、D。根据CCITT建议,国际上采用697Hz、770Hz、852Hz、941Hz为低频群及1209Hz、1336Hz、1477Hz、1633Hz为高频群。从低频群和高频群任意各抽出一种频率进行组合,共有 16 种组合,代表 16 种不同的数字键或功能,每个按键唯一地由一组行频和列频组成。

matlab代码如下:

clc;
clear all;
format long

dpin=[697,770,852,941];
gpin=[1209,1336,1477,1633];
hm=[1,2,3,10;4,5,6,10;7,8,9,10;10,0,10,10]

[y,fs]=audioread('原始音+连续噪声+连续单音.wav');

fs
l=length(y)
t=[0:1/fs:(l-1)/fs];

subplot(3,2,1),plot(t,y)
title ('原始音+连续噪声+连续单音.wav的波形图');
xlabel ('t/s');
ylabel ('y');

a=fs;
n=[0:a-1];
yf=fft(y,a); %在length(y)这个有限区间内做快速傅立叶变换
f=fs*n/a;

subplot(3,2,2),plot(f,abs(yf))
grid on
title ('原始音+连续噪声+连续单音.wav的频谱');
xlabel ('频率/Hz');
ylabel ('幅值');

y2=lvbo(y,500,2000,200,3000,0.1,30,fs); %带通带阻滤波器
yf2=fft(y2,a);
aaa=linspace(0,l-1,l);
subplot(3,2,3),plot(t,y2)
title ('滤波后的波形图');
xlabel ('t/s');
ylabel ('y');
subplot(3,2,4),plot(f,abs(yf2))
grid on
title ('滤波后的频谱');
xlabel ('频率/Hz');
ylabel ('幅值');


N=201;
h=linspace(1,1,N);%形成一个矩形窗,长度为N
en=conv(h,y2.*y2);%求卷积得其短时能量函数En
subplot(3,2,5),plot(en);
title ('能量函数');


%寻找端点
dd=10;
ii=zeros(2,20)
ii(1,1)=1;
i=100
while en(i)>dd
i=i+1;
end
ii(2,1)=i;

j=1;
while i<300000
    j=j+1
    while en(i)    i=i+1;
    end
    ii(1,j)=i;
    
    while en(i)>dd
    i=i+1;
    end
    ii(2,j)=i;
end
j   %j为号码个数


nn=zeros(1,j);

%每段的音频
fd=cell(1,j);
for k=1:j
fd{k}=y2(ii(1,k):ii(2,k));
end


for k=1:j
lk=length(fd{k});
nk=[0:lk-1];

yfk=fft(fd{k},lk);
fk=fs*nk/lk;
fp=floor(1000*lk/fs);

% plot(fk,abs(yfk))
% grid on

%找低频最大能量对应频率
p=abs(yfk(1:fp));
a1=find(p==max(p));
n1=floor(a1*fs/lk);
nd=find(abs(dpin-n1)<50); %对应低频群中的位置

%找高频最大能量对应频率
p=abs(yfk(fp:2*fp));
a2=find(p==max(p));
n2=1000+floor(a2*fs/lk);
ng=find(abs(gpin-n2)<50); %对应高频群中的位置

nn(k)=hm(nd,ng);
end

%第二个音
k=2;
lk=length(fd{k});
nk=[0:lk-1];

yfk=fft(fd{k},lk);
fk=fs*nk/lk;
fp=floor(1000*lk/fs);

subplot(3,2,6)
% plot(linspace(0,ii(2,k)-ii(1,k),ii(2,k)-ii(1,k)+1),fd{k});
plot(fk,abs(yfk))
grid on
title ('第二个音的频谱');
xlabel ('频率/Hz');
ylabel ('幅值');

fprintf('整个音频的号码为')
nn

你可能感兴趣的:(matlab)