문제

계산하고 싶은 연속 가치가 있습니다. 지수 이동 평균. 일반적으로 나는 이것에 대한 표준 공식을 사용합니다.

  • 에스N = αy + (1-α) sN-1

어디서N 새로운 평균, α는 알파, y는 샘플, S입니다.N-1 이전 평균입니다.

불행히도 다양한 문제로 인해 일관된 샘플 시간이 없습니다. 예를 들어, 밀리 초당 한 번 한 번 샘플링 할 수 있다는 것을 알 수 있지만 제어 할 수없는 요인으로 인해 한 번에 몇 밀리 초 동안 샘플을 섭취하지 못할 수 있습니다. 그러나 더 일반적인 경우는 0, 1 및 2ms에서 샘플링하는 대신 조금 일찍 또는 늦게 샘플링하는 것입니다. 나는 0, 0.9 및 2.1ms에서 샘플링합니다. 지연에 관계없이 샘플링 주파수가 Nyquist 한계보다 훨씬 높을 것이므로 별명에 대해 걱정할 필요가 없습니다.

나는 마지막 샘플 이후의 시간에 따라 알파를 적절하게 변화시킴으로써보다 합리적인 방식으로 이것을 다룰 수 있다고 생각합니다.

이것이 효과가있을 것이라는 추론의 일부는 EMA가 이전 데이터 포인트와 현재 데이터 점 사이에서 "선형 적으로 보간"된다는 것입니다. 간격 t : [0,1,2,3,4]에서 다음 샘플 목록의 EMA를 계산하는 것을 고려하는 경우. Interval 2T를 사용하면 입력이 [0,2,4]가되는 경우 동일한 결과를 얻어야합니까? EMA가 T.2 값은 t 이후 2였다0, 그것은 [0,2,2,4,4]에서 계산하는 간격 t 계산과 동일합니다. 아니면 전혀 의미가 있습니까?

누군가 알파를 적절하게 변화시키는 방법을 말해 줄 수 있습니까? "당신의 일을 보여주세요." 즉, 당신의 방법이 실제로 옳은 일을하고 있음을 증명하는 수학을 보여주세요.

도움이 되었습니까?

해결책

이 답변은 저역 통과 필터 ( "지수 이동 평균")에 대한 나의 이해를 기반으로 한 것이 실제로 단일 극단로드 패스 필터 일뿐입니다). 나는 다음이 당신이 원하는 것이라고 생각합니다.

먼저 방정식을 약간 단순화 할 수 있습니다 (더 복잡해 보이지만 코드에서는 더 쉽습니다). 출력에는 "y", 입력에는 "x"를 사용하겠습니다 (출력의 경우 S 대신, 입력의 경우 y 대신).

와이N = αX + (1-α) yN-1 → yN = yN-1 + α (x -yN-1)

어떤 코드 :

 Y += alpha * (X-Y);

둘째, 여기서 α의 값은 "동일"합니다.-ΔT/τ 여기서 ΔT는 샘플 사이의 시간이고 τ는 저역 통과 필터의 시간 상수입니다. ΔT/τ가 1에 비해 작을 때 잘 작동하고 α = 1-E가 잘 작동하기 때문에 인용문에서 "동일"이라고 말합니다.-ΔT/τ ≈ ΔT/τ. (그러나 너무 작지 않음 : 양자화 문제를 해결할 수 있으며, 이국적인 기술에 의지하지 않으면 일반적으로 상태 변수에서 N = -log에 추가 N 비트의 해상도가 필요합니다.2(α). ) ΔT/τ의 더 큰 값의 경우 α가 1에 가까워지고 기본적으로 입력을 출력에 할당하는 지점에 도달 할 때까지 필터링 효과가 사라지기 시작합니다.

이것은 다양한 ΔT 값으로 올바르게 작동해야합니다 (알파의 변형은 알파가 작다면 그다지 중요하지 않습니다. 그렇지 않으면 다소 이상한 nyquist 문제 / 앨리어싱 / 등에 실행됩니다). 곱셈이 나누기보다 저렴하거나 고정점 문제가 중요하시면 ω = 1/τ를 미리 계산하고 α의 공식을 근사화하려고 노력하는 것을 고려하십시오.

공식을 도출하는 방법을 정말로 알고 싶다면

α = 1-e-ΔT/τ

그런 다음 미분 방정식 소스를 고려하십시오.

y + τ dy/dt = x

X가 단위 단계 함수 인 경우 솔루션 y = 1 -E가 있습니다.-t/τ. ΔT의 작은 값의 경우, 유도체는 ΔY/ΔT에 의해 근사 될 수 있으며,

