[an error occurred while processing this directive]
|
double Goertzel_algorithm(int *BufXn, int k);
double Goertzel_algorithm(int *BufXn, int k)
{
// n=0,1,2,...,N-1 | n=N
// |
// X Q ----+
// n +---+ n | 2
// --->| + |--------------->--- | X |-->-----------+
// +---+
// | +---+
// v | Q ^
// 2Cos(2*pi*k/N) +---+ | N-1 -2Cos(2*pi*k/N)
// -1 +---->-+
// Z v
// v +---+ | V v |
// +---+ Q | +---+ +---+ +---+ Y
// | | n-1 | | | | k
// +-<--| X |-------<-+--------+ | X |-->-| X |->-| + |->-
// | | | | | |
// +---+ | +---+ +---+ +---+
// v | Q ^ |
// -1 +---+ N-2 ^
// -1 +---->-+
// Z |
// v +---+ | v
// +---+ Q +---+
// | | n-2 2
// +---<--| X |-------<-+--------+ X |-->-----------+
// | |
// +---+ | +---+
double PI=3.1415926535897932384626434;
double coef_k; // Goertzel {- t| k-z u{p|~z pr|uz
double Xn; // H~pu~y ur rt~s ys~p|p
double Qn,Qn_1,Qn_2; // ^|u}u~ xptuw{y t| Goertzel-y|p
double Yk; // Krptp }t
| k-z u{p|~z pr|uz
double Mk; // Mt
| k-z u{p|~z pr|uz
coef_k=2*cos((2*PI*(double)k)/(double)nGoertzelFrSz);
E-mail:
info@telesys.ru
Qn_1=0;
Qn_2=0;
int N=nGoertzelFrSz;
int n;
for(n=0;n
Xn=BufXn[n]*AON_Gain;
if(Xn> (0x7FFF)) Xn= (0x7FFF);
if(Xn<-(0x7FFF)) Xn=-(0x7FFF);
Xn=(double)((int)Xn);
Qn=Xn+Qn_1*coef_k-Qn_2;
Qn_2=Qn_1;
Qn_1=Qn;
}
Yk=Qn_1*Qn_1+Qn_2*Qn_2-coef_k*Qn_1*Qn_2;
// Mk=sqrt(Yk);
if(LOG_flg==1) Yk=10*log10(Yk);
return(Yk);
}
Īņāåņū