【问题标题】:Goertzel algorithm to get the phase?Goertzel算法得到相位?
【发布时间】:2012-11-21 08:54:45
【问题描述】:

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

【问题讨论】:

  • 我无法理解最后两个结果,rRrI。参考Wikipedia article,它们是等式中数量 y(N) 的实部和虚部吗? 11 点?
  • "Phase" 没有意义,除非你指定一个阶段 relative 到某个东西,例如到某个其他信号或某个绝对时间点。如果您在此处解释您真正想要实现的目标,将会有所帮助?
  • @PaulR ,在那个论坛上,我想没有人知道 dsp- 像你一样,所以,找到一个生活,不要在没有基本了解我的问题的情况下跳,如果你发现那作为重复,你为什么不回答原来的问题?

标签: algorithm signal-processing


【解决方案1】:

进行矩形到极坐标的转换。这将为您提供相位和幅度。

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

相位 = atan2 (Vimag, Vreal)

【讨论】:

    【解决方案2】:

    我不认为该算法包括将序列乘以常数,而是乘以复信号 exp(n*i*2pi*freq/samplerate); 0幂信号)。

    由于复数输出为 R*exp(i theta),R 给出了给定频率的功率,而 theta 给出了相位。 (theta == atan2 (imag, real))

    【讨论】:

    • 相对于 what 的相位?在这种情况下,这将是完全武断且毫无意义的。
    • @PaulR 阶段不必与某事相关,如果您执行 bpsk ,则该阶段与前一个阶段相关。希望你能理解。
    • Goertzel 算法的诀窍在于它不需要通过 exp(nfreq/samplerate) 进行许多复杂的乘法运算,而是使用实数运算数字。算法是正确的。这个问题只需要正确解释输出。
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,所以如果我给它 50 个样本,我会得到一个很好的 1700hz 的 bw,问题是,50 很多,我可能会错过很多,除非我在我的所有样本而不是每 50 个样本 - 这使得 Goerzel 不如 FFT 好,对吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多