и тренда (полинома n-й степени)? Мне нужно по множеству синхронных реализаций отделить одинаковый паттерн сигнала от медленно меняющегося тренда.
using Plots
using Random
Random.seed!(0)
gaus_impulse(x, μ, σ) = exp(-(((x - μ)/σ)^2) / 2)/ (σ * sqrt(2π))
function generate_poly(x, coeffs)
broadcast(x) do xi
sum(c * xi^(i-1) for (i, c) in enumerate(coeffs))
end
end
x = -100:100
x0 = 15
width = 10
g = gaus_impulse.(x, x0, width) .* 25
plot(x, g)
p = generate_poly(x, [1, -0.01, 0.0002])
plot!(x, p .+ g .* 1.5)
p = generate_poly(x, [2, 0.02, -0.0001])
plot!(x, p .+ g .* 1.0)
p = generate_poly(x, [3, -0.02, 0.00001])
plot!(x, p .+ g .* 0.6)
p = generate_poly(x, [4, 0.01, 0.00001])
plot!(x, p .+ g .* 0.8)
Вот такое нашлось. По сути, метод наименьших квадратов, как я понял https://habr.com/ru/articles/448848/
Сигнал периодический?
Нет, сигнал нелинейный, тренд нелинейный
Периодический линейным и не бывает
Сам паттерн сложной формы, но он повторяется, поэтому можно синхронизировать участки по корреляциям, применив грубые ВЧ-фильтры.
Я бы просто скользящее окно по периоду сделал бы, а потом продифференцировал бы, чтобы получить тренд
Это не прокатит, т.к. у сигнала (импульса) среднее не нулевое.
Ну разве что одну из функций задать как среднее значение всех реализаций, и итеративно пересчитывать после вычитания аппроксимации тренда.
Может вейвлеты применить? Была популярная тема, лет 15 назад.
Можно попробовать вот этот метод https://ru.wikipedia.org/wiki/Empirical_Mode_Decomposition как делают в https://ieeexplore.ieee.org/document/9691539 или гибридные медианные КИХ-фильтры как делают авторы http://rt.nure.ua/article/view/246466
Может быть, надо усреднять в пределах скользящего окна - это будет текущее среднее, т.е. тренд
Сигналы в каналах наблюдения как отличаются? У них есть высокая,взаимосвязь?
P-splines или GAM , соответствующим базисом не пробовали? https://en.m.wikipedia.org/wiki/Generalized_additive_model
Обсуждают сегодня