void RealInverseRealFFT(int NumSamples, float *In, float *Out){ // Remap to RealFFTf() function int i; HFFT hFFT = GetFFT(NumSamples); float *pFFT = new float[NumSamples]; // Copy the data into the processing buffer pFFT[0] = In[0]; for(i=1; i<NumSamples/2; i++){ pFFT[i] = In[i]; pFFT[NumSamples - i] = In[i]; } pFFT[NumSamples/2] = In[NumSamples/2]; // Perform the FFT RealFFTf(pFFT, hFFT); // Copy the data into the output for(i=1;i<NumSamples/2;i++) { Out[i]=pFFT[hFFT->BitReversed[i]]; } // Handle the (real-only) DC Out[0] = pFFT[0]; delete [] pFFT; ReleaseFFT(hFFT); }
/* * Real Fast Fourier Transform * */ void RealFFT(int NumSamples, float *RealIn, float *RealOut, float *ImagOut) { // Remap to RealFFTf() function int i; HFFT hFFT = GetFFT(NumSamples); float *pFFT = new float[NumSamples]; // Copy the data into the processing buffer for(i=0; i<NumSamples; i++) pFFT[i] = RealIn[i]; // Perform the FFT RealFFTf(pFFT, hFFT); // Copy the data into the real and imaginary outputs for(i=1;i<(NumSamples/2);i++) { RealOut[i]=pFFT[hFFT->BitReversed[i] ]; ImagOut[i]=pFFT[hFFT->BitReversed[i]+1]; } // Handle the (real-only) DC and Fs/2 bins RealOut[0] = pFFT[0]; RealOut[i] = pFFT[1]; ImagOut[0] = ImagOut[i] = 0; // Fill in the upper half using symmetry properties for(i++ ; i<NumSamples; i++) { RealOut[i] = RealOut[NumSamples-i]; ImagOut[i] = -ImagOut[NumSamples-i]; } delete [] pFFT; ReleaseFFT(hFFT); }
void RealFFT(size_t NumSamples, const float *RealIn, float *RealOut, float *ImagOut) { auto hFFT = GetFFT(NumSamples); Floats pFFT{ NumSamples }; // Copy the data into the processing buffer for(size_t i = 0; i < NumSamples; i++) pFFT[i] = RealIn[i]; // Perform the FFT RealFFTf(pFFT.get(), hFFT.get()); // Copy the data into the real and imaginary outputs for (size_t i = 1; i<(NumSamples / 2); i++) { RealOut[i]=pFFT[hFFT->BitReversed[i] ]; ImagOut[i]=pFFT[hFFT->BitReversed[i]+1]; } // Handle the (real-only) DC and Fs/2 bins RealOut[0] = pFFT[0]; RealOut[NumSamples / 2] = pFFT[1]; ImagOut[0] = ImagOut[NumSamples / 2] = 0; // Fill in the upper half using symmetry properties for(size_t i = NumSamples / 2 + 1; i < NumSamples; i++) { RealOut[i] = RealOut[NumSamples-i]; ImagOut[i] = -ImagOut[NumSamples-i]; } }
void ComputeSpectrumUsingRealFFTf(float *buffer, HFFT hFFT, float *window, int len, float *out) { int i; if(len > hFFT->Points*2) len = hFFT->Points*2; for(i=0; i<len; i++) buffer[i] *= window[i]; for( ; i<(hFFT->Points*2); i++) buffer[i]=0; // zero pad as needed RealFFTf(buffer, hFFT); // Handle the (real-only) DC float power = buffer[0]*buffer[0]; if(power <= 0) out[0] = -160.0; else out[0] = 10.0*log10(power); for(i=1;i<hFFT->Points;i++) { power = (buffer[hFFT->BitReversed[i] ]*buffer[hFFT->BitReversed[i] ]) + (buffer[hFFT->BitReversed[i]+1]*buffer[hFFT->BitReversed[i]+1]); if(power <= 0) out[i] = -160.0; else out[i] = 10.0*log10f(power); } }
void EffectNoiseRemoval::FillFirstHistoryWindow() { int i; for(i=0; i < mWindowSize; i++) mFFTBuffer[i] = mInWaveBuffer[i]; RealFFTf(mFFTBuffer, hFFT); for(i = 1; i < (mSpectrumSize-1); i++) { mRealFFTs[0][i] = mFFTBuffer[hFFT->BitReversed[i] ]; mImagFFTs[0][i] = mFFTBuffer[hFFT->BitReversed[i]+1]; mSpectrums[0][i] = mRealFFTs[0][i]*mRealFFTs[0][i] + mImagFFTs[0][i]*mImagFFTs[0][i]; mGains[0][i] = mNoiseAttenFactor; } // DC and Fs/2 bins need to be handled specially mSpectrums[0][0] = mFFTBuffer[0]*mFFTBuffer[0]; mSpectrums[0][mSpectrumSize-1] = mFFTBuffer[1]*mFFTBuffer[1]; mGains[0][0] = mNoiseAttenFactor; mGains[0][mSpectrumSize-1] = mNoiseAttenFactor; }
void PowerSpectrum(size_t NumSamples, const float *In, float *Out) { auto hFFT = GetFFT(NumSamples); Floats pFFT{ NumSamples }; // Copy the data into the processing buffer for (size_t i = 0; i<NumSamples; i++) pFFT[i] = In[i]; // Perform the FFT RealFFTf(pFFT.get(), hFFT.get()); // Copy the data into the real and imaginary outputs for (size_t i = 1; i<NumSamples / 2; i++) { Out[i]= (pFFT[hFFT->BitReversed[i] ]*pFFT[hFFT->BitReversed[i] ]) + (pFFT[hFFT->BitReversed[i]+1]*pFFT[hFFT->BitReversed[i]+1]); } // Handle the (real-only) DC and Fs/2 bins Out[0] = pFFT[0]*pFFT[0]; Out[NumSamples / 2] = pFFT[1]*pFFT[1]; }
void PowerSpectrum(int NumSamples, const float *In, float *Out) { int i; HFFT hFFT = GetFFT(NumSamples); float *pFFT = new float[NumSamples]; // Copy the data into the processing buffer for(i=0; i<NumSamples; i++) pFFT[i] = In[i]; // Perform the FFT RealFFTf(pFFT, hFFT); // Copy the data into the real and imaginary outputs for(i=1;i<NumSamples/2;i++) { Out[i]= (pFFT[hFFT->BitReversed[i] ]*pFFT[hFFT->BitReversed[i] ]) + (pFFT[hFFT->BitReversed[i]+1]*pFFT[hFFT->BitReversed[i]+1]); } // Handle the (real-only) DC and Fs/2 bins Out[0] = pFFT[0]*pFFT[0]; Out[i] = pFFT[1]*pFFT[1]; delete [] pFFT; ReleaseFFT(hFFT); }
void PowerSpectrum(int NumSamples, float *In, float *Out) { #ifdef EXPERIMENTAL_USE_REALFFTF // Remap to RealFFTf() function int i; HFFT hFFT = GetFFT(NumSamples); float *pFFT = new float[NumSamples]; // Copy the data into the processing buffer for(i=0; i<NumSamples; i++) pFFT[i] = In[i]; // Perform the FFT RealFFTf(pFFT, hFFT); // Copy the data into the real and imaginary outputs for(i=1;i<NumSamples/2;i++) { Out[i]= (pFFT[hFFT->BitReversed[i] ]*pFFT[hFFT->BitReversed[i] ]) + (pFFT[hFFT->BitReversed[i]+1]*pFFT[hFFT->BitReversed[i]+1]); } // Handle the (real-only) DC and Fs/2 bins Out[0] = pFFT[0]*pFFT[0]; Out[i] = pFFT[1]*pFFT[1]; delete [] pFFT; ReleaseFFT(hFFT); #else // EXPERIMENTAL_USE_REALFFTF int Half = NumSamples / 2; int i; float theta = M_PI / Half; float *tmpReal = new float[Half]; float *tmpImag = new float[Half]; float *RealOut = new float[Half]; float *ImagOut = new float[Half]; for (i = 0; i < Half; i++) { tmpReal[i] = In[2 * i]; tmpImag[i] = In[2 * i + 1]; } FFT(Half, 0, tmpReal, tmpImag, RealOut, ImagOut); float wtemp = float (sin(0.5 * theta)); float wpr = -2.0 * wtemp * wtemp; float wpi = -1.0 * float (sin(theta)); float wr = 1.0 + wpr; float wi = wpi; int i3; float h1r, h1i, h2r, h2i, rt, it; for (i = 1; i < Half / 2; i++) { i3 = Half - i; h1r = 0.5 * (RealOut[i] + RealOut[i3]); h1i = 0.5 * (ImagOut[i] - ImagOut[i3]); h2r = 0.5 * (ImagOut[i] + ImagOut[i3]); h2i = -0.5 * (RealOut[i] - RealOut[i3]); rt = h1r + wr * h2r - wi * h2i; it = h1i + wr * h2i + wi * h2r; Out[i] = rt * rt + it * it; rt = h1r - wr * h2r + wi * h2i; it = -h1i + wr * h2i + wi * h2r; Out[i3] = rt * rt + it * it; wr = (wtemp = wr) * wpr - wi * wpi + wr; wi = wi * wpr + wtemp * wpi + wi; } rt = (h1r = RealOut[0]) + ImagOut[0]; it = h1r - ImagOut[0]; Out[0] = rt * rt + it * it; rt = RealOut[Half / 2]; it = ImagOut[Half / 2]; Out[Half / 2] = rt * rt + it * it; delete[]tmpReal; delete[]tmpImag; delete[]RealOut; delete[]ImagOut; #endif // EXPERIMENTAL_USE_REALFFTF }
void RealFFT(int NumSamples, float *RealIn, float *RealOut, float *ImagOut) { #ifdef EXPERIMENTAL_USE_REALFFTF // Remap to RealFFTf() function int i; HFFT hFFT = GetFFT(NumSamples); float *pFFT = new float[NumSamples]; // Copy the data into the processing buffer for(i=0; i<NumSamples; i++) pFFT[i] = RealIn[i]; // Perform the FFT RealFFTf(pFFT, hFFT); // Copy the data into the real and imaginary outputs for(i=1;i<(NumSamples/2);i++) { RealOut[i]=pFFT[hFFT->BitReversed[i] ]; ImagOut[i]=pFFT[hFFT->BitReversed[i]+1]; } // Handle the (real-only) DC and Fs/2 bins RealOut[0] = pFFT[0]; RealOut[i] = pFFT[1]; ImagOut[0] = ImagOut[i] = 0; // Fill in the upper half using symmetry properties for(i++ ; i<NumSamples; i++) { RealOut[i] = RealOut[NumSamples-i]; ImagOut[i] = -ImagOut[NumSamples-i]; } delete [] pFFT; ReleaseFFT(hFFT); #else int Half = NumSamples / 2; int i; float theta = M_PI / Half; float *tmpReal = new float[Half]; float *tmpImag = new float[Half]; for (i = 0; i < Half; i++) { tmpReal[i] = RealIn[2 * i]; tmpImag[i] = RealIn[2 * i + 1]; } FFT(Half, 0, tmpReal, tmpImag, RealOut, ImagOut); float wtemp = float (sin(0.5 * theta)); float wpr = -2.0 * wtemp * wtemp; float wpi = -1.0 * float (sin(theta)); float wr = 1.0 + wpr; float wi = wpi; int i3; float h1r, h1i, h2r, h2i; for (i = 1; i < Half / 2; i++) { i3 = Half - i; h1r = 0.5 * (RealOut[i] + RealOut[i3]); h1i = 0.5 * (ImagOut[i] - ImagOut[i3]); h2r = 0.5 * (ImagOut[i] + ImagOut[i3]); h2i = -0.5 * (RealOut[i] - RealOut[i3]); RealOut[i] = h1r + wr * h2r - wi * h2i; ImagOut[i] = h1i + wr * h2i + wi * h2r; RealOut[i3] = h1r - wr * h2r + wi * h2i; ImagOut[i3] = -h1i + wr * h2i + wi * h2r; wr = (wtemp = wr) * wpr - wi * wpi + wr; wi = wi * wpr + wtemp * wpi + wi; } RealOut[0] = (h1r = RealOut[0]) + ImagOut[0]; ImagOut[0] = h1r - ImagOut[0]; delete[]tmpReal; delete[]tmpImag; #endif //EXPERIMENTAL_USE_REALFFTF }