// _______________________________________________________ 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 }
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; }