2016-05-14 44 views
0

我目前在C++中实现了使用四元数FFT的研究论文。 但是,我找不到任何支持四元数FFT的C++库。 经过一些调查后,我发现互联网上有人表示可以将四元数FFT过程转换为几个1D复数到复数的FFT。 有谁知道该怎么做?在C++中使用一维FFT的四元数FFT

我尝试使用FFTW++库,它支持一些基本的FFT方法来实现它。 如果有人能帮忙,我会很感激。

+0

你看过https://pdfs.semanticscholar.org/538b/5693982ecdd35623ede66cf767a5f06163f8.pdf? –

+0

不,谢谢你的信息。这对我很有帮助! – wlee

+0

它可以用于什么? – xakepp35

回答

-1

感谢Severin的帮助,我最终按照this paper中提到的说明将四元数FFT分离为两个复数到复数的二维FFT,并成功地重现了文中所显示的结果。

事情是这样的:(请告诉我,如果我错了:))

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