2

我正在使用 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;
}
4

3 回答 3

3

进行矩形到极坐标的转换。这会给你相位和幅度。

幅度 = sqrt ((Vreal * Vreal) + (Vimag * Vimag))

相位 = atan2 (Vimag, Vreal)

于 2012-11-23T06:03:34.923 回答
2

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

由于复数输出为 R*exp(i theta),因此 R 给出了给定频率的功率,而 theta 给出了相位。(theta == atan2(想象,真实))

于 2012-11-21T09:20:37.137 回答
1

您需要馈送到 Goertzel 滤波器的样本数量将与您想要或要求的滤波器带宽成反比。Goertzel 提供了一个 Sinc 形带通滤波器,其主瓣宽度与 2*Fs/N 成比例。

如果您使用复数 Goertzel,则生成的相位将与滤波器数据窗口中的某个点相关。因此,您可能必须计算偏移量才能获得相对于其他一些参考时间点的相位。

于 2012-11-21T15:06:30.277 回答