• 大小: 3KB
    文件类型: .m
    金币: 2
    下载: 1 次
    发布日期: 2021-07-21
  • 语言: Matlab
  • 标签: matlab  端点检测  

资源简介

matlab实现音频端点检测,需要有enframe.m文件

资源截图

代码片段和文件信息

% 语音信号的端点检测matlab实现:
[xfsnbits]=wavread(‘E:\a\sun00.wav‘);%首先打开经录好的信号,一段口哨声。
x = x / max(abs(x));%幅度归一化到[-11]
%参数设置
frameLen = 256;     %帧长,即每帧采样点
inc = 90;           %未重叠部分,、帧移对于的点数
amp1 = 10;          %短时能量阈值
amp2 = 2;           %即设定能量的两个阈值。
zcr1 = 10;          %过零率阈值
zcr2 = 5;           %过零率的两个阈值,感觉第一个没有用到。
 
%minsilence = 5;   %用无声的长度来判断语音是否结束
minlen  = 10;    %判断是语音的最小长度
status  = 0;      %记录语音段的状态
count   = 0;     %语音序列的长度
%silence = 0;      %无声的长度
 
%计算过零率
tmp1  = enframe(x(1:end-1) frameLeninc);%数组x经过处理后得到二维数组y
tmp2  = enframe(x(2:end)   frameLeninc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 - tmp2)>0.02;
zcr   = sum(signs.*diffs2);%表示矩阵signs.*diffs的横向相加,求每行的和,结果是列向量。
                            %sum(x)为竖向相加,求每列的和,结果为横向量。
                            %信号各帧的过零率值,放到zcr矩阵中。
 
%计算短时能量
%amp = sum((abs(enframe(filter([1 -0.9375] 1 x) frameLen inc))).^2 2);%不知道这里的filter是干啥的?但的出来的是各贞的能量了。
amp = sum((abs(enframe( x frameLen inc))).^2 2);%通过把filter给去掉,发现结果差不多,所以个人感觉没必要加一个滤波器,上边出现的enframe函数放到后边分析。这里知道是求出x各帧的能量值就行。
 
%调整能量门限
amp1 = min(amp1 max(amp)/4);
amp2 = min(amp2 max(amp)/8);%min函数是求最小值的,没必要说了。

for n=1:length(zcr)%Length(zcr)得到的是整个信号的帧数。 
   goto = 0;
   switch status
       case {01}
       if amp(n) > amp1          % 确信进入语音段 
         x1 = max(n-count1); % 记录语音段的起始点 %count为在这之前的>amp2 or >zcr2,的帧的个数
         %x1=n;
    

评论

共有 条评论