프로그램 사용/fft, fftw

pffft fft / ifft 테스트

구차니 2024. 8. 1. 14:08

테스트 소스를 수정해서 10개 정도만 출력하고 그 값을 비교하는데 신기한걸 발견함

 

소스로는 non-canonical ordering / canonical ordering 이라고 되어있는데

하나는 pffft_transform+ pffft_zreorders 로 실행하고

다른 하나는 pffft_transform_ordered로 실행한다.

    // pass 0 : non canonical ordering of transform coefficients  
    if (pass == 0) {
      // test forward transform, with different input / output
      pffft_transform(s, in, tmp, 0, PFFFT_FORWARD);
      memcpy(tmp2, tmp, Nbytes);
      memcpy(tmp, in, Nbytes);
      pffft_transform(s, tmp, tmp, 0, PFFFT_FORWARD);
      for (k = 0; k < Nfloat; ++k) {
        assert(tmp2[k] == tmp[k]);
      }

      // test reordering
      pffft_zreorder(s, tmp, out, PFFFT_FORWARD);
      pffft_zreorder(s, out, tmp, PFFFT_BACKWARD);
      for (k = 0; k < Nfloat; ++k) {
        assert(tmp2[k] == tmp[k]);
      }
      pffft_zreorder(s, tmp, out, PFFFT_FORWARD);
    } else {
      // pass 1 : canonical ordering of transform coeffs.
      pffft_transform_ordered(s, in, tmp, 0, PFFFT_FORWARD);
      memcpy(tmp2, tmp, Nbytes);
      memcpy(tmp, in, Nbytes);
      pffft_transform_ordered(s, tmp, tmp, 0, PFFFT_FORWARD);
      for (k = 0; k < Nfloat; ++k) {
        assert(tmp2[k] == tmp[k]);
      }
      memcpy(out, tmp, Nbytes);
    }

 

아무튼 결과만 보면

ifft 값은 동일하게 나온다.(ordered / non-ordered)

그런데 ifft를 수행하고 나서 나온 결과가 raw와 다르다.

 

pffft 특성으로 인해 샘플 숫자로 나눠줘야 한다는데 

[링크 : https://dsp.stackexchange.com/questions/75749/how-to-use-pffft-fft-library]

 

일단은 그렇게 나누면 raw 와 ifft 값은 동일한 형상을 보이지만(좌하단/우하단) scale이 다르고

ifft한 값을 샘플 수 32000로 나누고 원본과 차이를 비교하면 또 형상이 동일하게 나온다(우상단)

 

데이터의 첫번째로 하면 오차율을 더 최소가 되지만 형상이 달라진다.(우상단) 멀까..?