用滑动窗口法降噪
#include <vector>
#include <numeric> // 用于accumulate求和
#include <algorithm> // 用于max/min
// 滑动窗口均值滤波:data=原始数据,windowSize=窗口大小(需为正整数)
std::vector<double> slidingWindowFilter(const std::vector<double>& data, int windowSize) {
std::vector<double> result;
int n = data.size();
if (n == 0 || windowSize <= 0) return result;
windowSize = std::min(windowSize, n); // 窗口不超过数据长度
double windowSum = std::accumulate(data.begin(), data.begin() + windowSize, 0.0);
result.push_back(windowSum / windowSize); // 第一个窗口均值
// 滑动窗口:移除左边界旧值,加入右边界新值(减少重复计算)
for (int i = windowSize; i < n; ++i) {
windowSum = windowSum - data[i - windowSize] + data[i];
result.push_back(windowSum / windowSize);
}
return result;
}
// 测试代码
#include <iostream>
int main() {
std::vector<double> rawData = {1.2, 1.5, 1.3, 1.4, 1.6, 1.5, 1.7}; // 含微小噪声的原始数据
std::vector<double> filteredData = slidingWindowFilter(rawData, 3); // 窗口大小3
std::cout << "原始数据:";
for (double d : rawData) std::cout << d << " ";
std::cout << "\n滤波后: ";
for (double d : filteredData) std::cout << d << " "; // 输出:1.333 1.4 1.433 1.5 1.6
return 0;
}
这段代码的目的是每隔 1 秒采集一次Yc(204)的值,存入数组并计算平均值后通过SetYc(360)输出。
local maxCount = 15; //最大存储数量
local dw_count = GetTick();// 初始化时间戳
local yc_count = 0; // 已采集数据数量
local arrayYc = []; //存储采集值的数组
arrayYc.resize(maxCount);//给数组分配大小
//数组值初始化
for(local i = 0; i < maxCount; i++)
{
arrayYc[i] = 0.0;
}
//给输出值的初始值,允许启动时先输出一次原始值,避免无值
SetYc(360, Yc(204));
while(1)
{
if((GetTick() - dw_count) > 1000)
{
dw_count = GetTick();
// 采集当前值并存储
if(yc_count < maxCount)
{
arrayYc[yc_count] = Yc(204);
yc_count++;
}
else
{
// 当达到最大数量时,移除最旧的值,新增最新值(实现滑动窗口效果)
for(local i = 0; i < maxCount - 1; i++)
{
arrayYc[i] = arrayYc[i + 1]; // 数据前移
}
arrayYc[maxCount - 1] = Yc(204);// 新增最新值
}
//计算平均值
local sum = 0.0;
local avg = 0.0;
for(local i = 0; i < yc_count; i++)
{
sum = sum + arrayYc[i];
}
avg = sum / (yc_count * 1.0);//强制浮点数除法
SetYc(360, avg);//输出平均值
}
Delay(10);
}
