加权移动平均滤波C++
时间: 2024-09-10 17:22:17 浏览: 45
完整的实时深度图平滑代码(像素滤波+加权移动平均)
加权移动平均滤波是一种数字信号处理技术,它通过赋予最近的数据点更大的权重,来平滑信号并减少噪声的影响。在C++中,你可以使用数组或向量来实现这个过程。以下是基本步骤:
1. 定义一个窗口大小(例如n),这是滤波器会考虑的历史数据点的数量。
2. 创建一个浮点数数组或向量来存储当前的平均值,初始值可以设置为0或第一个输入数据。
3. 当有新的数据到来时,计算加权平均:
- 如果新数据是第一个数据点,直接替换平均值。
- 否则,用新数据乘以其对应的权重(通常是倒序从1到n-1,总和为1),然后加上旧平均值乘以前一个权重,减去已过期数据的权重乘积。
```cpp
#include <vector>
#include <cmath>
double weighted_average(const std::vector<double>& data, int window_size) {
if (window_size > data.size()) return data.back(); // 如果窗口大于数据长度,返回最后一个值
double sum = 0;
double weight_sum = 0; // 初始化权重之和
for (int i = data.size() - window_size; i < data.size(); ++i) {
double weight = 1 / static_cast<double>(window_size); // 步长为1,所以权重都是等比例递减
sum += data[i] * weight;
weight_sum += weight;
}
return sum / weight_sum;
}
void apply_weighted_average(std::vector<double>& signal, int window_size) {
signal.push_back(weighted_average(signal, window_size));
// 对于已有的历史数据,不断更新平均值
for (size_t i = window_size; i < signal.size(); ++i) {
signal[i] = weighted_average(signal.begin(), i + 1);
}
}
// 使用示例:
std::vector<double> signal = {1, 2, 3, 4, 5}; // 假设这是一个时间序列数据
apply_weighted_average(signal, 3); // 窗口大小为3
```
阅读全文