声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2093|回复: 10

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

[复制链接]
发表于 2016-5-16 15:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2016-5-18 15:31 | 显示全部楼层
 楼主| 发表于 2016-5-18 15:48 | 显示全部楼层
amnesia 发表于 2016-5-18 15:31
参考一下http://www.docin.com/p-944996960.html

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

端点检测主要是找起始和终止点,但是端点在原始信号中的位置仍然是可以确定的啊,怎么会导致时间信息丢失呢?
发表于 2016-5-20 10:49 | 显示全部楼层
不明白,为什么“提取声音段后它的起点就都不一样了”?时间信息都在吧,不是说有语音段的起止帧号吗?
 楼主| 发表于 2016-6-1 11:18 | 显示全部楼层
amnesia 发表于 2016-5-20 10:20
端点检测主要是找起始和终止点,但是端点在原始信号中的位置仍然是可以确定的啊,怎么会导致时间信息丢失 ...

因为每帧时间(10~20ms)会远远超过时延的时间(10^-2ms量级),这样得到的多路声音信号起始帧号都是相同的,因而没法定位。
 楼主| 发表于 2016-6-1 11:18 | 显示全部楼层
TestGuru 发表于 2016-5-20 10:49
不明白,为什么“提取声音段后它的起点就都不一样了”?时间信息都在吧,不是说有语音段的起止帧号吗?

因为每帧时间(10~20ms)会远远超过时延的时间(10^-2ms量级),这样得到的多路声音信号起始帧号都是相同的,因而没法定位。
发表于 2016-6-1 13:18 | 显示全部楼层
  1. function [x1,x2] = vad(x)

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

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

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

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

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

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

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

  27. %计算短时能量
  28. %amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);
  29. amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);

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

  33. %开始端点检测
  34. x1 = 0;
  35. x2 = 0;
  36. for n=1:length(zcr)
  37.    goto = 0;
  38.    switch status
  39.    case {0,1}                   % 0 = 静音, 1 = 可能开始
  40.       if amp(n) > amp1          % 确信进入语音段
  41.          x1 = max(n-count-1,1);
  42.          status  = 2;
  43.          silence = 0;
  44.          count   = count + 1;
  45.       elseif amp(n) > amp2 | ... % 可能处于语音段
  46.              zcr(n) > zcr2
  47.          status = 1;
  48.          count  = count + 1;
  49.       else                       % 静音状态
  50.          status  = 0;
  51.          count   = 0;
  52.       end
  53.    case 2,                       % 2 = 语音段
  54.       if amp(n) > amp2 | ...     % 保持在语音段
  55.          zcr(n) > zcr2
  56.          count = count + 1;
  57.       else                       % 语音将结束
  58.          silence = silence+1;
  59.          if silence < maxsilence % 静音还不够长,尚未结束
  60.             count  = count + 1;
  61.          elseif count < minlen   % 语音长度太短,认为是噪声
  62.             status  = 0;
  63.             silence = 0;
  64.             count   = 0;
  65.          else                    % 语音结束
  66.             status  = 3;
  67.          end
  68.       end
  69.    case 3,
  70.       break;
  71.    end
  72. end  
  73. count = count-silence/2;
  74. x2 = x1 + count -1;
  75. subplot(311)    %subplot(3,1,1)表示将图排成3行1列,最后的一个1表示下面要画第1幅图
  76. plot(x)
  77. axis([1 length(x) -1 1])    %函数中的四个参数分别表示xmin,xmax,ymin,ymax,即轴的范围
  78. ylabel('Speech');
  79. line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red');
  80. %这里作用为用直线画出语音段的起点和终点,看起来更直观。第一个[]中的两个参数为线起止点的横坐标,
  81. %第二个[]中的两个参数为线起止点的纵坐标。最后两个参数设置了线的颜色。
  82. line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');
  83. subplot(312)   
  84. plot(amp);
  85. axis([1 length(amp) 0 max(amp)])
  86. ylabel('Energy');
  87. line([x1 x1], [min(amp),max(amp)], 'Color', 'red');
  88. line([x2 x2], [min(amp),max(amp)], 'Color', 'red');
  89. subplot(313)
  90. plot(zcr);
  91. axis([1 length(zcr) 0 max(zcr)])
  92. ylabel('ZCR');
  93. line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');
  94. line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');
复制代码
端点检测小程序
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-6-1 15:25 | 显示全部楼层

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

点评

哈哈 有帮助就好 期待其他人的热心回复  详情 回复 发表于 2016-6-1 15:44
发表于 2016-6-1 15:44 | 显示全部楼层
lebronze 发表于 2016-6-1 15:25
多谢答主热心,还把代码贴出来了,很赞!
VAD我已经实现了,就是时延估计这块有点问题。

哈哈  有帮助就好  期待其他人的热心回复
发表于 2016-6-14 09:12 | 显示全部楼层
不知道楼主问题解决了吗?  我也挺关注这个的   可否分享一下经验
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-10 17:44 , Processed in 0.083768 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表