C中的DFT函数实现

时间:2012-06-26 12:35:33

标签: c fft

我正在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幅度?

3 个答案:

答案 0 :(得分:3)

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

int i = round(f / fT*N)

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

How do I obtain the frequencies of each value in an FFT?

答案 1 :(得分:1)

表示的频率取决于馈送到它的数据的采样率(除以FFT的长度)。因此,任何DFT或FFT都可以通过以正确的采样率为其提供适量的数据来表示您想要的任何频率。

答案 2 :(得分:0)

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

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

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