void complex_plan_backward (complex_plan plan, double *data) { if (plan->bluestein) bluestein (plan->length, data, plan->work, 1); else cfftb (plan->length, data, plan->work); }
void real_plan_backward_c (real_plan plan, double *data) { int m; int n=plan->length; if (plan->bluestein) { data[1]=0; for (m=2; m<n; m+=2) { double avg; avg = 0.5*(data[2*n-m]+data[m]); data[2*n-m] = data[m] = avg; avg = 0.5*(data[2*n-m+1]-data[m+1]); data[2*n-m+1] = avg; data[m+1] = -avg; } if ((n&1)==0) data[n+1] = 0.; bluestein (plan->length, data, plan->work, 1); for (m=1; m<2*n; m+=2) data[m]=0; } else { data[1] = data[0]; rfftb (n, data+1, plan->work); for (m=n-1; m>=0; --m) { data[2*m] = data[m+1]; data[2*m+1] = 0.; } } }
int fftLite::fft(double *realIO, double *imagIO) { if (N == 0) return -1; if (M == 0 /*(N & (N - 1)) == 0*/) return radix2(realIO, imagIO); else // non-power-of-two length return bluestein(realIO, imagIO); }
void real_plan_forward_fftpack (real_plan plan, double *data) { if (plan->bluestein) { size_t m; size_t n=plan->length; double *tmp = RALLOC(double,2*n); for (m=0; m<n; ++m) { tmp[2*m] = data[m]; tmp[2*m+1] = 0.; } bluestein(n,tmp,plan->work,-1); data[0] = tmp[0]; memcpy (data+1, tmp+2, (n-1)*sizeof(double)); DEALLOC(tmp); }
void real_plan_forward_fftpack (real_plan plan, double *data) { if (plan->bluestein) { int m; int n=plan->length; double *tmp = (double *)malloc(2*n*sizeof(double)); for (m=0; m<n; ++m) { tmp[2*m] = data[m]; tmp[2*m+1] = 0.; } bluestein(n,tmp,plan->work,-1); data[0] = tmp[0]; memcpy (data+1, tmp+2, (n-1)*sizeof(double)); free (tmp); } else rfftf (plan->length, data, plan->work); }
void real_plan_forward_c (real_plan plan, double *data) { int m; int n=plan->length; if (plan->bluestein) { for (m=1; m<2*n; m+=2) data[m]=0; bluestein (plan->length, data, plan->work, -1); data[1]=0; for (m=2; m<n; m+=2) { double avg; avg = 0.5*(data[2*n-m]+data[m]); data[2*n-m] = data[m] = avg; avg = 0.5*(data[2*n-m+1]-data[m+1]); data[2*n-m+1] = avg; data[m+1] = -avg; } if ((n&1)==0) data[n+1] = 0.; } else { for (m=0; m<n; ++m) data[m+1] = data[2*m]; rfftf (n, data+1, plan->work); data[0] = data[1]; data[1] = 0; for (m=2; m<n; m+=2) { data[2*n-m] = data[m]; data[2*n-m+1] = -data[m+1]; } if ((n&1)==0) data[n+1] = 0.; } }
void real_plan_backward_fftpack (real_plan plan, double *data) { if (plan->bluestein) { int m; int n=plan->length; double *tmp = (double *)malloc(2*n*sizeof(double)); tmp[0]=data[0]; tmp[1]=0.; memcpy (tmp+2,data+1, (n-1)*sizeof(double)); if ((n&1)==0) tmp[n+1]=0.; for (m=2; m<n; m+=2) { tmp[2*n-m]=tmp[m]; tmp[2*n-m+1]=-tmp[m+1]; } bluestein (n, tmp, plan->work, 1); for (m=0; m<n; ++m) data[m] = tmp[2*m]; free (tmp); } else rfftb (plan->length, data, plan->work); }