..
.页脚
一、实验目的
1.本实验的容基于对通信系统中拨号音的识别仿真实验。主要涉及到拨号音识别
的基本原理和识别的主要方法。利用matlab软件以及fft算法实现对通信系
统中拨号音的识别。并进一步利用matlab中的图形用户界面制作简单直观的
模拟界面,使其对拨号音的识别有个基本的了解。
2.能够利用矩阵不同的基频合成0-9不同按键的拨号音,并能够对不同的拨号
音加以正确的识别。进一步画出简单的图形,从而实现对拨号音系统的简单的
实验仿真。
3.了解学习DTMF(双音多频)相关知识,知道双音多频的信号是用两个特定的
单音频率信号的组合来代表数字或功能。
二、实验仪器
安装有MATLAB软件的计算机一台。
三、实验原理
(双音多频)
(1)基本概念
拨号有两种,脉冲和音频,所谓音频也成双音多频(DTMF)信号的拨号
方式即是拨号时每按一个键,有两个音频频率叠加成一个双音频信号,十六
个按键由八个音频频率区分。
(2)编制规则
具体DTMF编制规则如表1所示
表1DTMF键盘
高群/Hz
..
.页脚
低群/Hz1233
697123A
770456B
852789C
941*0#D
双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一
个高频。用户每按一个键就发送一个高频和低频的正弦信号组合。
2.按键音识别
MATLAB中audioread函数可以实现多种音频信号的读取,调用形式为
[y,fs]=audioread(filename)
其中y为所读取的音频数据;
而fs为采样频率;
调用的filename为指定载入的音频文件名称。
用fft频谱分析公式
/2/wTfsffs
(1)
2/wNk
(2)
由公式(1)和(2)可得:(3)
四.实验容
本实验要实现拨号音(DTMF)信号的检测的识别,可以通过直接计算傅里叶变换
时的输入信号组成的频率。这里采用FFT算法对信号进行解码分析。首先对接收到
的数字信号作FFT分析。计算出其频幅谱,继而得到功率谱,组成输入信号的频率
必定对应功率谱的峰值。对于连续的双音多频(DTMF)信号。需要把有效的数字拨号
/ffskN
..
.页脚
信号从静音间隔中分割提取出来,然后再用FFT算法对信号进行解码分析,得出拨。
五、实验过程与分析
1.读取音频文件
利用MATLAB中audioread读取
[x,fs]=audioread('按键音.m4a');
2.声道提取
按键音是双声道,本实验提取声道1进行分析:
x=x(:,1);
3.端点提取
该按键音为一段连续的11位数字拨号音,分析时需要对它们分别进行处理,而
这11位数字间的时间间隔一般情况是没有规律的,无法直接用for循环控制截
取,而要是手动一段一段地进行截取,换一个音频信号就得再次重新截取,因此
考虑到可能存在噪音的情况,基于短时能量和短时平均过零率来进行端点检测,
实现端点的提取,对于不同的音频信号,只需要修改部分可变参数便可以适用。
4.分析
根据音频实际情况设置对应参数:
framelen=floor(fs*40/1000);%floor向下取整,帧长
frameinc=floor(fs*10/1000);%帧移
%进行分帧,每帧长framelength,
voice_min_len=15;%最短语音长度150ms
%语音段的最短长度,若语音段长度小于此值(如果语音段中的静音帧数未超过此
值,),则认为其为一段噪音
..
.页脚
unvoice_min_len=5;%结束段最小持续50ms
n3=0.05;%过零率下限参数0.05
检测结果见图1
结果:将11个检测到的音频左右端点提取出来
对信号进行fft变换后,得到的频谱是呈现对称的,在此截取前部分进行观察,得
到频谱图如图2所示。
程序运行最终结果为:
Thetelephonenumberis:
图1端点检测结果图图2按键音fft频谱图
5.可靠性检验
自己录制一段拨号音,检验程序的可靠性,这里为了
为了验证程序的正确、可靠性,又分别录制了我自己手机号以及1234567890两段
不同格式不同,在有噪声条件下的按键音,检验过程如下
(1)(.mp3格式)
参数设置同上
0.511.522.533.54
x10
5
-1
0
1
s
p
e
e
c
h
样本点
1
0
100
200
e
n
e
r
g
y
帧数
1
0
5
z
c
r
帧数
..
.页脚
图3端点检测结果图图4按键音的fft频谱图
程序运行结果:
Thetelephonenumberis:
图5端点检测结果图图6按键音的fft频谱图
(2)1234567890(.ogg格式)
该音频录制时,有的按键音持续时间较短,需要对检测初始参数进行修改
修改参数:
voice_min_len=6;%最短语音长度60ms
n3=0.02;%过零率下限参数0.02
程序运行结果:
Thetelephonenumberis:1234567890
经验证,该程序可行。
1234567
x10
5
-1
0
1
s
p
e
e
c
h
样本点
2600
0
200
400
e
n
e
r
g
y
帧数
2600
0
50
z
c
r
帧数
0.511.522.533.544.555.5
x10
5
-1
0
1
s
p
e
e
c
h
样本点
20001200
0
100
e
n
e
r
g
y
帧数
20001200
0
20
40
z
c
r
帧数
6014001600
2
4
6
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
2
4
6
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
1
2
3
4
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
1
2
3
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
1
2
3
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
0.5
1
1.5
2
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
0.5
1
1.5
2
2.5
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
1
2
3
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
0.5
1
1.5
2
x10
-4fft频谱图
频率/Hz
幅
度
6014001600
0.5
1
1.5
2
2.5
x10
-4fft频谱图
频率/Hz
幅
度
..
.页脚
六、小结
1.原本想着,进行端点检测时考虑了噪声的影响进行滤波或许就不必要了,但是将
滤波器加进程序后发现,对于不同的音频信号,程序有更好的适应性,端点检测结
果的精确度居然也有所提高,不用再反复修改设置参数,然后就将滤波器加入程中
了。
2.实验过程中,首先是手动截取11段数字音频验证可检测出来后,在进行端点检测
的构思,最后考虑滤波。
3.通过本次实验,发现自己在MATLAB函数的应用与程序设计中仍有很大的进步空
间。
4.有效的端点检测技术不仅能在语音识别系统中减少数据的采集量,节约处理时间,
还能排除无声段或噪声段的干扰。对于端点检测的程序,其原理经查阅资料明白一
些,但不多,查阅到语音端点检测参考程序之后,对其进行了步骤增加、减少等操
作,使其适合本实验,考虑到一些参数对于不同的音频需要做不同的改变,便将其
提取到主程序中,方便修改。
5.在引用的端点检测代码原理不很了解情况下,结合本实验对其进行部分修改比较
困难。
6.对于待检测信号的第一个数字滤波效果不好,未达到理想的效果。
7.先设计滤波器对信号进行滤波,滤去部分噪声,再设计考虑噪声的端点检测函数,
相当于信号进行了双重滤波处理,是结果能够更加准确。
七、实验程序
(1)主程序:
[x,fs]=audioread('按键音.m4a');%待检测数据
..
.页脚
%[x,fs]=audioread('10月11日.mp3');%检验
%[x,fs]=audioread('11_11_');%检验1234567890
x=x(:,1);%提取声道1
x=lv_bo_1(x,fs);
sound(x,fs);%播放滤波后的音频
%%调整各参数
framelen=floor(fs*40/1000);%floor向下取整,帧长
frameinc=floor(fs*10/1000);%帧移
%进行分帧,每帧长framelength,
voice_min_len=15;%最短语音长度60ms,150ms
%语音段的最短长度,若语音段长度小于此值(如果语音段中的静音帧数未超过此
值,),则认为其为一段噪音
unvoice_min_len=5;%结束段最小持续50ms
n3=0.02;%过零率下限参数0.02,0.05
%%end
[fan_wei]=vad(framelen,frameinc,x,fs,voice_min_len,unvoice_min_len,n3);%
引用时注意修改函数vad中的最短语音长度
number='';
figure
fori=1:length(fan_wei)
y=x(fan_wei(i,1):fan_wei(i,2));
n=0:length(y)-1;%建立一个信号等长的序列;
..
.页脚
%=================频域图像
==============================
N=length(y);%取信号矩阵的长度
FFT=fft(y,N);%N点傅里叶变换
mag=abs(FFT)/(N/2);%还原真实幅值
f=n*fs/N;%频率序列
%
f=f(1:fix(N/2));mag=mag(1:fix(N/2));%
subplot(3,4,i)%图2:频谱图
%取l/2作图
plot(f,mag);axis([6001700min(mag)max(mag)]);
title('fft频谱图');%标题:
xlabel('频率/Hz');%标注横坐标
ylabel('幅度');%标注纵坐标
gridon;%打开网格线
%数字判断
a1=(697+770)/2;a2=(770+852)/2;a3=(852+941)/2;
a4=(1209+1336)/2;a5=(1336+1477)/2;a6=(1477+1633)/2;
if(f(mag==max(mag(f<=1000)))
if(f(mag==max(mag(f>1100)))
tel=1;
elif(f(mag==max(mag(f>1100)))
..
.页脚
tel=2;
elif(f(mag==max(mag(f>1100)))
tel=3;
el
tel='A';
end
elif(f(mag==max(mag(f<=1000)))
if(f(mag==max(mag(f>1100)))
tel=4;
elif(f(mag==max(mag(f>1100)))
tel=5;
elif(f(mag==max(mag(f>1100)))
tel=6;
el
tel='B';
end
elif(f(mag==max(mag(f<=1000)))
if(f(mag==max(mag(f>1100)))
tel=7;
elif(f(mag==max(mag(f>1100)))
tel=8;
elif(f(mag==max(mag(f>1100)))
..
.页脚
tel=9;
el
tel='C';
end
el
if(f(mag==max(mag(f>1100)))
tel='*';
elif(f(mag==max(mag(f>1100)))
tel=0;
elif(f(mag==max(mag(f>1100)))
tel='#';
el
tel='D';
end
end
number=[number,num2str(tel)];
end
disp(['Thetelephonenumberis:',number])
(2)滤波器
function[f1]=lv_bo_1(x,fs)
%%双线性变换法设计Butterworth滤波器
t=0:1/fs:(size(x)-1)/fs;
..
.页脚
Au=0.03;
d=(Au*cos(2*pi*10000*t))';
x2=x+d;
%数字滤波器指标fp=3Hz,fr=4Hz,Rp=1db,As=20db,fs=10Hz
wp=0.25*pi;%通带边界频率(归一化):wp=fp*2*pi/fs
ws=0.3*pi;%阻带边界频率(归一化):ws=fr*2*pi/fs
Rp=1;%通带波纹
Rs=15;
%将模拟指标转换成数字指标
Fs=fs;
Ts=1/Fs;%时域最小间隔,即时域分辨率
wp1=2/Ts*tan(wp/2);%模拟低通原型滤波器通带频率
ws1=2/Ts*tan(ws/2);%模拟低通原型滤波器阻带频率
[N,Wn]=buttord(wp1,ws1,Rp,Rs,'s');%选择滤波器的最小阶数
[Z,P,K]=buttap(N);%创建butterworth模拟滤波器
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2lp(Bap,Aap,Wn);
%双线性变换得到分子和分母的系数向量bz,az
[bz,az]=bilinear(b,a,Fs);%用双线性变换法实现模拟滤波器到数字滤波器的转换
f1=filter(bz,az,x2);%进行滤波处理
(3)端点检测
function[fan_wei]=vad(a1,a2,x,fs,n1,n2,n3)
..
.页脚
%归一化
x=double(x);
x=x/max(abs(x));
framelen=a1;
frameinc=a2;
y=enframe(x,hanning(framelen),frameinc);%分帧
%计算短时间能量
amp=sum(abs(y),2);
%amp=sum(abs(enframe(filter([1-0.9375],1,x),framelen,frameinc)).^2,
2);
%计算过零率
tmp1=enframe(x(1:length(x)-1),framelen,frameinc);
tmp2=enframe(x(2:length(x)),framelen,frameinc);
signs=(tmp1.*tmp2)<0;diffs=(tmp1-tmp2)>n3;
zcr=sum(signs.*diffs,2);zcr=[zcr;zcr(end)];
zcr_yu=0.2*mean(zcr);yuzhi=0.2*mean(amp);%
N=length(amp);
forn=1:N
ifamp(n)
continue;
end
kaitou=n;
..
.页脚
break;
end
forn=N:-1:1
ifamp(n)
continue;
end
jiewei=n;
break;
end
noi=[amp(1:kaitou-1);amp(jiewei+1:end)];
noi_mean=mean(noi);noi_var=std(noi);
speech_mean=mean(amp(kaitou:jiewei));%noi_mean
yuzhi1=0.3*speech_mean;%
yuzhi2=max(0.3*speech_mean,(noi_mean+noi_var)*1.3);%
noi_zcr=[zcr(1:kaitou-1);zcr(jiewei+1:end)];
noi_zcr_mean=mean(noi_zcr);
noi_zcr_std=std(noi_zcr);
speech_zcr_mean=mean(zcr(kaitou:jiewei));
zcr_yu1=0.3*speech_zcr_mean;
zcr_yu2=max(0.3*speech_zcr_mean,(noi_zcr_mean+noi_zcr_std)*0.3);
st=[];en=[];
bstart_state=0;bend_state=0;
..
.页脚
gment=0;unvoice=0;
voice_min_len=n1;%最短语音长度70ms
unvoice_min_len=n2;%结束段最小持续50ms
st_candicate=0;en_candicate=0;
%%开始端点检测
fori=1:N
if((amp(i)>=yuzhi2&&zcr(i)>=zcr_yu1)&&~bstart_state)%findstart
bstart_state=1;%
if(~st_candicate)
st_candicate=i;
end
gment=gment+1;
elif((amp(i)>=yuzhi2||zcr(i)>=zcr_yu1)&&bstart_state)%
if(unvoice>=unvoice_min_len)%
st=[st;st_candicate];
en_candicate=en_candicate+unvoice_min_len-1;
en=[en;en_candicate];bstart_state=0;bend_state=1;
unvoice=0;gment=0;st_candicate=0;
el
unvoice=0;bend_state=0;
gment=gment+1;
end
..
.页脚
elif((amp(i)
ifgment>=voice_min_len%
unvoice=unvoice+1;
if~bend_state%
en_candicate=i;
end
bend_state=1;%
el%
bstart_state=0;gment=0;
bend_state=0;unvoice=0;
st_candicate=0;en_candicate=0;
end
elif((amp(i)>=yuzhi2||zcr(i)>=zcr_yu1)&&~bstart_state)%
if~st_candicate
st_candicate=i;
end
el%
st_candicate=0;
continue;
end
end
if(unvoice>=unvoice_min_len)%
..
.页脚
st=[st;st_candicate];
en=[en;(en_candicate+unvoice_min_len-1)];
gment=0;
end
if(gment>=voice_min_len)%
st=[st;st_candicate];en=[en;N];
end
figure(1);
subplot(3,1,1),plot(x);%原始语音波形
axis([1,length(x),-1,1]);ylabel('speech');xlabel('样本点');
fork=1:length(st)
line([st(k)*frameinc,st(k)*frameinc],[-1,1],'linestyle',':','color','blue','LineWidth
',2);
line([en(k)*frameinc,en(k)*frameinc],[-1,1],'linestyle',':','color','red','LineWidt
h',2);
end
subplot(3,1,2),plot(amp);%原始语音能量
axis([1,length(amp),0,max(amp)]),ylabel('energy');,xlabel('帧数');
line([1,N],[yuzhi1,yuzhi1],'color','yellow','LineWidth',2);%由语音能量
line([1,N],[yuzhi2,yuzhi2],'color','red','LineWidth',2);%由噪声平均能量和语音
能量比较而得
fork=1:length(st)
..
.页脚
line([st(k),st(k)],[min(amp),max(amp)],'linestyle',':','color','blue','LineWidth',2)
;
line([en(k),en(k)],[min(amp),max(amp)],'linestyle',':','color','red','LineWidth',2
);
end
subplot(3,1,3),plot(zcr);%原始语音过零率
axis([1,length(zcr),0,max(zcr)]),ylabel('zcr');xlabel('帧数');
line([1,N],[zcr_yu1,zcr_yu1],'color','yellow','LineWidth',2);%由语音能量
line([1,N],[zcr_yu2,zcr_yu2],'color','red','LineWidth',2);%语音加噪音
fork=1:length(st)
line([st(k),st(k)],[min(zcr),max(zcr)],'linestyle',':','color','blue','LineWidth',2);
line([en(k),en(k)],[min(zcr),max(zcr)],'linestyle',':','color','red','LineWidth',2);
end
fan_wei=[st,en]*frameinc;
本文发布于:2023-03-08 06:49:34,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678229374181146.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:拨号键盘.doc
本文 PDF 下载地址:拨号键盘.pdf
留言与评论(共有 0 条评论) |