/***************************************************************** fftfunc.c fft利用のための関数群(fftcore.cより抜粋) copyright (c) Mar2002 Toshihumi Kosaka Ver 1.00 10June2002 *****************************************************************/ #include #include #include #include "fftfunc.h" static void *getmemory(size_t size); static double *sintable; static double *costable; static int *bitrev; static void *getmemory(size_t size) { char *error="memory not available\n"; void *ptr; ptr=malloc(size); if (ptr==NULL) { fprintf(stderr,error); exit(1); } return ptr; } void real2cmp(double r[],dcomplex_t c[],int size) { int i; for (i=0;i>1; for (i = 1; i>1; unit=1<<(l-1); omg=0; for (ip=0;ip0) wi=-wi; for (i=ip;i>1; j=0; for (i=1;i>=1; } j+=k; bitrev[i]=j; } bitrev[0]=0; bitrev[fftsize-1]=fftsize-1; staticsize=fftsize; } void postfft(void) { free(sintable); free(costable); free(bitrev); } void calcPowerspectrum(double timedomain[],int size,long int samplingfrequency,powerspec_t powerspec[]) /* 与えられた時間領域データからパワースペクトルを計算する 入力 double timedomain[]:時間領域データ int size:時間領域のデータ数 long int samplingfrequency:サンプリング周波数 出力 powerspec_t powerspec[]:パワースペクトル格納領域,サイズはsize/2+1でよい 利用上の注意 sizeは2のべき乗の値であること。128,256,512,1024,2048,4096 すべての領域は呼び出し側で用意すること */ { int msize=size; int check=~1; dcomplex_t *work; double *power; int i; if (size==0) return; while (msize&check) { msize&=check; check<<=1; } initfft(msize); work=(dcomplex_t *)getmemory(msize*sizeof(dcomplex_t)); power=(double *)getmemory((msize/2+1)*sizeof(double)); real2cmp(timedomain,work,msize); fft(1,work,msize); makepower(work,power,msize/2+1,-1); for (i=0;i