2014-03-06 1 views
4

나는 armadillo C++ 라이브러리가 행렬 계산에 매우 편리하다는 것을 알았습니다. FFTW 라이브러리를 사용하여 아르마딜로 행렬에 대해 어떻게 2 차원 FFT를 수행합니까?컬럼 주요 사각형 매트릭스 (armadillo 라이브러리)와 함께 fftw 사용

나는 armadillo 매트릭스 클래스가 데이터를 열 주요 순서로 저장한다는 것을 알고 있습니다. 이것을 FFTW에 어떻게 전달합니까? fftw 3.3.3 설명서에 나온 내용

배열이 열 순서로 저장되어 있고 FFTW를 사용하여 변환하려는 경우 매우 쉽게 수행 할 수 있습니다. 계획을 작성할 때 단순히 배열의 치수를 역순으로 계획자에게 전달하십시오. 예를 들어, 배열이 열 주요 순서로 N × M × L 행렬 3 열이면 배열의 치수를 L x M x N 행렬 인 것처럼 전달해야합니다. FFTW)

계획 수립을위한 구문이 다음과 같이 주어진다면 이것이 무엇을 의미하는지 완전히 이해할 수 없습니다.

fftw_plan fftw_plan_dft_2d(int n0, int n1, 
          fftw_complex *in, fftw_complex *out, 
          int sign, unsigned flags); 

누군가 설명 할 수 있습니까?

답변

5

그것은 당신이 모두

fftw_plan plan=fftw_plan_dft_2d(4, 2,(double(*)[2])&AAA(0,0), (double(*)[2])&BBB(0,0), FFTW_FORWARD, FFTW_ESTIMATE); 

fftw_plan plan=fftw_plan_dft_2d(2, 4,(double(*)[2])&AAA(0,0), (double(*)[2])&BBB(0,0), FFTW_FORWARD, FFTW_ESTIMATE); 

을 시도하고 올바른 순서를 유지할 수 있다는 것을 의미한다.

일반적으로 inout은 할당 된 메모리를 유지하기 위해 fftw_malloc()에 의해 할당됩니다. 약간의 테스트 결과 Armadillo의 cx_mat 매트릭스 (이미 끔찍한 세분화 오류나 잘못된 값 ...)가있는 것으로 나타났습니다.

#include <iostream> 
#include <fftw3.h> 
#include "armadillo" 

using namespace arma; 
using namespace std; 


int main(int argc, char** argv) 
{ 
    cout << "Armadillo version: " << arma_version::as_string() << endl; 


    cx_mat AAA = eye<cx_mat>(2,4); 
    AAA(0,0)=0; 
    AAA(0,1)=1; 
    AAA(0,2)=2; 
    AAA(0,3)=3; 

    AAA(1,0)=0; 
    AAA(1,1)=1; 
    AAA(1,2)=2; 
    AAA(1,3)=3; 


    cx_mat BBB = eye<cx_mat>(2,4); 

    fftw_plan plan=fftw_plan_dft_2d(4, 2,(double(*)[2])&AAA(0,0), (double(*)[2])&BBB(0,0), FFTW_FORWARD, FFTW_ESTIMATE); 

    fftw_execute(plan); 

    BBB.print("BBB:"); 
    return 0; 
} 

g++ -O2 -o example1 example1.cpp -larmadillo -llapack -lblas -lfftw3 함께 컴파일

다음은 테스트 코드 (그리고 올바른 순서 ...)입니다!

안녕,

프랜시스 메모리가 제대로 정렬되지 않은 경우 FFTW3도 정확한 결과를 얻을 수 있음을

+1

주 - 그냥 속도가 느려질 수 있습니다. http://www.fftw.org/fftw3_doc/SIMD-alignment-and-fftw_005fmalloc.html#SIMD-alignment-and-fftw_005fmalloc을 참조하십시오. – rerx

관련 문제