Như chúng ta đã thảo luận trong các ý kiến, thuật toán Goertzel là cách thông thường để phát hiện âm báo trong tiếng ồn. Sau cuộc thảo luận, tôi không chắc chắn đó là những gì bạn đang theo dõi (bạn muốn thời gian khởi động ), nhưng dường như có sự nhầm lẫn về cách thuật toán Goertzel có thể được áp dụng cho vấn đề của bạn, vì vậy tôi nghĩ rằng tôi đã viết nó lên đây.
Thuật toán Goertzel
Thuật toán Goertzel rất tốt để sử dụng nếu bạn biết tần số của âm bạn đang tìm kiếm (gọi nó là ) và nếu bạn có ý tưởng hợp lý về mức độ nhiễu để bạn có thể chọn ngưỡng phát hiện phù hợp.fg
Thuật toán Goertzel có thể được coi là luôn tính toán đầu ra của MỘT thùng FFT:
y( n ) = eȷ 2 πfgnΣk = 0nx ( n ) e- ȷ 2 πfgk
Trong đó là tần số bạn đang tìm kiếm.fg
Trang Wikipedia có một cách tốt hơn để tính toán điều này.
Đây là một nỗ lực (yếu đuối) của Scilab trong việc thực hiện nó:
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
Hãy xem xét các tín hiệu với và φ = 4.4318752 :f= 0,0239074ϕ = 4,4318752
x = tội lỗi( 2 πfn + φ ) + ε ( n )
nơi là zero-mean, đơn vị sai Gaussian tiếng ồn trắng.ϵ ( n )
Trong ví dụ này, âm bắt đầu một phần ba đường vào tín hiệu ở chỉ số 1001.
Nếu chúng ta chạy thuật toán Goertzel trên nó với thì chúng ta sẽ có được hai dấu vết trên cùng của hình.fg= f- 0,001
fg= f
Bốn dấu vết là:
- xyfg= 0,0229074
- r e s u l t r2+ r e s u l t i2---------------√
- xyfg= 0,0239074
- r e s u l t r2+ r e s u l t i2---------------√
Như bạn có thể thấy, trường hợp âm mà chúng ta quan tâm là hiện tại các đỉnh ở khoảng 250. Nếu chúng ta đặt ngưỡng phát hiện ở khoảng một nửa giá trị này (125), thì phát hiện xảy ra (giá trị căn bậc hai lớn hơn 125 ) ở khoảng chỉ số 1450 --- 450 mẫu sau khi giai điệu bắt đầu.
Ngưỡng này (125) sẽ không gây ra phát hiện trong trường hợp khác (dù sao cho lần chạy này), nhưng giá trị tối đa của đầu ra đó là 115,24, chúng ta không thể giảm ngưỡng quá nhiều mà không bị phát hiện sai.
Việc giảm ngưỡng xuống mức 116 sẽ khiến phát hiện trong trường hợp thực (đối với lần chạy này) tại chỉ số 1401 ... nhưng chúng tôi có nguy cơ báo động sai nhiều hơn.