lebronze 发表于 2016-5-16 15:43

声源定位系统中,端点检测后如何利用广义互相关测时延

在做一个声源检测的研究,现在的问题是声音信号采集进来,先经过预处理和端点检测,提取声音段。但提取声音段后它的起点就都不一样了,那么接下来要做广义互相关求时延就没法求了,这个要怎么办?
望有声音定位的大神指点。

amnesia 发表于 2016-5-18 15:31

参考一下http://www.docin.com/p-944996960.html

lebronze 发表于 2016-5-18 15:48

amnesia 发表于 2016-5-18 15:31
参考一下http://www.docin.com/p-944996960.html

多谢楼上的回复,发帖好几周了终于有人回我了。
相关文章我都看了很多了,思路也都大同小异,但是问题在于从端点检测到时延估计这两步之间是如何联系的?这是关键。
因为正像我问题说的,端点检测是可以检测出语音段,返回语音段的起止帧号,但是这样也就损失了时延信息(因为两段语音的起点信息被破坏了),那么到时延估计这一步两个语音段起点不同,那也就没法时延估计了。。。。

amnesia 发表于 2016-5-20 10:20

lebronze 发表于 2016-5-18 15:48
多谢楼上的回复,发帖好几周了终于有人回我了。
相关文章我都看了很多了,思路也都大同小异,但是问题在 ...

端点检测主要是找起始和终止点,但是端点在原始信号中的位置仍然是可以确定的啊,怎么会导致时间信息丢失呢?

TestGuru 发表于 2016-5-20 10:49

不明白,为什么“提取声音段后它的起点就都不一样了”?时间信息都在吧,不是说有语音段的起止帧号吗?

lebronze 发表于 2016-6-1 11:18

amnesia 发表于 2016-5-20 10:20
端点检测主要是找起始和终止点,但是端点在原始信号中的位置仍然是可以确定的啊,怎么会导致时间信息丢失 ...

因为每帧时间(10~20ms)会远远超过时延的时间(10^-2ms量级),这样得到的多路声音信号起始帧号都是相同的,因而没法定位。

lebronze 发表于 2016-6-1 11:18

TestGuru 发表于 2016-5-20 10:49
不明白,为什么“提取声音段后它的起点就都不一样了”?时间信息都在吧,不是说有语音段的起止帧号吗?

因为每帧时间(10~20ms)会远远超过时延的时间(10^-2ms量级),这样得到的多路声音信号起始帧号都是相同的,因而没法定位。

vibmaster 发表于 2016-6-1 13:18

function = vad(x)

%幅度归一化到[-1,1]
x = double(x);
x = x / max(abs(x));

%常数设置
FrameLen = 240;%帧长为240点
FrameInc = 80;%帧移为80点

amp1 = 10;%初始短时能量高门限
amp2 = 2;%初始短时能量低门限
zcr1 = 10;%初始短时过零率高门限
zcr2 = 5;%初始短时过零率低门限

maxsilence = 8;% 8*10ms= 80ms
%语音段中允许的最大静音长度,如果语音段中的静音帧数未超过此值,则认为语音还没结束;如果超过了
%该值,则对语音段长度count进行判断,若count<minlen,则认为前面的语音段为噪音,舍弃,跳到静音
%状态0;若count>minlen,则认为语音段结束;

minlen= 15;    % 15*10ms = 150ms
%语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音

status= 0;   %初始状态为静音状态
count   = 0;   %初始语音段长度为0
silence = 0;   %初始静音段长度为0

%计算过零率
tmp1= enframe(x(1:end-1), FrameLen, FrameInc);
tmp2= enframe(x(2:end), FrameLen, FrameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr   = sum(signs.*diffs, 2);

%计算短时能量
%amp = sum(abs(enframe(filter(, 1, x), FrameLen, FrameInc)), 2);
amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);

%调整能量门限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);

%开始端点检测
x1 = 0;
x2 = 0;
for n=1:length(zcr)
   goto = 0;
   switch status
   case {0,1}                   % 0 = 静音, 1 = 可能开始
      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                     % 语音将结束
         silence = silence+1;
         if silence < maxsilence % 静音还不够长,尚未结束
            count= count + 1;
         elseif count < minlen   % 语音长度太短,认为是噪声
            status= 0;
            silence = 0;
            count   = 0;
         else                  % 语音结束
            status= 3;
         end
      end
   case 3,
      break;
   end
end
count = count-silence/2;
x2 = x1 + count -1;
subplot(311)    %subplot(3,1,1)表示将图排成3行1列,最后的一个1表示下面要画第1幅图
plot(x)
axis()    %函数中的四个参数分别表示xmin,xmax,ymin,ymax,即轴的范围
ylabel('Speech');
line(, [-1 1], 'Color', 'red');
%这里作用为用直线画出语音段的起点和终点,看起来更直观。第一个[]中的两个参数为线起止点的横坐标,
%第二个[]中的两个参数为线起止点的纵坐标。最后两个参数设置了线的颜色。
line(, [-1 1], 'Color', 'red');
subplot(312)   
plot(amp);
axis()
ylabel('Energy');
line(, , 'Color', 'red');
line(, , 'Color', 'red');
subplot(313)
plot(zcr);
axis()
ylabel('ZCR');
line(, , 'Color', 'red');
line(, , 'Color', 'red');端点检测小程序

lebronze 发表于 2016-6-1 15:25

vibmaster 发表于 2016-6-1 13:18
端点检测小程序

多谢答主热心,还把代码贴出来了,很赞!
VAD我已经实现了,就是时延估计这块有点问题。

vibmaster 发表于 2016-6-1 15:44

lebronze 发表于 2016-6-1 15:25
多谢答主热心,还把代码贴出来了,很赞!
VAD我已经实现了,就是时延估计这块有点问题。

哈哈有帮助就好期待其他人的热心回复

vibmaster 发表于 2016-6-14 09:12

不知道楼主问题解决了吗?我也挺关注这个的   可否分享一下经验
页: [1]
查看完整版本: 声源定位系统中,端点检测后如何利用广义互相关测时延