2011-03-09 5 views
6

간단한 테스트 프로그램을 작성하여 복잡한 FT로 복소수를 수행하고 방금 데이터 1.50을 생성하고 배열의 각 인덱스에 대해 실수 및 허수 분량을 처리했습니다. 나는이 IFFT (FFT (A))와 같은 작업이 그들을 밖으로 테스트하는CUFFT의 스케일링 팩터

= 수행 할 때

, 나는 각 라이브러리에 대한 다른 결과를 얻고있다.

FFTW 2 (I이 앞으로 다음 CUFFT으로 FFT를 반전하고, 그러나 일본어

다시 얻을 렌 (A)에 의한 출력을 분할해야 I는 (SQRT으로 나눌 것 같습니다) * 50)를 눌러 원래 데이터로 되돌립니다.

이 여분의 제곱근 요소는 어디에서 오는가?

CUFFT 문서에 따라 : CUFFT는 정규화되지 않은 FFT를 수행합니다. 즉, 결과 집합에 대해 역 FFT를 수행 한 다음 입력 데이터 세트에 대해 앞으로 FFT를 수행하면 요소 수만큼 스케일 된 입력과 동일한 데이터가 생성됩니다. 데이터 세트의 크기의 역수로 변환을 확장하면 사용자가보기에 적합하게 수행 할 수 있습니다.

+0

은 1D FFT 기능입니까? – fabrizioM

+0

수행중인 변환에 대해 언급 할 수 있습니까? sqrt (2)는 이름을 즉시 이해합니다. –

+0

맞지 않을 것입니다. CUDA 문서는 명시 적으로 배열의 길이에 따라 크기가 조정되어야한다고 말합니다. 길이를 정확히 계산 하시겠습니까? – Mikola

답변

0

이것은 결국 복소수의 절대 값이 계산되는 방식에 문제가되었습니다. std :: complex 라이브러리에서 벡터의 거리를 계산했습니다.

6

CUFFT이 FFTW와 같은 동작을 가지고 사전에

덕분에, 그것은 표준화의 FFT를 계산합니다. IFFT(FFT(A))=n A 여기서 n은 벡터의 길이입니다. 길이 n은 샘플 수 (실수 또는 바이트가 아님)입니다. 간단한 비교를 망칠 수있는 C2R과 R2C가있는 FFTW와 CUFFT 사이에는 약간의 패딩 차이가 있지만 C2C에는 차이가 없습니다. 데이터 설정 및 길이 계산을 다시 한 번 확인하고 FFTW 및 CUFFT에서 계획을 확인합니다.