/// <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]); }