Как правильно использовать kissFFT с вектором C ++?

Я почти уверен, что это должно быть задокументировано где-то, но я не смог найти. Следовательно, я думаю, что я, возможно, неправильно понимаю API kissFFT.

Я просто хочу использовать kissFFT в проекте C ++ с stl :: vector для простой обработки сигнала произвольной длины. Для достижения этого я отредактировал этот так ответ от автора kissFFT. Я заменил

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]);

Кажется, это работает очень хорошо, но это правильный способ сделать это? В папке «test» на kissFFT, если найден «testcpp.cc», который, кажется, использует некоторые необычные возможности шаблонов C ++ — к сожалению, мне нравится. Я не мог сделать это скомпилировать. Есть ли у моего решения недостатки?


Это полный код. Может быть, это поможет другим

#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;
}

0

Решение

Я склонен использовать std::vector<kiss_fft_cpx> я, но в остальном мой код почти такой же, как ваш. (Что ж, kiss_fft_alloc а также kiss_fft_free зайдите в ctor / dtor, чтобы избежать утечек памяти, но это стиль.)

Чуть дальше вниз, fx[k] * conj(fx[k]) это типичное математическое выражение. Более эффективно использовать fx[k].norm(),

1

Другие решения


По вопросам рекламы [email protected]