void __ogg_fdcosqi(int n, float *wsave, int *ifac){ static float pih = 1.57079632679489661923132169163975; static int k; static float fk, dt; dt=pih/n; fk=0.; for (k=0;k<n;k++){ fk+=1.; wsave[k] = cos(fk*dt); } __ogg_fdrffti(n, wsave+n,ifac); }
/** * Prepares the arrays to be of length n. */ void FastFourierTransformer::reserve(int n) { Q_ASSERT(n>0); if (m_waveFloat != 0) { delete [] m_waveFloat; } if (m_workingArray != 0) { delete [] m_workingArray; } if (m_ifac != 0) { delete [] m_ifac; } m_workingArray = new float[2*n+15]; m_waveFloat = new float[n]; m_ifac = new int[n]; __ogg_fdrffti(n, m_workingArray, m_ifac); m_last_n = n; }
void DiscreteFourierTransform(int n) { double p_value, upperBound, percentile, N_l, N_o, d, *m, *X, *wsave; int i, count, ifac[15]; if ( ((X = (double*) calloc(n,sizeof(double))) == NULL) || ((wsave = (double *)calloc(2*n,sizeof(double))) == NULL) || ((m = (double*)calloc(n/2+1, sizeof(double))) == NULL) ) { fprintf(stats[7],"\t\tUnable to allocate working arrays for the DFT.\n"); if( X == NULL ) free(X); if( wsave == NULL ) free(wsave); if( m == NULL ) free(m); return; } for ( i=0; i<n; i++ ) X[i] = 2*(int)epsilon[i] - 1; __ogg_fdrffti(n, wsave, ifac); /* INITIALIZE WORK ARRAYS */ __ogg_fdrfftf(n, X, wsave, ifac); /* APPLY FORWARD FFT */ m[0] = sqrt(X[0]*X[0]); /* COMPUTE MAGNITUDE */ for ( i=0; i<n/2; i++ ) m[i+1] = sqrt(pow(X[2*i+1],2)+pow(X[2*i+2],2)); count = 0; /* CONFIDENCE INTERVAL */ upperBound = sqrt(2.995732274*n); for ( i=0; i<n/2; i++ ) if ( m[i] < upperBound ) count++; percentile = (double)count/(n/2)*100; N_l = (double) count; /* number of peaks less than h = sqrt(3*n) */ N_o = (double) 0.95*n/2.0; d = (N_l - N_o)/sqrt(n/4.0*0.95*0.05); p_value = erfc(fabs(d)/sqrt(2.0)); /* printf("\t\t\t\tFFT TEST\n"); printf("\t\t-------------------------------------------\n"); printf("\t\tCOMPUTATIONAL INFORMATION:\n"); printf("\t\t-------------------------------------------\n"); printf("\t\t(a) Percentile = %f\n", percentile); printf("\t\t(b) N_l = %f\n", N_l); printf("\t\t(c) N_o = %f\n", N_o); printf("\t\t(d) d = %f\n", d); printf("\t\ttp_value = %f\n", p_value); printf("\t\tstatus = %s\n", p_value < ALPHA ? "NON RANDOM" : "RANDOM"); printf("\t\t-------------------------------------------\n"); */ fprintf(stats[TEST_FFT], "\t\t\t\tFFT TEST\n"); fprintf(stats[TEST_FFT], "\t\t-------------------------------------------\n"); fprintf(stats[TEST_FFT], "\t\tCOMPUTATIONAL INFORMATION:\n"); fprintf(stats[TEST_FFT], "\t\t-------------------------------------------\n"); fprintf(stats[TEST_FFT], "\t\t(a) Percentile = %f\n", percentile); fprintf(stats[TEST_FFT], "\t\t(b) N_l = %f\n", N_l); fprintf(stats[TEST_FFT], "\t\t(c) N_o = %f\n", N_o); fprintf(stats[TEST_FFT], "\t\t(d) d = %f\n", d); fprintf(stats[TEST_FFT], "\t\t-------------------------------------------\n"); fprintf(stats[TEST_FFT], "%s\t\tp_value = %f\n\n", p_value < ALPHA ? "FAILURE" : "SUCCESS", p_value); fprintf(results[TEST_FFT], "%f\n", p_value); free(X); free(wsave); free(m); }