我有以下移动平均数字滤波器的 C++ 实现。
template<uint32_t WINDOW_SIZE>
class MovingAverage{
public:
MovingAverage(){
for(uint32_t elem = 0; elem < WINDOW_SIZE; elem++){
buffer[elem] = 0;
}
input_value = 0;
sum = 0;
average = 0;
index = 0;
}
void setInput(float input){
input_value = input;
}
void calculate(){
sum -= buffer[index];
buffer[index] = input_value;
sum += buffer[index];
average = sum/WINDOW_SIZE;
index = (index + 1) % WINDOW_SIZE;
}
float getOutput(){
return average;
}
private:
float buffer[WINDOW_SIZE];
float input_value;
float sum;
float average;
uint32_t index;
};
我在 ARM Cortex A9 平台上遇到了一个奇怪的行为。如果我首先将来自 adc 的值(这些值在 514 左右波动)传递到窗口大小等于 32 个样本的移动平均值中,然后我将值 128 强制传递给滤波器,然后滤波器输出值约为 126 而不是 128 . 此时buffer在其所有项目中包含值 128,但sum包含与预期不同的值32*128。如果我在我的 PC 上运行过滤器算法,它会按预期工作。有谁知道这种行为的原因是什么?
