使用 FFT 解调 BFSK 跳频信号

信息处理 fft 软件实现 解调
2022-01-29 03:28:50

我对 DSP 技术不是很熟悉,我目前正在从事我的研究项目,使用 C/Linux 开发 DSP 处理器的固件。它涉及使用二进制 FSK 和跳频 Tx 和 Rx 算法对数据集进行调制和解调。我能够调制信号并使用 MATLAB 验证了输出。但是我有点卡在解调上。

我用于解调的技术是比较在每个跳频序列接收到的信号的 FFT 幅度,并在此基础上确定接收到的位是 1 还是 0。我有一个预定义的函数,用于计算 FFT的信号。功能如下:

void fft(complex_float* in, complex_float* out, int N, int inv)
{
int i, j;
float a, f;
complex_float s, w;
f = inv ? 1.0/N : 1.0;
for (i = 0; i < N; i++) {
s.re = 0;
s.im = 0;
for (j = 0; j < N; j++) {
  a = -2*PI*i*j/N;
  if (inv) a = -a;
  w.re = cos(a);
  w.im = sin(a);
  s.re += in[j].re * w.re - in[j].im * w.im;
  s.im += in[j].im * w.re + in[j].re * w.im;
}
out[i].re = s.re*f;
out[i].im = s.im*f;
}
}

complex_float是一个预定义的结构:

typedef struct {
float re;
float im;
}complex_float;

在函数fft() N中定义了 FFT 点的数量。

我面临的问题是如何确定fft()函数返回的数组中各个元素的频点。在 MATLAB 中,这很容易实现 MATLAB 中的 FFT 函数考虑了采样频率并相应地绘制了功率谱。然而,在fft()上面定义的函数中没有涉及频率,因此我对如何找到任何特定频率的信号功率,或者如何确定重新调谐阵列的任何元素的频率点感到困惑。

3个回答

在某些时候,在调用 fft() 函数之前,必须知道采样频率(来自 ADC?或其他重采样函数?)......像在 Matlab 中一样使用它来查找 bin 的频率。

有两种不同类型的跳频 BFSK 系统。

  • 慢速跳频中,中心频率或载波频率以数据速率的一小部分周期性变化。因此,载波频率跳到一个特定的值,比如并在那里停留一段时间(比如 秒,其中比特持续时间是秒。在这个持续时间 秒的时期内,数据比特。那也就是说,频率为秒的持续时间,具体取决于是还是fcf1nTTnTnf1+Δff1ΔfT01正在传输。通常,使得是一个整数。然后,在接下来的秒内传输下一位,以此类推,直到总共传输了位。位之后,载波频率跳到某个其他选择,并使用频率为的音调。Δf(2Δf)TTnnf2f2+Δff2Δf

  • 快速跳频系统中,单个 bis 通过多跳传输,例如跳。为了发送等频率发送的一连串音调当然,如果要传输快速跳频系统因此自动提供频率分集和时间分集。m1T/mf1Δff2Δff3Δf0f1+Δff2+Δff3+Δf

最容易解调跳频的 BFSK 信号;通过首先 将其外差(例如,参见 另一个 stackexchange 站点上的这个答案 )降低到固定的中频 (以便音调在 ,而不管原始传输频率如何。这需要一个与跳跃模式同步的本地可调振荡器,并与模式中的载波频率偏移频率。外差后,可以使用标准 BFSK 接收器,正如 David Rick 在另一个答案中所说,使用 FFT不是fifi+ΔffiΔffi一个特别好的解决问题的方法。使用标准相干或非相干 FSK 接收器会更好。

FFT 对于解调 BFSK 的效率非常低,因为您只使用了 N 个 bin 值中的 2 个,其余的所有数学运算都被浪费了。Goertzel 算法是一种常用的替代方法。