概述
语音识别技术的应用是2013年5月份参加Mathorcup数学建模竞赛的题目,整体部分代码,如下
%语音信号采集
n=5*8000; %采样总点数40000,采样频率8KHz,单声道,16位采样精度
fs=8000;
ch=1;
y=wavrecord(n,fs,ch,'double') plot(y);%语音信号波形
wavwrite(y,'实验1.wav') %把分析样本保存为"实验1.wav"文件
%语音信号波形
[x,fs,nbit]=wavread('实验1.wav');
plot(x);
titile('原始语音波形图')
xlabel('time')
ylabel('amplitude')
%语音信号加帧
[x,fs,nbit]=wavread('实验1.wav');
len=200; %指定帧长
inc=100; %指定帧移
y=enframe(x,len,inc); %分帧函数,x为输入语音信号
figure;
subplot(2,1,1),plot(x)
title('语音信号分帧前')
xlabel('time')
ylabel('amplitude')
grid
subplot(2,1,2),plot(y)
title('语音信号分帧后')
xlabel('time')
ylabel('amplitude')
grid
%利用window函数设计窗口为120的汉明窗
N=120; %窗口长度120
w = window('hamming',N);
wvtool(w) %利用wvtool函数观察其时域波形图及频谱特性
%语音信号分帧加窗
[x,fs,nbits]=wavread('实验1.wav');
x1=enframe(x,200,100);
x2=enframe(x,hamming(200),100);
subplot(2,1,1),plot(x1)
title('分帧后未添加汉明窗波形图')
grid
subplot(2,1,2),plot(x2)
title('分帧且添加汉明窗后波形图')
grid
%语音信号预加重
[x,fs,nbit]=wavread('实验1.wav');
len=200;
inc=100;
y=enframe(x,len,inc);
%语音信号通过一个高通滤波器1-0.935^(-1)
z=filter([1-0.9375],1,y);
figure(2)
subplot(2,1,1),plot(y) %加重前
title('语音信号预加重前');
grid
subplot(2,1,2),plot(z) %加重后
title('语音信号预加重后');
grid
%语音信号端点检测
%读取文件名为实验1的wav文件
[y,fs,nbits]=wavread('实验1.wav');
%设置参数
FrameLen=200; %帧长200
FrameInc=100; %帧移100
amp1=10; %初始短时能量高限制
amp2=2; %初始短时能量最低限制
zcr1=10; %初时过零率最高限制
zcr2=5; %初始过零率最低限制
maxsilence=8;
%语音信息段中最大的静音长度;
%如果语音信息段中的静音帧数没有超过最大静音长度,那么我们认为语音还没有结束;
%如果超过了改值,那么对语音信息长度count进行判断,如果countminlen,那么认为语音段结束了。
minlen=15;%语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音
status=0;%初始化语音段状态为0;
count=0;%初始化语音长度为0;
silence=0;%初始化静音段长度为0;
%计算过零率
tmp1=enframe(y(1:end-1),FrameLen,FrameInc); %对语音信号分帧处理
tmp2=enframe(y(2:end),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<0; %过零率公式
diffs=(tmp1 -tmp2)>0.02;
zcr=sum(signs.*diffs, 2);
%计算短时能量
amp=sum(abs(enframe(filter([1
-0.9375],1,y),FrameLen,FrameInc)),2); %先预加重处理,通过高通滤波器,然后进一步计算。
%调整能量门限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);
%进行端点检测
y1 = 0;
y2 = 0;
for n=1:length(zcr)
goto = 0;
switch status
case
{0,1} % 0=静音, =可能开始
if amp(n) >
amp1 % 确信进入语音段
x1 = max(n-count-1,1);
status = 2;
silence = 0;
count = count + 1;
elseif amp(n) > amp2 | ... % 可能处于语音段
zcr(n) > zcr2
status = 1;
count = count + 1;
else % 静音状态
status = 0;
count = 0;
end
case
2, % 2 = 语音段
if amp(n) > amp2 |
... % 保持在语音段
zcr(n) > zcr2
count = count + 1;
else
最后
以上就是认真飞机为你收集整理的基于matlab的语音信号加窗,[转载]基于Matlab的语音识别技术的应用的全部内容,希望文章能够帮你解决基于matlab的语音信号加窗,[转载]基于Matlab的语音识别技术的应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复