0

std::vector任意の長さの信号を簡単に処理するために、C++ プロジェクトで kissFFT を使用したいと考えています。これを達成するために、kissFFTの作成者からのこのSO回答を編集しました。交換しました

std::complex<float> x[nfft];

vector<std::complex<float>> x(nfft, 0.0);

関数呼び出しを置き換えました

kiss_fft(fwd,(kiss_fft_cpx*)x,(kiss_fft_cpx*)fx)

kiss_fft(fwd,(kiss_fft_cpx*)&x[0],(kiss_fft_cpx*)&fx[0]);

これはかなりうまくいくようですが、これは正しい方法ですか?kissFFT の "test" フォルダに、凝った C++ テンプレート機能を使用しているように見える "testcpp.cc" を見つけました (残念ながら、私には凝りすぎて、コンパイルできませんでした)。私のソリューションには欠点がありますか?


完全なコード

#include "kiss_fft.h"
#include <complex>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    const int nfft=256;
    kiss_fft_cfg fwd = kiss_fft_alloc(nfft,0,NULL,NULL);
    kiss_fft_cfg inv = kiss_fft_alloc(nfft,1,NULL,NULL);

    vector<std::complex<float>> x(nfft, 0.0);
    vector<std::complex<float>> fx(nfft, 0.0);

    x[0] = 1;
    x[1] = std::complex<float>(0,3);

    kiss_fft(fwd,(kiss_fft_cpx*)&x[0],(kiss_fft_cpx*)&fx[0]);
    for (int k=0;k<nfft;++k) {
        fx[k] = fx[k] * conj(fx[k]);
        fx[k] *= 1./nfft;
    }
    kiss_fft(inv,(kiss_fft_cpx*)&fx[0],(kiss_fft_cpx*)&x[0]);
    cout << "the circular correlation of [1, 3i, 0 0 ....] with itself = ";
    cout
        << x[0] << ","
        << x[1] << ","
        << x[2] << ","
        << x[3] << " ... " << endl;
    kiss_fft_free(fwd);
    kiss_fft_free(inv);
    return 0;
}
4

1 に答える 1

1

私は自分自身を使用する傾向がありますstd::vector<kiss_fft_cpx>が、それ以外は私のコードはあなたのものとほとんど同じです. (まあ、メモリ リークkiss_fft_allockiss_fft_free避けるために ctor/dtor に入りますが、それはスタイルの問題です。)

少し下にfx[k] * conj(fx[k])あるのは、典型的な数式です。を使った方が効率的fx[k].norm()です。

于 2015-09-07T23:14:28.853 に答える