2016-05-14 17 views
0

Ich bin derzeit Forschungspapier implementiert, die eine Quaternion FFT in C++ verwenden. Ich konnte jedoch keine C++ - Bibliothek finden, die Quaternion FFT unterstützt. Nach einigen Umfragen habe ich jemanden im Internet gefunden, der sagte, dass es möglich ist, Quaternion FFT-Prozess in mehrere 1D-Komplex-zu-Komplex-FFT umzuwandeln. Weiß jemand, wie man das macht?Quaternion FFT mit 1D FFT in C++

Ich versuche, FFTW++ Bibliothek zu verwenden, die einige grundlegende FFT-Methoden unterstützt, um es zu implementieren. Ich wäre wirklich dankbar, wenn jemand helfen könnte.

+0

Sie https://pdfs.semanticscholar.org/538b/5693982ecdd35623ede66cf767a5f06163f8.pdf gelesen haben? –

+0

Nein, vielen Dank für Ihre Informationen. Das hilft mir sehr! – wlee

+0

für was könnte es verwendet werden? – xakepp35

Antwort

-1

Dank Severins Hilfe folge ich endlich der in this paper erwähnten Anweisung, die Quaternion-FFT in zwei Komplexe-zu-Komplex-2D-FFTs zu trennen und das in der Arbeit gezeigte Ergebnis erfolgreich zu reproduzieren.

Etwas wie folgt aus: (Bitte sagen Sie mir, wenn ich falsch bin :))

#include <Array.h> 
#include <fftw++.h> 

using namespace std; 
using namespace utils; 
using namespace Array; 
using namespace fftwpp; 

void SaliencyMapHandler::quaternionFourierTransform(int dim1, int dim2, double* d1, double* d2, double* d3, double* d4) { 
    // dim1 is the 1-st dimension of data, dim2 is the 2-nd dimension of data 
    fftw::maxthreads = get_max_threads(); 
    size_t align = sizeof(Complex); 

    array2<Complex> f1(dim1, dim2, align); 
    array2<Complex> f2(dim1, dim2, align); 

    fft2d forward_1(-1, f1); 
    fft2d backward_1(1, f1); 
    fft2d forward_2(-1, f2); 
    fft2d backward_2(1, f2); 

    for(int j=0; j<dim1; j++) { 
     for(int i=0; i<dim2; i++) { 
      f1(i,j) = Complex(d1[j*dim2 + i], d2[j*dim2 + i]); 
      f2(i,j) = Complex(d3[j*dim2 + i], d4[j*dim2 + i]); 
     } 
    } 

    forward_1.fft(f1); 
    forward_2.fft(f2); 

    // Do something on frequency domain 

    backward_1.fftNormalized(f1); 
    backward_2.fftNormalized(f2); 

    for(int j=0; j<dim1; j++) { 
     for(int i=0; i<dim2; i++) { 
      double p1 = real(f1(i,j)); 
      double p2 = imag(f1(i,j)); 
      double p3 = real(f2(i,j)); 
      double p4 = imag(f2(i,j)); 

      // Do something after inverse transform 
     } 
    } 
}