正如我们在评论中一直讨论的那样,Goertzel算法是检测噪声中音调的常用方法。讨论之后,我不确定这是否是您想要的(您希望开始时间),但是对于Goertzel算法如何应用于您的问题似乎有些困惑,所以我想我会写出来这里。
Goertzel算法
如果您知道所要寻找的音调的频率(称为),并且对噪声水平有合理的了解,那么可以选择Goertzel算法,以便选择合适的检测阈值。FG
可以将Goertzel算法视为总是计算ONE FFT仓的输出:
ÿ(n )= eȷ 2 πFGñ∑k = 0ñx (n )e- ȷ 2 πFGķ
其中就是你要找的频率。FG
维基百科页面有一个更好的方法来计算。
这是Scilab的(可行的)实现尝试:
function [y,resultr,resulti] = goertzel(f_goertzel,x)
realW = 2.0*cos(2.0*%pi*f_goertzel);
imagW = sin(2.0*%pi*f_goertzel);
d1 = 0;
d2 = 0;
for n = 0:length(x)-1,
y(n+1) = x(n+1) + realW*d1 - d2;
d2 = d1;
d1 = y(n+1);
resultr(n+1) = 0.5*realW*d1 - d2;
resulti(n+1) = imagW*d1;
end
endfunction
考虑和ϕ = 4.4318752的信号:F= 0.0239074ϕ = 4.4318752
x = 罪(2 πFn + ϕ )+ ϵ (n )
ϵ (n )
在此示例中,音调从索引1001处开始进入信号的三分之一。
FG= f− 0.001
FG= f
四个痕迹是:
- XÿFG= 0.0229074
- ř Ë 小号ü 升吨ř2+ - [R È 小号ü 升吨我2---------------√
- XÿFG= 0.0239074
- ř Ë 小号ü 升吨ř2+ - [R È 小号ü 升吨我2---------------√
如您所见,我们感兴趣的音调出现在大约250的峰值处。如果将检测阈值设置为该值的一半左右(125),则检测发生(平方根值大于125 )大约在索引1450处开始播放-450个样本。
此阈值(125)在其他情况下也不会导致检测(无论如何,对于此运行),但是该输出的最大值为115.24,我们在没有错误检测的情况下不能过多地降低阈值。
将阈值降低到116将导致在实际情况下(对于此运行)在索引1401处进行检测...但是我们冒着更多错误警报的风险。