구차니 2023. 6. 15. 12:28

자세한 설명이 없어서 대충 혼돈의 카오스중..

pffft_transform()이 가장 처음 접하는 함수이긴 한데 이걸로 하니 1Hz가 아니라 4Hz에 진동이 있는걸로 검출이 되서

pffft_transform_ordered()로 바꾸니 의도한 대로 분석이 되서 일단 쓰는데, 무슨 차이인진 모르겠다.

 

int n = 32000;
int nc = ( n / 2 ) + 1;

int Nfloat = n;
int Nbytes = Nfloat * sizeof(float);

float *X = pffft_aligned_malloc(Nbytes);
float *Y = pffft_aligned_malloc(Nbytes);
float *Z = pffft_aligned_malloc(Nbytes);

PFFFT_Setup *s = pffft_new_setup(n, PFFFT_REAL);

for(int i = 0; i < 8; i++)
    pffft_transform_ordered(s, X, Z, 0, PFFFT_FORWARD);
for ( i = 0; i < nc; i++ )
    printf ( "  %3d,%12f,%12f,%12f,%12f,%12f\n", i, Z[i*2], Z[i*2+1],  
        sqrt(Z[i*2] * Z[i*2] +  Z[i*2+1] * Z[i*2+1]),
        atan2(Z[i*2+1], Z[i*2]),
        atan2(Z[i*2+1], Z[i*2]) * 180 / PI
    );

pffft_aligned_free(Z);
pffft_aligned_free(Y);
pffft_aligned_free(X);
pffft_destroy_setup(s);

[링크 : https://bitbucket.org/jpommier/pffft/src/master/]

 

성능비교 테스트. pffft가  double을 미지원하는 것을 제외하면 최소 4배는 빠르게 처리한다고 보면 될 듯.

(complex는 double이 되긴 한데 real은 float만 되는 듯?)

fftw
2023-06-15 02:40:48.089
2023-06-15 02:40:48.109 --- plan 생성 20ms
2023-06-15 02:40:48.133 --- 32k 8ch 연산 23~24ms

pffft
2023-06-15 02:40:48.136
2023-06-15 02:40:48.139 --- plan 생성 3ms
2023-06-15 02:40:48.146 --- 32k 8ch 연산 6~7ms