コメントで説明したように、Goertzelアルゴリズムはノイズのトーンを検出する通常の方法です。議論した後、それがあなたが何を求めているかはわかりません(開始時間が必要です)が、Goertzelアルゴリズムがあなたの問題にどのように適用されるかについて混乱があるようでしたので、私はそれを書きたいと思いましたここに。
ゲルツェルアルゴリズム
Goertzelアルゴリズムは、探しているトーンの周波数がわかっている場合(と呼びます)、適切な検出しきい値を選択できるようにノイズレベルについて妥当な考えがある場合に使用するとよいでしょう。fg
Goertzelアルゴリズムは、常に1つのFFTビンの出力を計算するものと考えることができます。
y(n )= eȷ 2 πfgn∑k = 0nx (n )e- ȷ 2 πfgk
ここで、は探している周波数です。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の信号の3分の1から始まります。
Goertzelアルゴリズムを実行すると、図の上の2つのトレースが得られます。fg= f− 0.001
fg= f
4つのトレースは次のとおりです。
- バツyfg= 0.0229074
- R E S U リットルのt R2+ r e s u l t i2−−−−−−−−−−−−−−−√
- バツyfg= 0.0239074
- R E S U リットルのt R2+ r e s u l t i2−−−−−−−−−−−−−−−√
ご覧のとおり、関心のあるトーンは約250にピークがあります。検出しきい値をこの値の約半分(125)に設定すると、検出が行われます(平方根の値は125を超えています) )インデックス1450付近---トーン開始後の450サンプル。
このしきい値(125)は、他のケースでは検出を引き起こしません(とにかくこの実行の場合)が、その出力の最大値は115.24であるため、誤検出を取得せずにしきい値をあまり小さくすることはできません。
しきい値を116に減らすと、インデックス1401で(この実行の場合)真のケースで検出が発生しますが、より多くの誤ったアラームのリスクが発生します。