y + τ Δy/Δt = x

Δy/Δt = (xy)/τ

Δy = (xy) (Δt/τ) = α (xy)

및 α = 1-e의 "외삽"-ΔT/τ 동작을 단위 단계 함수 케이스와 일치 시키려고합니다.

다른 팁

여기를 살펴보십시오 : http://www.eckner.com/research.html

두 번째 링크를보십시오 : ""고르지 않게 경주 된 시계열에 대한 알고리즘 : 이동 평균 및 기타 롤링 연산자 "

이 문서는 필요한 프로그래밍 알고리즘을 정확하게 설명합니다.

이것은 완전한 대답은 아니지만 시작일 수 있습니다. 내가 이것으로 한 시간 정도 연주하는 한 멀리 떨어져 있습니다. 나는 그것을 내가 찾고있는 것의 예로 게시하고있을 것입니다. 아마도 문제를 해결하는 다른 사람들에게 영감을 줄 것입니다.

나는 s로 시작한다0, 이전 평균 s에서 발생하는 평균입니다.-1 그리고 샘플 y0 t에서 촬영0. (티1 -T0)는 샘플 간격이며 α는 해당 샘플 간격에 적합한 것과 평균을 원하는 기간으로 설정됩니다.

T에서 샘플을 놓치면 어떻게되는지 고려했습니다.1 대신 샘플 y와 관련이 있어야합니다.2 t에서 촬영2? 글쎄, 우리는 방정식을 확장하여 우리가 Y가 있었다면 무슨 일이 있었는지 확인할 수 있습니다.1:

  • 에스2 = αy2 + (1-α) s1, 어디서 s1 = αy1 + (1-α) s0

대체 :

  • 에스2 = αy2 + (1-α) (αy1 + (1-α) s0)
  • 에스2 = αy2 + (1-α) αy1 + (1-α) (1-α) s0
  • 에스2 = αy2 + (1-α) αy1 + (1-α)2에스0

나는 우리가N 오른쪽에서 무기한 :

  • 에스2 = αy2 + (1-α) αy1 + (1-α)2(αy0 + (1-α) s-1)
  • 에스2 = αy2 + (1-α) αy1 + (1-α)2αy0 + (1-α)3에스-1
  • 등.

좋아, 그래서 그것은 실제로 다항식이 아니지만 (어리석은 나), 초기 용어를 하나씩 곱하면 패턴이 보입니다.

  • 에스2 = (1-α)0αy2 + (1-α) αy1 + (1-α)2αy0 + (1-α)3에스-1

HM : 지수 시리즈입니다. Quelle Surprise! 지수 이동 평균에 대한 방정식에서 나오는 것을 상상해보십시오!

어쨌든, 나는이 x를 가지고있다0 + x1 + x2 + x3 + ... e 또는 자연스러운 로그가 여기를 걷어차 고 있지만 시간이 부족하기 전에 다음에 어디로 향하고 있는지 기억할 수 없습니다.

이 질문에 대한 답 또는 그러한 답변의 정확성 증명은 측정중인 데이터에 크게 달려 있습니다.

샘플이 t에서 복용 한 경우0= 0ms, t1= 0.9ms 및 t2= 2.1ms이지만 α의 선택은 1-ms 간격을 기반으로하므로 로컬로 조정 된 α를 원합니다.N , 선택의 정확성 증명은 T = 1ms 및 t = 2ms에서 샘플 값을 아는 것을 의미합니다.

이것은 질문으로 이어집니다. 데이터를 보간하여 값이 무엇인지 제정신으로 추측 할 수 있습니까? 아니면 평균 자체를 보간 할 수 있습니까?

이것들 중 어느 것도 가능하지 않다면, 내가 보는 한, 값 중 하나의 논리적 선택은 다음과 같습니다. 가장 최근에 계산 된 평균, 즉 y (t) ≈ sN 여기서 n은 t와 같은 최대입니다Nu003Ct.

이 선택은 간단한 결과를 가져옵니다. 시차가 무엇이든 α를 내버려 두십시오.

반면에, 값을 보간 할 수 있다면, 평균 상수-간격 샘플을 제공합니다. 마지막으로, 평균 자체를 보간하는 것이 가능하다면, 그 질문은 의미가 없을 것입니다.

(1-α와 같은 약간 다른 α를 사용함으로써질문에서 하나), 기존 평균 s에 새 값 y를 추가하는 기본 공식0 이렇게 보인다 :

s (y, s0) =

