我正在嵌入式系统上实现具有跳频功能的 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,我已经尝试过)可以用于解调过程。
——安舒