public RunningProcessor(SignalBuffer buffer, WaveletSettings waveletSettings) { _buffer = buffer; _wSettings = waveletSettings; int wLength = waveletSettings.H0.Length; _wPhase = WaveletTools.GetWaveletPhase(wLength, buffer.CoefficientsDepth); //Начальная задержка фазы для заполнения буфера стартовыми данными для //старта безошибочного преобразования int _wDelay = WaveletTools.GetPhaseDelay(wLength, buffer.CoefficientsDepth); int _wPower = (int)Math.Pow(2, buffer.CoefficientsDepth); _wiPhase = (_wDelay % _wPower) == 0 ? 1 : (_wPower - (_wDelay % _wPower) + 1); }
/// <summary> /// Фильтр многоуровневой декомпозиции для буфера с учетом фазы декомпозиции /// </summary> /// <param name="wDataBuffer">буфер данных вейвлета</param> public void ApplyDecFilter(SignalBuffer wDataBuffer, int wLevel) { var val0 = new double(); var val1 = new double(); //int lSignal = wDataBuffer.SBuffer.Length; int lWavelet = _wSettings.H0.Length; int insertLevel = 0; //в нулевой ряд массива записываються коэф. разложения 1го уровня if (_wiPhase >= 0) { for (int i = _wiPhase; i >= 2 && _wiPhase % 2 == 0 && insertLevel <= wLevel; i = i / 2, insertLevel++) { //разложение первого уровня производиться над сигналом, //хранящимся в отдельной переменной, а не в 2х массиве коэф. if (insertLevel == 0 /*&& _wiPhase==2*/) { val0 = WaveletTools.ShortConv(wDataBuffer.SignalSegment.ToList().GetRange(0, lWavelet).ToArray(), _wSettings.H0); wDataBuffer.FitValue2D(wDataBuffer.LfBuffer, val0, insertLevel); val1 = WaveletTools.ShortConv(wDataBuffer.SignalSegment.ToList().GetRange(0, lWavelet).ToArray(), _wSettings.H1); wDataBuffer.FitValue2D(wDataBuffer.HfBuffer, val1, insertLevel); } else { val0 = WaveletTools.ShortConv( wDataBuffer.GetRow(wDataBuffer.LfBuffer, insertLevel - 1) .ToList() .GetRange(0, lWavelet) .ToArray(), _wSettings.H0); wDataBuffer.FitValue2D(wDataBuffer.LfBuffer, val0, insertLevel); val1 = WaveletTools.ShortConv( wDataBuffer.GetRow(wDataBuffer.LfBuffer, insertLevel - 1) .ToList() .GetRange(0, lWavelet) .ToArray(), _wSettings.H1); wDataBuffer.FitValue2D(wDataBuffer.HfBuffer, val1, insertLevel); } } //_wiPhase = (_wiPhase >= _wPhase) ? 1 : ++_wiPhase; } ////Цикл для рекурсивного расчета детализирующих коэф. ////только для фазы кратной двум (нечетные коэффициенты всегда откидываються) //for (int i = _wiPhase; i >= 2 && _wiPhase % 2 == 0 && insertLevel<=wLevel; i = i / 2, insertLevel++) //{ // wDataBuffer.FitValueLf(WaveletTools.ShortConv(wDataBuffer.GetRow(insertLevel-1).ToList().GetRange(0,lWavelet).ToArray(), // waveletSettings.CurrentWavelet.H1), insertLevel); //} ////Расчет только апп. коэфф. только последнего уровня //if(_wiPhase%Math.Pow(2,wLevel)==0) //{ // wDataBuffer.FitValueHf(WaveletTools.ShortConv(wDataBuffer.GetRow(wLevel - 1).ToList().GetRange(0, lWavelet).ToArray(), // waveletSettings.CurrentWavelet.H0)); //} //} _wiPhase = (_wiPhase >= _wPhase) ? 1 : ++_wiPhase; }
public void ApplyRecFilter(SignalBuffer wDataBuffer, int wLevel) { //int lSignal = wDataBuffer.SBuffer.Length; int lWavelet = _wSettings.H0.Length; int insertLevel = 0; double[] arr = new double[60]; //т.к. мы храним апп. коеф. только последнего уровня, // то и восстанавливаем с частотой появления этих коеф. if (_wiPhase % Math.Pow(2, wLevel) == 0) { //for (int i = _wiPhase; i >= 2; i /= 2) //????? for (int i = wLevel-1; i > 0; i--) { //var apr = //для добеши 4 отсчета - восстановлены 4 и 3 индексы соответствено var el1 = WaveletTools.ShortConv( WaveletTools.UpSampleEven( wDataBuffer.LfBuffer.GetRow(i).ToList().GetRange(0, lWavelet / 2).ToArray()), _wSettings.F0) + WaveletTools.ShortConv( WaveletTools.UpSampleEven( wDataBuffer.HfBuffer.GetRow(i).ToList().GetRange(0, lWavelet / 2).ToArray()), _wSettings.F1); var el2 = WaveletTools.ShortConv( WaveletTools.UpSampleOdd( wDataBuffer.LfBuffer.GetRow(i).ToList().GetRange(0, lWavelet / 2).ToArray()), _wSettings.F0) + WaveletTools.ShortConv( WaveletTools.UpSampleOdd( wDataBuffer.HfBuffer.GetRow(i).ToList().GetRange(0, lWavelet / 2).ToArray()), _wSettings.F1); if (insertLevel > 1) { _buffer.RecoveredSegment.FitValue1D(el2); _buffer.RecoveredSegment.FitValue1D(el1); } //заменяем коэффициенты более высокого уровня восстановлеными коэф. более низкого уровня //wDataBuffer.InsertValue(el1, wLevel - 1, lWavelet - 2); //wDataBuffer.InsertValue(el2, wLevel - 1, lWavelet - 1); } } }