c++ - 四元数 FFT 在 C++ 中使用一维 FFT

标签 c++ fft quaternions fftw

我目前正在执行在 C++ 中使用四元数 FFT 的研究论文。 但是,我找不到任何支持四元数 FFT 的 C++ 库。 经过一些调查,我发现网上有人说可以将四元数FFT过程转换为几个一维复数到复数FFT。 有人知道怎么做吗?

我尝试使用 FFTW++库,它支持一些基本的 FFT 方法来实现它。 如果有人能提供帮助,我将不胜感激。

最佳答案

感谢Severin的帮助,我终于按照this paper中提到的说明进行了操作将四元数 FFT 分离为两个复数到复数 2D 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
        }
    }
}

关于c++ - 四元数 FFT 在 C++ 中使用一维 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37229176/

相关文章:

c++ - 覆盖矩阵中 vector 对象的代理类中的赋值运算符?

c# - 有没有办法使用 Quaternion.FromToRotation 来支持使用一个轴?

c - 四元数 "lookAt"函数

c++ - `for_each_arg` 的正确用法 - 转发过多?

c++ - Windows 中的非主 GUI 线程究竟何时退出?

matlab - Matlab 中基于傅里叶的字符识别

c++ - 有没有关于如何使用英特尔 MKL FFT 的简单 C++ 示例?

c++ - 预测 FFT 的拖尾

Java代码从四元数获取绕轴的旋转角度

c++ - 在 C++ 中递归地查找 vector 中的最大值