/// <summary> /// Method for computing a spectrogram. /// The spectrogram is essentially a list of power spectra in time. /// </summary> /// <param name="samples">The samples of signal</param> /// <returns>Spectrogram of the signal</returns> public List <float[]> Spectrogram(float[] samples) { var block = new float[_fftSize]; var zeroblock = new float[_fftSize]; var spectrogram = new List <float[]>(); for (var pos = 0; pos + _windowSize < samples.Length; pos += _hopSize) { zeroblock.FastCopyTo(block, _fftSize); samples.FastCopyTo(block, _windowSize, pos); if (_window != WindowTypes.Rectangular) { block.ApplyWindow(_windowSamples); } var spectrum = new float[_fftSize / 2 + 1]; _fft.PowerSpectrum(block, spectrum); spectrogram.Add(spectrum); } return(spectrogram); }
/// <summary> /// Method for computing real cepstrum from array of samples /// </summary> /// <param name="samples"></param> /// <param name="cepstrum"></param> /// <param name="power"></param> /// <returns></returns> public void Direct(float[] samples, float[] cepstrum, bool power = false) { // complex fft _fft.PowerSpectrum(samples, _realSpectrum, false); // logarithm of power spectrum for (var i = 0; i < _realSpectrum.Length; i++) { _realSpectrum[i] = (float)Math.Log10(_realSpectrum[i] + float.Epsilon); _imagSpectrum[i] = 0.0f; } // complex _fft.Inverse(_realSpectrum, _imagSpectrum); // take truncated part if (power) { for (var i = 0; i < _cepstrumSize; i++) { cepstrum[i] = (_realSpectrum[i] * _realSpectrum[i] + _imagSpectrum[i] * _imagSpectrum[i]) / _realSpectrum.Length; } } else { _realSpectrum.FastCopyTo(cepstrum, _cepstrumSize); } }