ssa

Форк
0
/
medianFilter.go 
61 строка · 1.9 Кб
1
package gopw
2

3
import (
4
	"errors"
5
	"sort"
6
)
7

8
// Медианная фильрация
9
func medianFilter(x []float64, n int) ([]float64, error) {
10

11
	// Сравнения окна и количества отсчётов в сигнале
12
	if n > len(x) {
13
		return nil, errors.New("window N more lenght signal")
14
	}
15

16
	// Проверка на нечетное значение n
17
	// в противном случае из нечётного делаем чётное
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 ).
20
	if n%2 == 0 {
21
		n++
22
	}
23

24
	// Длина входного массива
25
	length := len(x)
26

27
	// Результат фильтрации
28
	y := make([]float64, length)
29

30
	for i := 0; i < length; i++ {
31
		// Индексы для сбора значений для медианного фильтра
32
		start := i - n/2
33
		end := i + n/2
34

35
		// Гарантия, что индексы не выходят за пределы массива
36
		if start < 0 {
37
			start = 0
38
		}
39
		if end >= length {
40
			end = length - 1
41
		}
42

43
		// Извлечение значений для медианы
44
		window := x[start : end+1]
45

46
		// Сортировка окна значений и выбор медианы
47
		sortedWindow := make([]float64, len(window))
48
		copy(sortedWindow, window)
49
		sort.Float64s(sortedWindow)
50

51
		// Хитрый мув. При делении int(5) на int(2), получается int(2),
52
		// т.е. округление в нижнюю сторону, хотя нам нужно в старшую степень
53
		// Поэтому из нечётного делаем чётное,
54
		// а в случае получения нечётного не имеет разницы
55
		medianIndex := (len(sortedWindow) + 1) / 2
56

57
		y[i] = sortedWindow[medianIndex] // Сохравнение результата
58
	}
59

60
	return y, nil
61
}
62

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.