格策尔算法得到的相位?(Goertzel algorithm to get the phase?)

2019-08-03 01:16发布

我使用Goertzel算法来获得一定频率的幅度。 现在我想从它那里得到的阶段,我不知道怎么办。

一些人能够解释,并告诉我如何从这个代码一定-f的阶段?

另外,我用它来16kHz的,与采样率44.1。 那是什么我可以运行它的样品的最小长度是多少?

double AlgorithmGoertzel( int16_t *sample,int sampleRate, double Freq, int len )
{
    double realW = 2.0 * cos(2.0 * M_PI * Freq / sampleRate);
    double imagW = 2.0 * sin(2.0 * M_PI * Freq / sampleRate);
    double d1 = 0;
    double d2 = 0;
    double y;
    for (int i = 0; i < len; i++) {
        y=(double)(signed short)sample[i] +realW * d1 - d2;
        d2 = d1;
        d1 = y;
    }
    double rR = 0.5 * realW *d1-d2;
    double rI = 0.5 * imagW *d1-d2;

    return (sqrt(pow(rR, 2)+pow(rI,2)))/len;
}

Answer 1:

我不认为该算法包括用一常数序列乘以的,而是由复信号exp(n*i*2pi*freq/samplerate); 0 <= N <=长度,并获得平均幅度(或功率的信号)。

为一体的复合输出是R * EXP(I THETA)中,R给出了功率在给定的频率和θ给出了相。 (THETA == ATAN2(IMAG,真))



Answer 2:

做一个矩形到极坐标转换。 这会给你的相位和幅度。

大小= SQRT((Vreal * Vreal)+(Vimag * Vimag))

相位= ATAN2(Vimag,Vreal)



Answer 3:

样本的数量,你需要养活戈泽尔过滤器将是成反比您的期望或要求滤波器带宽。 戈泽尔提供的Sinc形带通滤波器,与主波瓣宽度正比于2 * Fs的/ N。

如果你使用一个复杂的Goertzel,所产生的相位将相对于过滤器的数据窗口中的一些点。 因此,您可能要计算偏移量来获得相对于一些其他时间参考点的阶段。



文章来源: Goertzel algorithm to get the phase?