使用 Goertzel 算法对 BFSK 信号进行跳频解调

信息处理 fft 频谱
2022-02-07 07:28:10

我正在嵌入式系统上实现具有跳频功能的 BFSK 算法,并且在我的解调方法中使用 Goertezel 算法。基本上,我使用 goertzel 算法来确定位 0 和 1 在下一个预期频率下的信号功率,并且以更高功率(通常为 10000 的顺序)为接收的位。我在 C 中的算法实现如下:

float goertzel(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, int* modData)
{
int k,i;
float   floatnumSamples;
float   omega,sine,cosine,coeff,q0,q1,q2,result;

floatnumSamples = (float) numSamples;
k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
omega = (2.0 * 3.1416 * k) / floatnumSamples;
sine = sin(omega);
cosine = cos(omega);
coeff = 2.0 * cosine;

q0=0;
q1=0;
q2=0;
result=0;

for(i=0; i<numSamples; i++)
{
    q0 = coeff * q1 - q2 + modData[i];
    q2 = q1;
    q1 = q0;
}

result = sqrtf(q1 * q1 + q2 * q2 - q1 * q2 * coeff);
return result;
}

接收端的数据始终为 32 位整数形式。

问题是我收到的信号是基带信号,带宽从-2KHz扩展到2KHz。因此,一半的跳跃频率位于频谱的负侧,而 Goertzel 算法对于负频率无法正常工作。所以我尝试使用下一组中的频率箱,即(采样频率+跳跃频率),就像在 fft 中一样。但是,我的算法为频率、当前跳跃频率和(采样频率 + 跳跃频率)提供了相同的输出功率。比如我的采样频率是18000,当前跳频是-2000。所以 -2000Hz 和 16000Hz 的功率应该高于 2000Hz,但在我的情况下,2000 和 16000Hz 的功率是相同的,这违背了解调的目的。当我使用 Matlab 中定义的 goertzel 算法时,情况并非如此。

我的 C 实现中是否缺少可以解决此问题的东西?是否有任何其他方法(除了使用 DFT,我已经尝试过)可以用于解调过程。

——安舒

1个回答

伙计们,我真的很抱歉这个愚蠢的问题。只需将频谱的中心频率从 0Hz 移动到某个更高的值(我使用 3000Hz 作为中心频率),然后使用 goertzel 算法在移动频率处计算功率,即可解决问题。我忘记了频谱的两侧性质。