2016-10-31 2 views
2

저는 Numerical Recipes와 (결과를 확인하기 위해) Matlab을 사용하여 이산 푸리에 변환을 계산하고 있습니다. 실제 가치만을 가지고 일하기.Numerical Recipes에서 Matlab fft 로의 실제 푸리에 변환 구현을 비교하는 방법은 무엇입니까?

내 MATLAB 코드

in(1)=0.0; 
in(2)=1.0; 
in(3)=2.0; 
in(4)=3.0; 
in(5)=4.0; 
in(6)=5.0; 
in(7)=6.0; 
in(8)=7.0; 

out = fft(in); 

나에게

out = 
28.0000 + 0.0000i 
-4.0000 + 9.6569i 
-4.0000 + 4.0000i 
-4.0000 + 1.6569i 
-4.0000 + 0.0000i 
-4.0000 - 1.6569i 
-4.0000 - 4.0000i 
-4.0000 - 9.6569i 

을 제공 무엇 data 입력 내가 matlab에 같은 출력을 얻기 위해 수치 조리법

void realft(float data[], unsigned long n, int isign){...} 

에 보내야 할 ? 이 NR forum 링크에서

, 내가 입력 realft 요구 한 장소를 이동하는 것을 발견, 그래서 나는 in[0] = 0를 사용하고, 그 결과 입력 N. 요소 수가 1보다 큰

테스트 코드 :

#include <stdio.h> 
#define LEN 8 
int main() 
{ 
    float inout[LEN+1]; 

    inout[0] = 0.0; 
    inout[1] = 0.0; 
    inout[2] = 1.0; 
    inout[3] = 2.0; 
    inout[4] = 3.0; 
    inout[5] = 4.0; 
    inout[6] = 5.0; 
    inout[7] = 6.0; 
    inout[8] = 7.0; 

    realft(inout, LEN, 1); 

    for(unsigned int i=0; i<LEN+1; i=i+1) 
     printf("%15.10f \n",inout[i]); 

    return 0; 
} 
테스트 코드에서

출력은 다음과 유사하지만 matlab에 다른

0.00000000 
28.00000000 
-4.00000000 
-4.00000000 
-9.65685463 
-4.00000000 
-4.00000000 
-4.00000000 
-1.65685427 

.

realft이 (four1 루틴을 사용) 수치 조리법에서 가져온 것입니다 :

+1

어떻게 다릅니 까? 우리에게 [mcve]를 보여주세요. –

+0

수정되었습니다. – Danijel

+0

다시 편집하여 저작권 문제로 인해 코드를 삭제했습니다. – Danijel

답변

4

이미 눈치 챘 오프별로 한 색인 이외의 MATLAB과 수치 조리법 '구현 사이의 차이가 첫 번째 측면, 그리고 그것이 FFT의 약간 다른 정의를 기반으로한다는 것입니다. 더 구체적으로는 Matlab uses a negative complex exponential for the forward transform이며 숫자 조리법에서는 양의 복소 지수를 사용합니다. 따라서 Numerical Recipes의 구현은 Matlab의 복잡한 공액 인 결과를 제공합니다.

다른 점은 이러한 구현은 다른 패킹 순서로 결과를 생성하며 Numerical Recipes의 구현은 스펙트럼의 비 중복 하위 절반 만 출력한다는 것입니다. 그래픽이 매핑은 표현 될 수있는 다음의 그래프 (복잡한 활용에 대한 이전의 시점에 따라 가상 부품의 부호를 변경 한 후) :

enter image description here

+0

정확히 내가 뭘 찾고 있었습니까, 감사합니다 @SleuthEye. – Danijel

+0

Matlab과 동일한 비 복소 공액 결과를 제공하기 위해 NR 알고리즘을 변경하는 것이 간단합니까? – Danijel

+0

숫자 레시피와 FFTW 간의 복잡한 결과가 반대 기호를 갖는 이유를 설명 할 수 있습니까? – benrules2

0

내가 당신이 참조 할 필요가 있다고 생각 realft()의 소스 코드. 이 함수를 사용할 때 잘못된 점이있는 것으로 보입니다. 그 이유는 입력이 실제 값이지만 스펙트럼의 값은 일반적으로 복잡하기 때문입니다. 그러나 프로그램에서 결과는 실제 데이터 형식 인 원본 inout에서 반환되고 허수 부분은 무시됩니다.

0

두 가지 예를 들어, 당신은 다른 입력 (비슷하지만 다르다) 있습니다. MATLAB 예제 들어, 귀하의 입력 0-> 7 포함되어에서 램프했다. 그러나 인덱싱 차이 (다른 사람이 언급 한 것) 때문에 C 구현에서 입력 내용은 0,0,1,2,3,4,5,6이었습니다 (0,1,2,3,4 , 5, 6, 7). C에 matlab을 많이 사용하고 있다면, 배열 색인 (matlab은 1에서 시작하고 C는 0에서 시작)의 차이가 발생합니다.