四元数 FFT 在 C++ 中使用一维 FFT
Quaternion FFT using 1D FFT in C++
我目前正在执行在 C++ 中使用四元数 FFT 的研究论文。
但是,我找不到任何支持四元数 FFT 的 C++ 库。
经过一些调查,我发现网上有人说可以将四元数FFT过程转换为几个一维复数到复数FFT。
有人知道怎么做吗?
我尝试使用支持一些基本 FFT 方法的 FFTW++ 库来实现它。
如果有人能提供帮助,我将不胜感激。
感谢 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
}
}
}
我目前正在执行在 C++ 中使用四元数 FFT 的研究论文。 但是,我找不到任何支持四元数 FFT 的 C++ 库。 经过一些调查,我发现网上有人说可以将四元数FFT过程转换为几个一维复数到复数FFT。 有人知道怎么做吗?
我尝试使用支持一些基本 FFT 方法的 FFTW++ 库来实现它。 如果有人能提供帮助,我将不胜感激。
感谢 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
}
}
}