private int _nonStaticLsfMeanDownScaleFactor = 2;    // 40D, 8.0 for other LSP order
        #endregion

        #region Construction

        /// <summary>
        /// Initializes a new instance of the FixedPointLspGaussianSerializer class.
        /// </summary>
        /// <param name="config">Gaussian configuration.</param>
        internal FixedPointLspGaussianSerializer(GaussianConfig config) :
            base(config)
        {
            Helper.ThrowIfNull(config);

            // 32768, quantize delta (LSF[i+1]-LSP[i]) to 256, LSF (0, 0.5), so delta will depend on dimension count
            // 4.0 if dimension >= 40D
            // 8.0 if dimension < 40D
            // Maximum range of LSF (16384 -> 0.5)
            // 1024 = (256 * 4), maximum delta of LSF should be 1/16 of 0.5 in term of 40D
            // 256 is what to quantize
            // 1 is the smallest difference, to make sure the stabilize of the LPC filter.
            if (Config.StaticVectorSize >= 40)
            {
                _staticLsfMeanDownScaleTo256Factor = 4;
                _nonStaticLsfMeanDownScaleFactor = 2;
            }
            else
            {
                _staticLsfMeanDownScaleTo256Factor = 8;
                _nonStaticLsfMeanDownScaleFactor = 4;
            }
        }
 /// <summary>
 /// Initializes a new instance of the FixedPointF0GaussianSerializer class.
 /// </summary>
 /// <param name="config">Gaussian configuration.</param>
 internal FixedPointF0GaussianSerializer(GaussianConfig config) :
     base(config)
 {
 }
 /// <summary>
 /// Initializes a new instance of the GaussianSerializer class.
 /// </summary>
 /// <param name="config">Gaussian configuration.</param>
 protected GaussianSerializer(GaussianConfig config) :
     this()
 {
     Helper.ThrowIfNull(config);
     Config = config;
 }
 /// <summary>
 /// Initializes a new instance of the MultipleSpaceDistributionGaussianSerializer class.
 /// </summary>
 /// <param name="config">Gaussian configuration.</param>
 internal MultipleSpaceDistributionGaussianSerializer(GaussianConfig config) :
     base(config)
 {
 }
        /// <summary>
        /// Create Gaussian serializer.
        /// </summary>
        /// <param name="config">Gaussian configuration.</param>
        /// <param name="modelType">Model type.</param>
        /// <param name="modelDistribution">Model distribution.</param>
        /// <returns>Gaussian serializer.</returns>
        public static GaussianSerializer Create(GaussianConfig config, HmmModelType modelType,
             ModelDistributionType modelDistribution)
        {
            Helper.ThrowIfNull(config);

            GaussianSerializer serializer = null;
            if (config.IsFixedPoint)
            {
                if (modelType == HmmModelType.Lsp)
                {
                    serializer = new FixedPointLspGaussianSerializer(config);
                }
                else if (modelType == HmmModelType.FundamentalFrequency)
                {
                    serializer = new FixedPointF0GaussianSerializer(config);
                }
                else if (modelType == HmmModelType.Mbe)
                {
                    serializer = new FixedPointMBEGaussianSerializer(config);
                }
            }

            if (serializer == null)
            {
                if (modelDistribution == ModelDistributionType.Msd)
                {
                    serializer = new MultipleSpaceDistributionGaussianSerializer(config);
                }
                else
                {
                    serializer = new GaussianSerializer(config);
                }
            }

            return serializer;
        }