void fft_8() { double aRe[4], aIm[4], bRe[4], bIm[4], gem; aRe[0] = zRe[0]; bRe[0] = zRe[1]; aRe[1] = zRe[2]; bRe[1] = zRe[3]; aRe[2] = zRe[4]; bRe[2] = zRe[5]; aRe[3] = zRe[6]; bRe[3] = zRe[7]; aIm[0] = zIm[0]; bIm[0] = zIm[1]; aIm[1] = zIm[2]; bIm[1] = zIm[3]; aIm[2] = zIm[4]; bIm[2] = zIm[5]; aIm[3] = zIm[6]; bIm[3] = zIm[7]; fft_4(aRe, aIm); fft_4(bRe, bIm); gem = c8*(bRe[1] + bIm[1]); bIm[1] = c8*(bIm[1] - bRe[1]); bRe[1] = gem; gem = bIm[2]; bIm[2] =-bRe[2]; bRe[2] = gem; gem = c8*(bIm[3] - bRe[3]); bIm[3] =-c8*(bRe[3] + bIm[3]); bRe[3] = gem; zRe[0] = aRe[0] + bRe[0]; zRe[4] = aRe[0] - bRe[0]; zRe[1] = aRe[1] + bRe[1]; zRe[5] = aRe[1] - bRe[1]; zRe[2] = aRe[2] + bRe[2]; zRe[6] = aRe[2] - bRe[2]; zRe[3] = aRe[3] + bRe[3]; zRe[7] = aRe[3] - bRe[3]; zIm[0] = aIm[0] + bIm[0]; zIm[4] = aIm[0] - bIm[0]; zIm[1] = aIm[1] + bIm[1]; zIm[5] = aIm[1] - bIm[1]; zIm[2] = aIm[2] + bIm[2]; zIm[6] = aIm[2] - bIm[2]; zIm[3] = aIm[3] + bIm[3]; zIm[7] = aIm[3] - bIm[3]; } /* fft_8 */
void twiddleTransf(int sofarRadix, int radix, int remainRadix, T3 yRe[], T4 yIm[]) { /* twiddleTransf */ double cosw, sinw, gem; initTrig(radix); omega = 2*M_PI/(double)(sofarRadix*radix); cosw = cos(omega); sinw = -sin(omega); tw_re = 1.0; tw_im = 0; dataOffset=0; groupOffset=dataOffset; adr=groupOffset; for (dataNo=0; dataNo<sofarRadix; dataNo++) { if (sofarRadix>1) { twiddleRe[0] = 1.0; twiddleIm[0] = 0.0; twiddleRe[1] = tw_re; twiddleIm[1] = tw_im; for (twNo=2; twNo<radix; twNo++) { twiddleRe[twNo]=tw_re*twiddleRe[twNo-1] - tw_im*twiddleIm[twNo-1]; twiddleIm[twNo]=tw_im*twiddleRe[twNo-1] + tw_re*twiddleIm[twNo-1]; } gem = cosw*tw_re - sinw*tw_im; tw_im = sinw*tw_re + cosw*tw_im; tw_re = gem; } for (groupNo=0; groupNo<remainRadix; groupNo++) { if ((sofarRadix>1) && (dataNo > 0)) { zRe[0]=yRe[adr]; zIm[0]=yIm[adr]; blockNo=1; do { adr = adr + sofarRadix; zRe[blockNo]= twiddleRe[blockNo] * yRe[adr] - twiddleIm[blockNo] * yIm[adr]; zIm[blockNo]= twiddleRe[blockNo] * yIm[adr] + twiddleIm[blockNo] * yRe[adr]; blockNo++; } while (blockNo < radix); } else for (blockNo=0; blockNo<radix; blockNo++) { zRe[blockNo]=yRe[adr]; zIm[blockNo]=yIm[adr]; adr=adr+sofarRadix; } switch(radix) { // T.Grill - replaced the inlined code by their function counterparts case 2 : fft_2(zRe,zIm); break; case 3 : fft_3(zRe,zIm); break; case 4 : fft_4(zRe,zIm); break; case 5 : fft_5(zRe,zIm); break; case 8 : fft_8(); break; case 10 : fft_10(); break; default : fft_odd(radix); break; } adr=groupOffset; for (blockNo=0; blockNo<radix; blockNo++) { yRe[adr]=zRe[blockNo]; yIm[adr]=zIm[blockNo]; adr=adr+sofarRadix; } groupOffset=groupOffset+sofarRadix*radix; adr=groupOffset; } dataOffset=dataOffset+1; groupOffset=dataOffset; adr=groupOffset; } } /* twiddleTransf */