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 に答える