// _______________________________________________________
void KeyWordDetector::generateWindowFunction() {
  computeWindow(window, WINDOW_LENGTH, FFT_WIN_TYP_HAMMING);
  
  // Compute window normalisation factors (weighing factors)
  for (int i = 0; i < WINDOW_LENGTH/2; i++){
    windowNormS1 += window[i];
    windowNormS2 += pow(window[i], 2);
  }
  // Multiply by two because we only store half of the window
  windowNormS1 *= 2;
  windowNormS2 *= 2;
  
  // Power spectrum scale is for perfomance resons calculated only once
  powerSpectrumScale = 1.0f;
  //powerSpectrumScale = 2/(pow(windowNormS1, 2));
  
#ifdef DEBUG_KD_WINDOW
  Serial.println("Window:");
  printV(window, WINDOW_LENGTH/2, true);
  Serial.print("Window normalisation: S1: ");
  Serial.print(windowNormS1);
  Serial.print(", S2: ");
  Serial.println(windowNormS2);
  Serial.print("PowerSpectrumScale: ");
  Serial.println(powerSpectrumScale);
#endif
}
示例#2
0
Error_t CFft::init( int iBlockLength, int iZeroPadFactor, WindowFunction_t eWindow /*= kWindowHann*/, Windowing_t eWindowing /*= kPreWindow*/ )
{
    Error_t  rErr = kNoError;

    // sanity check
    if (!CUtil::isPowOf2(iBlockLength) || iZeroPadFactor <= 0 || !CUtil::isPowOf2(iBlockLength*iZeroPadFactor))
        return kFunctionInvalidArgsError;

    // clean up
    reset();

    m_iDataLength   = iBlockLength;
    m_iFftLength    = iBlockLength * iZeroPadFactor;

    m_ePrePostWindowOpt = eWindowing;

    rErr = allocMemory ();
    if (rErr)
        return rErr;

    rErr = computeWindow (eWindow);

    m_bIsInitialized    = true;

    return rErr;
}