2014-10-10 4 views
0

코드를 묻지는 않지만 통찰력을 얻으 려합니다. 이미 유사한 문제가 발생했기 때문일 수 있습니다.바운드 수치 통합

임베디드 시스템에서 실시간으로 실행되는 코드입니다. 안전상의 이유로 새로운 검사가 실시되어야합니다.

이 확인은 특정 변수의 통합 값을 기반으로합니다. 정수는 마지막 "T_s"초를 확장해야합니다. 즉, 새주기마다 변수가 T_s 초 전에 값을 제거하고 현재 값을 추가해야합니다.

순진한 방법은 마지막 T_s * 주파수 부동 소수점 값을 배열에 저장하는 것입니다.

62.5Hz에서 실행되는이 기능은 많은 소중하고 제한된 메모리를 빠르게 낭비합니다.

명백한 정확도의 비용으로 그러한 수표의 메모리 사용량을 크게 줄이는 알려진 접근법이 있습니까?

이 값은 실제 시스템에서 측정 된 값이며 함수에 의해 생성되지는 않습니다.

N 개의 평균을 저장하고 M 개의 포인트를 각각 저장 한 다음 N 개의 평균을 통합한다고 생각하면 메모리 요구 사항이 N + M 개의 숫자로 줄어들어 T_s * 주파수보다 훨씬 작아 질 수 있지만 궁금합니다.

  • 이 것이 연구되고 "최적"포인트가 발견 된 경우 (예 : M의 함수로). 나는 serached지만, 분명히 "google-fu"는 부러졌다. "수치 적 통합"을 포함한 어떤 것도 내가 찾던 것으로 이끌지 않는다.

  • 더 나은 방법

이 프로젝트의 공식 언어이기 때문에 나는 C와이 게시물 태그가있는 경우는, ANSI-C에서 작동하지 않는 솔루션은 나를 위해 실행 가능한 아니다 운수 나쁘게.

+1

통합 된 값을 겹쳐서 계산하는 간격입니까, 차례로 겹치는 간격입니까? – Evert

+0

@Evert 간격이 하나뿐입니다. 검사는 "t-T_s"에서 "t"까지의 적분에 대해 현재 시간 소인과 같습니다. 마지막 T_s * sampletime 값의 배열과 그 값의 합을 포함하는 별도의 변수로 구현했습니다. 각 단계에서 가장 오래된 것을 빼고, 새로받은 값을 더하고, 배열을 하나씩 이동하여 새로운 값을 맨 위에 추가합니다. – Federico

+0

@ N 평균을 버리고 대신 하나씩 겹치지 않을 것입니다. – Federico

답변

0

세 개의 (?) 변수로 통계 계산이 설명 된 인터넷 페이지를 찾을 수없는 것 같습니다. 어쩌면 당신은 당신의 google-fu가 재기 할 때 할 것이다.

아아, 100 %의 정확도를 필요는 없지만 평균 값으로 살 수 있다면, 당신은 같은 것을 할 수있는이 당신에게 나이 값의 대략적인 평균을 줄 것이다

avg = (avg * 0.95) + ((newValue - avg) * 0.05); 

를 가장 최근의 하나 (newValue)의 영향력은 1/20 이하입니다. 20을 곱한 결과는 기본적으로 평균 적분입니다. 물론 N의 샘플 수를 고려하여 두 상수를 1-(1/N)1/N의 값으로 각각 조정할 수 있습니다.

편집 :

"On-line" (iterator) algorithms for estimating statistical median, mode, skewness, kurtosis?

https://math.stackexchange.com/questions/106700/incremental-averageing

도 유용한 답변을 가질 수있다.

+0

그 링크들 (그리고 부분적으로 당신의 아이디어)에 대한 문제는 T_s 초 전에 일어난 일을 "잊지"않는다는 것입니다. 그러나 그들은 그 정보를 유지할 것입니다. 오래된 가치가 점점 더 중요해질지라도 사실입니다. 최대한 빨리 테스트 해 보겠습니다. – Federico

+0

Btw, "N 개의 평균을 저장하고, 각각 M 개의 점을 그리고 나서 N 개의 평균을 적분합니다." 60 샘플의 전체 초를 버려야 할 필요가 있다면 매 초당 60 샘플을 초당 단일 값에 더하거나 평균화 한 다음 해당 간격의 * 초당 하나의 값만 저장하면됩니다. – JimmyB

+0

Btw # 2, "하나씩 배열로 이동". 전체 배열의 내용을 반복해서 이동하지 않으려면 FIFO 버퍼, 링 버퍼, 순환 버퍼의 구현을 사용하는 것이 좋습니다. – JimmyB