public double[] Extract(float[] frame, out bool isEmpty) { HammingWindowDef.HammingWindow hammingWindow; if (!_hammingWindows.TryGetValue(frame.Length, out hammingWindow)) { hammingWindow = new HammingWindowDef.HammingWindow(new HammingWindowDef(), frame.Length); _hammingWindows.Add(frame.Length, hammingWindow); } var windowedSample = hammingWindow.Apply(frame); FourierTransform ft = new FourierTransform(); var nummberOfCoeff = ft.ComputeFft(windowedSample, _numberOfFftCoeff); double frameEnergy; var result = ft.GetMagnitudeSquared(nummberOfCoeff, out frameEnergy); if (_filterBankCoefficients == null) { _filterBankCoefficients = ComputeMelFilterBank(result.Length, _lowerfrequency, _higherfrequency, _samplingRate, _numberOfFilterBanks + 2); } var cepstra = ApplyFilterbankFilter(result, _filterBankCoefficients); var ret = _dct.Apply(cepstra); ret[0] = Utils.Log(frameEnergy); isEmpty = false; return ret; }