ssa
1package gopw2
3import (4"errors"5"sort"6)
7
8// Медианная фильрация
9func medianFilter(x []float64, n int) ([]float64, error) {10
11// Сравнения окна и количества отсчётов в сигнале12if n > len(x) {13return nil, errors.New("window N more lenght signal")14}15
16// Проверка на нечетное значение n17// в противном случае из нечётного делаем чётное18// % For N odd, Y(k) is the median of X( k-(N-1)/2 : k+(N-1)/2 ).19// % For N even, Y(k) is the median of X( k-N/2 : k+N/2-1 ).20if n%2 == 0 {21n++22}23
24// Длина входного массива25length := len(x)26
27// Результат фильтрации28y := make([]float64, length)29
30for i := 0; i < length; i++ {31// Индексы для сбора значений для медианного фильтра32start := i - n/233end := i + n/234
35// Гарантия, что индексы не выходят за пределы массива36if start < 0 {37start = 038}39if end >= length {40end = length - 141}42
43// Извлечение значений для медианы44window := x[start : end+1]45
46// Сортировка окна значений и выбор медианы47sortedWindow := make([]float64, len(window))48copy(sortedWindow, window)49sort.Float64s(sortedWindow)50
51// Хитрый мув. При делении int(5) на int(2), получается int(2),52// т.е. округление в нижнюю сторону, хотя нам нужно в старшую степень53// Поэтому из нечётного делаем чётное,54// а в случае получения нечётного не имеет разницы55medianIndex := (len(sortedWindow) + 1) / 256
57y[i] = sortedWindow[medianIndex] // Сохравнение результата58}59
60return y, nil61}
62