3

我正在 DSP 处理器上实现 BFSK 实现,目前正在使用 C 在 LINUX 机器上对其进行仿真。我正在研究解调功能,它涉及对传入数据进行 FFT。出于模拟目的,我有一个用于 DFT 的预定义函数,即:

void dft(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;

dft()函数中,参数N表示 DFT 点的数量。

我的疑问是由于该算法还涉及跳频序列,因此在解调信号时,我需要检查信号在不同频率分量的DFT幅度。

在 MATLAB 中,这非常简单,因为 FFT 函数也涉及采样频率,我可以找到任何频率点的功率

powerat_at_freq = floor((freq * fftLength) / Sampling_freq)

但是 C 函数不涉及任何频率,那么如何确定任何特定频率下 DFT 的幅度呢?

4

3 回答 3

3

FFT 表中特定频率的索引计算如下:

int i = round(f / fT*N)

其中f是所需频率,fT是采样频率,N是 FFT 点数。FFT 应该足够细粒度(即 N 应该很大)以覆盖所有频率。如果 FFT 中不存在精确频率,则将使用最接近的频率。有关 FFT 索引与频率的更多信息:

如何获得 FFT 中每个值的频率?

于 2012-06-26T12:49:28.757 回答
1

表示的频率取决于馈入它的数据的采样率(如果是 FFT,则除以长度)。因此,任何 DFT 或 FFT 都可以表示您想要的任何频率,只需以正确的采样率为其提供适量的数据。

于 2012-06-26T17:50:17.643 回答
0

您可以参考在 FFT 应用领域著名且有用的 FFTW 库。

官方网站是:http ://www.fftw.org/

顺便说一句,matlab的FFT函数也是通过FFTW库实现的。

于 2012-06-26T15:44:31.650 回答