2012-07-14 49 views

Trả lời

11

Tôi cần trích xuất tín hiệu từ dữ liệu tiêu thụ CPU rất ồn. Đây là bộ lọc trung gian Jeff McClintock ...

Khởi tạo trung bình và trung bình về 0, sau đó cho mỗi mẫu 'inch' trung bình về phía mẫu đầu vào bằng một gia số nhỏ. Cuối cùng nó sẽ giải quyết tại một điểm mà khoảng 50% các mẫu đầu vào là lớn hơn, và 50% là ít hơn so với trung bình. Kích thước của gia số phải tỷ lệ thuận với trung bình thực tế. Vì chúng tôi không biết trung bình thực tế, tôi sử dụng mức trung bình là ước tính sơ bộ. Kích thước bước được tính bằng 0,01 lần so với ước tính. Kích thước bước nhỏ hơn là chính xác hơn, nhưng mất nhiều thời gian để giải quyết.

float median = 0.0f; 
float average = 0.0f; 

// for each sample 
{ 
    average += (abs(sample) - average) * 0.1f; // rough running average magnitude. 
    median += _copysign(average * 0.01, sample - median); 
} 

enter image description here

+0

Trong khi giải pháp này rất hiệu quả, hãy cẩn thận của các chú ý sau đây: 1) Tốc độ hội tụ phụ thuộc vào biên độ tín hiệu (so sánh phản ứng bước với hiệu số và biên độ khác nhau), do đó không hội tụ chống lại tín hiệu gần bằng không! 2) đối với tín hiệu đầu vào gần không đổi, ước lượng này giới thiệu jitter với biên độ trung bình * 0,01 và tần số của tỷ lệ mẫu 3) làm lệch hướng xung ngắn (mà ban đầu là trung bình).) – orzechow

+0

Vâng, cải tiến để loại bỏ jitter là giới hạn kích thước bước (trung bình * 0,01) thay vì không lớn hơn tín hiệu lỗi (mẫu - trung vị) tức là: std :: max (trung bình * 0,01, fabs (mẫu - trung vị)). –

Các vấn đề liên quan