基于自相关法的端点检测原理
个人理解
噪声信号和含噪语音的自相关函数存在极大的差异。
根据噪声的情况,设置两个阈值T1和T2,当相关函数最大值大于T2时,便判定是语音;当相关函数最大值大于或小于T1时,则判定为语音信号的端点
黑色根据静音时长。
蓝色根据幅度来计算。
%自相关端点检测
clear all; clc; close all;
filedir=[]; % 指定文件路径
filename='D:\matlab\MATLAB\程序\program\speech_signal\bluesky1.wav'; %制定文件名 % 指定文件名
fle=[filedir filename] ; % 构成路径和文件名的字符串
[x,fs]=wavread(fle); % 读入数据文件
x=x/max(abs(x)); % 幅度归一化
N=length(x); % 取信号长度
time=(0:N-1)/fs; % 计算时间
wlen=200;%帧长
inc=100;%帧移
win=hamming(wlen);%海明窗
N=length(x);%信号长度
time=(0:N-1)/fs;%计算出信号的时间刻度
X=enframe(x,win,inc)'; %分帧,一列是一帧
fn=size(X,2);%帧数
frameTime=frame2time(fn,wlen,inc,fs); %求出每帧对应的时间
%短时自相关
for k=2:fn
y=X(:,k);%每一帧数据
ru=xcorr(y);
R(k)=max(ru);
end
R=R/max(R);%归一化
r=[];%存储开始语音界限的位置
i1=1;
while (i1<length(R))
for i1=i1:1:length(R)
e=R(i1);
if e>0.03
r=[r i1-1];
i1=i1+1;
for i2=i1:length(R)
e=R(i2);
if e<0.0001
r=[r i2+1];
i1=i2+1;
break
end
end
break
end
end
end
%-短时自相关
plot(time,x)
title('男声“蓝天,白云,碧绿的大海”的端点检测');
ylabel('幅值'); xlabel(['时间/s' 10 '(a)']);
for tq=1:length(r)
line([frameTime(r(tq)) frameTime(r(tq))],[-1 1],'color','k','LineStyle','-');
hold on
end