J'ai des problèmes pour exécuter un plan FFT avec la bibliothèque fftw
. Je déclare fftIn
et fftOut
vecteurs avec la taille 2048, et en définissant un fftwf_plan_dft_1d
avec eux.La taille du vecteur de sortie FFTW est incorrecte après l'exécution du plan FFT.
Mais lorsque j'exécute le plan, le vecteur fftOut
se met tout à coup à mal. Dans mon code, je peux voir en déboguant que sa taille va de 2048 à 0. Quand j'ai écrit le petit exemple exécutable ci-dessous, je reçois juste de mauvaises tailles comme 17293858104588369909.
Bien sûr, quand j'essaie d'accéder à la premier élément du vecteur, un SIGSEGV
arrive.
Mon code:
#include <complex>
#include <iostream>
#include <fftw3.h>
#include <vector>
using namespace std;
typedef std::vector<std::complex<float>> fft_vector;
int main() {
const unsigned int VECTOR_SIZE = 2048;
fft_vector* fftIn = new fft_vector(VECTOR_SIZE);
fft_vector* fftOut = new fft_vector(VECTOR_SIZE);
fftwf_plan fftPlan = fftwf_plan_dft_1d(VECTOR_SIZE, reinterpret_cast<fftwf_complex*>(fftIn), reinterpret_cast<fftwf_complex*>(fftOut), FFTW_FORWARD, FFTW_ESTIMATE);
fftwf_execute(fftPlan);
std::cout << fftOut->size() << std::endl;
std::cout << fftOut->at(0).real() << fftOut->at(0).imag() << std::endl;
return 0;
}
Bien sûr, je sais fftIn
vecteur est vide dans cet exemple, mais la sortie est cassée quand il est pas de toute façon. Dans ce cas, le SIGSEGV se passe dans le second cout comme décrit précédemment. Mon code complet a des threads (mais FFT se passe tous dans le même thread, donc les conditions de course ne devraient pas s'appliquer), et c'était une des raisons pour essayer d'isoler le code dans ce petit exemple, juste au cas où, mais il semble avoir quelque chose de mal de toute façon.
Une idée?
Cela devrait fonctionner: http://www.fftw.org/doc/Complex-numbers.html#Complex-numbers Quoi qu'il en soit, je vais essayer le code classique comme vous le suggérez –
@RomanRdgz Oui, il devrait. Le problème principal est que vous passiez le vecteur au lieu du contenu du vecteur. L'utilisation des types et de l'allocation de fftw est une assurance supplémentaire qui vous permet d'obtenir le comportement et la performance que vous voulez en dehors de fftw. Notez également l'utilisation du mot "should" dans ce lien: il peut ne pas être garanti (du moins avec tous les compilateurs sur toutes les plateformes) que le type C++ complexe <> fonctionne. – Andrew
Juste curieux: si possible de le faire avec C++ complexe <>, comment dois-je réécrire le code? Garder fftIn et fftOut comme vecteurs dynamiques, car j'ai besoin que leur taille soit configurable. D'un autre côté, je ne vois pas comment accéder au contenu du vecteur de sortie. (& fftOut [0]). x? –