Пример #1
0
        /// <summary>
        /// Calculates the spectrogram that consists of spectral envelopes estimated by CheapTrick.
        /// </summary>
        /// <param name="x">Input signal</param>
        /// <param name="fs">Sampling frequency</param>
        /// <param name="temporalPositions">Time axis</param>
        /// <param name="f0">F0 contour</param>
        /// <param name="options">Options for CheapTrick</param>
        /// <returns>Spectrogram estimated by CheapTrick</returns>
        public static double[][] Calculate(double[] x, int fs, double[] temporalPositions, double[] f0,
                                           CheapTrickOptions options)
        {
            var fftSize = options.FftSize;
            var r       = new MatlabRandom();

            var f0Floor          = GetF0Floor(fs, fftSize);
            var spectralEnvelope = new double[fftSize];

            var forwardRealFft = new ForwardRealFft(fftSize);
            var inverseRealFft = new InverseRealFft(fftSize);

            var spectrogram = new double[f0.Length][];

            for (var i = 0; i < spectrogram.Length; i++)
            {
                spectrogram[i] = new double[(fftSize / 2) + 1];
            }



            for (var i = 0; i < f0.Length; i++)
            {
                var currentF0 = f0[i] <= f0Floor ? Consts.KDefaultF0 : f0[i];
                //CheapTrickGeneralBody() Goes Here
                for (var j = 0; j <= fftSize / 2; j++)
                {
                    spectrogram[i][j] = spectralEnvelope[j];
                }
            }

            return(spectrogram);
        }
Пример #2
0
 /// <summary>
 /// Calculates the FFT size based on the sampling frequency and lower limit of F0.
 /// </summary>
 /// <param name="fs">Sampling frequency</param>
 /// <param name="options">Option struct containing lower F0 limit</param>
 public static int GetFftSize(int fs, CheapTrickOptions options)
 => (int)Math.Pow(2.0, 1.0 + (int)(Math.Log(3.0 * fs / options.F0Floor + 1) / Consts.KLog2));