用滑动窗口法降噪

#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);
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++ 老炮儿的技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值