繁体   English   中英

C中的DFT函数实现

[英]DFT function implementation in C

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

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

int i = round(f / fT*N)

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM