示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
            }
        }