나는 자체 시스템 모니터링 도구를 만드는 중입니다. 내가 장치 (이 경우에는 내 CPU %)에서 받고있는 원시 데이터의 연속 스트림에서 필터 (예 : 가우스 필터 또는 유사)를 실행하려고합니다.연속 스트리밍 데이터를 필터링 (매끄럽게)하는 가장 효율적인 방법은 무엇입니까
데이터 값 컬렉션은 n
엘리먼트입니다. 이 코드 조각이 실행될 때마다 새로운 cpu 값이 추가되고 가장 오래된 것을 제거하여 n
길이의 콜렉션을 본질적으로 deque([float('nan')] * n, maxlen=n)
n
이 그래프의 길이로 유지합니다.
다음 가우시안 필터를 통해 전체 컬렉션을 필터링하여 평활화 된 데이터 포인트를 만든 다음 플롯하여 컴퓨터에서 대부분의 시스템 모니터 cpu % 그래프와 유사한 애니메이션 그래프를 만듭니다.
이것은 잘 작동합니다 ... 그러나 새로운 데이터 값이 추가 될 때마다 전체 데이터 세트에서 필터를 실행하는 대신 들어오는 데이터를 필터링하는보다 효율적인 방법이 있어야합니다 (그래프 업데이트 매 2 초마다)
나는 전체 목록을 필터링하지 않고 그것을 할 수있는 방법을 생각할 수 있지만, 그것들은 매우 효율적인지 확신 할 수 없다. 거기서 저를 위해 작동 할 신호 처리 세계에서 무엇이 있습니까? 사과는 나의 설명이 약간 혼란 스럽다면, 나는 이것에 대해 아주 새로운 것이다.
from scipy.ndimage.filters import gaussian_filter1d
# Not my actual code but hopefully describes what im doing
def animate(): # function that is called every couple of milliseconds to animate the graph
# ... other stuff
values.append(get_new_val) # values = collection of data vals from cpu
line.set_ydata(gaussian_filter1d(values, sigma=4)) # line = the line object used for graphing
# ... other stuff
graph_line(line) # function that graphs the line
tl; dr : 매 패스마다 전체 데이터 세트를 필터링하는 대신 원시 스트리밍 데이터를 매끄럽게 만드는 최적의 방법을 찾고 있습니다.
오버랩 버퍼를 살펴보십시오. wikipedia의 [Overlap-add] (https://en.wikipedia.org/wiki/Overlap-add_method) 및 [scipy spectral] (https://docs.scipy.org) /doc/scipy/reference/signal.html#spectral-analysis) 함수는'noverlap'을 사용합니다. – denis