/// <summary>
        /// Многоуровневое вейвлет разложение
        /// </summary>
        /// <param name="coefficients">сигнал записанный в виде коэффициента CA</param>
        /// <param name="decomposeLevel">глубина разложения</param>
        /// <returns></returns>
        public static WaveletCoef WaveDec(WaveletCoef coefficients, int decomposeLevel)
        {
            WaveletCoef coefficients2 = new WaveletCoef();

            //Length Coefficients
            if (coefficients.l != null)
            {
                coefficients2.l = new int[coefficients.l.Length + 1];
                coefficients.l.CopyTo(coefficients2.l, 0);
                coefficients2.l[coefficients.l.Length] = coefficients.ca.Length;
            }
            else
            {
                coefficients2.l = new int[] { coefficients.ca.Length };
            }

            //Approximation coefficients
            coefficients2.ca = DownSample(Conv(coefficients.ca, WaveletSettings.H0));

            //Detalization coefficients
            if (coefficients.cd != null)
            {
                //создаем расширенный масив для дет. коеф. нового уровня декомпозиции.
                coefficients2.cd = new double[coefficients.cd.Length + coefficients2.ca.Length];
                //дублируем существующие дет. коеф. в расширенный массив.
                coefficients.cd.CopyTo(coefficients2.cd, 0);
                //копируем реультат посделней свертки в конец расширеного массива дет. коеф.
                DownSample(Conv(coefficients.ca, WaveletSettings.H1)).CopyTo(coefficients2.cd, coefficients.cd.Length);
            }

            else
            {
                coefficients2.cd = DownSample(Conv(coefficients.ca, WaveletSettings.H1));

            }

            //Recursive part
            if (decomposeLevel == 1)
                return coefficients2;
            else return WaveDec(coefficients2
                , decomposeLevel - 1);
        }
        /// <summary>
        /// Многоуровневое вейвлет восстановление
        /// </summary>
        /// <param name="coefficients"></param>
        /// <returns>Восстановлены сигнал записанный в виде CA коэффициентов</returns>
        public static WaveletCoef WaveRec(WaveletCoef coefficients)
        {
            WaveletCoef coefficients2 = new WaveletCoef();

            //Length Coefficients
            if (coefficients.l.Length > 1)
            {
                coefficients2.l = new int[coefficients.l.Length - 1];
                //копируем весь массив без последнего элемента
                Array.Copy(coefficients.l, 0, coefficients2.l, 0, coefficients.l.Length - 1);
            }

            //Detalization coefficients
            //из списска коэффициентов необходимо выцепить коэф. последнего уровня
            double[] LastCds = new double[coefficients.ca.Length];
            //выбираем дет. коэффициенты последнего уровня
            Array.Copy(coefficients.cd, (coefficients.cd.Length - coefficients.ca.Length), LastCds, 0, coefficients.ca.Length);
            //выбираем дет. коэффициенты всех оставшихся уровней, кроме последнего
            coefficients2.cd = new double[coefficients.cd.Length - coefficients.ca.Length];
            Array.Copy(coefficients.cd, 0, coefficients2.cd, 0, coefficients.cd.Length - coefficients.ca.Length);

            //Approximation coefficients
            coefficients2.ca = TrimToLength(
                                    VectorAddition(
                                        Conv(UpSample(coefficients.ca), WaveletSettings.F0),
                                        Conv(UpSample(LastCds), WaveletSettings.F1)
                                                  ),
                                        coefficients.l[coefficients.l.Length - 1]
                                           );

            //Recursive part
            if (coefficients2.l == null)
                return coefficients2;
            else return WaveRec(coefficients2);
        }
 public static double[] iDWT(WaveletCoef coefficients)
 {
     return TrimToLength(
         VectorAddition(
         Conv(UpSample(coefficients.ca), WaveletSettings.F0),
         Conv(UpSample(coefficients.cd), WaveletSettings.F1)),
         coefficients.l[0]);
 }