(1-α) Y + αS0 =

y -αy + αs0 =

y + α (s0-와이)

이제 우리가 시간 간격 t의 길이를 추가하고 α만이 그 t에 의존한다고 가정하면, 그 공식은 다음과 같습니다.

s (y, t, s0) = y + α(에스0-와이)

이제 t = t라고 가정합니다1 + t2. 시간 간격 t에 대해 y의 두 값을 추가하여 평균이 생성되는 경우1 그리고 t2, 결과 평균은 다음과 같습니다.

s (y, t2, S (y, t1,에스0)) =

Y + α2(S (y, t1,에스0) -y) =

Y + α2((Y + α1(에스0-y)) -y) =

Y + α2α1(에스0-와이)

이 평균이 전체 T 간격이 한 번에 추가 된 것과 동일해야한다면 α를 따릅니다. = α1α2. 이 요구 사항을 충족시키는 α의 정의는 다음과 같습니다.

α엑스 : = a엑스 (일부 상수 a)

왜냐하면:

α = a = a1 + t2 = a12 = α1α2

이로 인해 다음 평균화 기능이 발생합니다.

s (y, t, s0) = y + a(에스0-와이)

나는 이것을 실제로 테스트하지 않았지만, 내가 만든 가정이 당신의 시나리오에 적합하다면 이것은 샘플링 간격의 변동을 잘 처리 할 수있는 평균화 함수처럼 보입니다.

연속 기능에서 지수 부패 평균을 만들고 싶다고 가정 해 봅시다. 그러나 우리는 그 함수의 모든 값이없고 몇 가지 샘플 만 가지고 있습니다. 이 공식은 연속 평균에서 가중치로 우리가 가지고있는 샘플의 가중 평균을 만듭니다.

승수N = 알파시간N-시간N-1

합집합N = valN + 합N-1*승수N

세다N = 1 + 카운트N-1*승수N

avgN = 합계N/세다N

나는 떠날 것이다 alpha 단독 값을 값으로, 누락 된 데이터를 작성하십시오.

샘플링 할 수없는 시간 동안 어떤 일이 발생하는지 모르기 때문에 해당 샘플을 0으로 채우거나 이전 값을 안정시키고 EMA에 해당 값을 사용할 수 있습니다. 또는 새로운 샘플이 있으면 일부 후진 보간, 결 측값을 채우고 EMA를 다시 작성하십시오.

내가 얻으려고하는 것은 입력이 있다는 것입니다. x[n] 구멍이 있습니다. 당신이 누락 된 데이터를 얻을 수있는 방법은 없습니다. 따라서 Zero Order Hold를 사용하거나 0으로 설정하거나 간의 보간을 할 수 있습니다. x[n] 그리고 x[n+M], 어디 M 누락 된 샘플의 수와 N 차이의 시작입니다. 아마도 값을 사용하기도 할 수도 있습니다 n.

이것은 내 TODO 목록의 열린 문제와 유사합니다. 나는 어느 정도의 계획이 어느 정도 운동을했지만 아직이 제안을 뒷받침하기 위해 수학적 작업을하지 않습니다.

업데이트 및 요약 : 보상 계수와 독립적으로 스무딩 계수 (알파)를 유지하고 싶습니다 (여기서 베타라고 함). 여기에서 이미 받아 들여진 Jason의 훌륭한 답변은 저에게 훌륭하게 작동합니다.

첫 번째 단계.

  • 마지막 샘플을 채취 한 이후 시간을 측정 할 수 있다면 (일정한 샘플링 시간의 둥근 배수로 - 마지막 샘플이 8 단위 이후 7.8ms) 스무딩을 여러 번 적용하는 데 사용될 수 있습니다. 이 경우 공식을 8 번 적용하십시오. 당신은 현재 값에 대한 스무딩 편향을 효과적으로 만들었습니다.

두번째 단계.

  • 더 나은 스무딩을 얻으려면 이전의 경우 공식을 8 번 적용하면서 알파를 조정해야합니다.

이 스무딩 근사치는 무엇을 놓치게됩니까?

  • 위의 예에서 이미 7 개의 샘플을 놓쳤습니다.
  • 이것은 1 단계에서 a 단조롭게 하는 현재 값을 다시 적용하는 것은 추가 7 배입니다
  • 근사 계수를 정의하는 경우 베타 그것은 함께 적용됩니다 알파 (알파 대신 알파*베타로서), 우리는 7 개의 놓친 샘플이 이전 샘플과 현재 샘플 값 사이에서 원활하게 변하고 있다고 가정합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top