#include <stdio.h>
#define FILTER_WINDOW_SIZE 5
static const float weights[FILTER_WINDOW_SIZE] = {0.4, 0.3, 0.2, 0.08, 0.02};
static float history[FILTER_WINDOW_SIZE] = {0};
static uint8_t data_index = 0;
float WeightedMovingAverage(float new_sample) {
history[data_index] = new_sample;
data_index = (data_index + 1) % FILTER_WINDOW_SIZE;
float filtered_value = 0;
for (int i = 0; i < FILTER_WINDOW_SIZE; i++) {
int idx = (data_index + i) % FILTER_WINDOW_SIZE;
filtered_value += history[idx] * weights[i];
}
return filtered_value;
}
int main() {
float x[] = {10, 12, 15, 13, 11}; // 采样值序列
float y_prev = 0; // 初始滤波输出值
for (int i = 0; i < sizeof(x) / sizeof(x[0]); i++) {
float y = WeightedMovingAverage(x[i]);
printf("Input: %.2f, Output: %.2f\n", x[i], y);
}
return 0;
}
|