जैसा कि हम टिप्पणियों में चर्चा कर रहे हैं, Goertzel एल्गोरिथ्म शोर में एक स्वर का पता लगाने का सामान्य तरीका है। चर्चा के बाद, मुझे यकीन नहीं है कि आप काफी बाद में हैं (आपको शुरुआत का समय चाहिए) ), लेकिन इस बात को लेकर भ्रम की स्थिति थी कि गोर्टज़ेल एल्गोरिथ्म आपकी समस्या पर कैसे लागू हो सकता है, इसलिए मैंने सोचा कि मैं इसे लिखूंगा। यहाँ।
Goertzel एल्गोरिथम
चजी ), और यदि आप शोर स्तर का एक उचित विचार इतना है कि आप एक उपयुक्त पता लगाने सीमा का चयन कर सकते हैं।
Goertzel एल्गोरिथ्म को हमेशा एक FFT बिन के आउटपुट की गणना के रूप में सोचा जा सकता है:
y( n ) = ईȷ 2 πचजीnΣके = ०nx ( n ) ई- ȷ 2 πचजीक
कहाँ पे चजी वह आवृत्ति है जिसकी आप तलाश कर रहे हैं।
विकिपीडिया पृष्ठ के पास इसकी गणना करने का एक बेहतर तरीका है।
इसे लागू करने के लिए यहां एक शुल्क (शुल्क) सिलाब का प्रयास है:
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
के साथ संकेत पर विचार करें च= 0.0239074 तथा ϕ = 4.4318752 :
x = पाप( २ π)चn + φ ) + ε ( एन )
कहाँ पे ϵ ( n ) is zero-mean, unit variance Gaussian white noise.
In this example, the tone starts one third of the way into the signal at index 1001.
If we run the Goertzel algorithm on it with fg=f−0.001 then we get the top two traces of the figure.
If we run the Goertzel algorithm on it with fg=f then we get the bottom two traces of the figure.
The four traces are:
- x (blue) and y (red) for fg=0.0229074
- The resulting resultr2+resulti2−−−−−−−−−−−−−−−√
- x (blue) and y (red) for fg=0.0239074
- The resulting resultr2+resulti2−−−−−−−−−−−−−−−√ (solid line) and the first result (dashed line).
As you can see, the case where the tone we are interested in is present peaks at about 250. If we set the detection threshold at about half this value (125), then the detection occurs (the square-rooted value is greater than 125) at about index 1450 --- 450 samples after the tone started.
This threshold (125) will not cause a detection in the other case (for this run, anyway), but the maximum value of that output is 115.24, we we cannot reduce the threshold too much without getting a false detection.
Reducing the threshold to 116 will cause detection in the true case (for this run) at index 1401... but we run the risk of more false alarms.