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

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

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

fft window type과 진폭 보정계수  (0) 2023.07.04
fft window 함수  (0) 2023.07.03
fft 결과의 amplitude가 0.5가 나오는 이유  (0) 2023.06.13
overlap kissfft  (0) 2023.06.12
fft size overlap window size  (0) 2023.06.12
Posted by 구차니