当前位置: 首页 > news >正文

用滑动窗口法降噪

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

http://www.dtcms.com/a/582700.html

相关文章:

  • 网站建设与运营意义商标设计图片
  • 网站模板下载软件成都网站建设服务商
  • 整体设计 全面梳理复盘 之22 九宫格框架搭建与一体化开发环境设计 编程 之1
  • 数据库参数OPTIMIZER_INDEX_COST_ADJ的一段故事
  • 江西中联建设集团有限公司网站百度网站开发合同范本
  • 西安代做毕业设计网站黑龙江省建设会计协会网站
  • 网站建设7大概要多久做家装的网站有哪些内容
  • 网站description是指什么易天时代网站建设
  • 【期末网页设计作业】HTML+CSS 唐诗学习网站主题的开发(附源码与效果演示)
  • 如何做平台推广seo如何快速排名百度首页
  • zencart网站qq企业邮箱官网
  • 想要极度深入了解一个研究方向,是否要读完所有文献?
  • 三亚网站开发公司温州论坛吧
  • 多人协作Git开发流程指南
  • seo博客网站青岛网络推广公司哪家好
  • 口碑好的建筑设备监控管理系统服务商排名
  • 新手如何做企业网站海南网红打卡旅游景点
  • 济南网站排名推广销售外包服务
  • 学习日报 20251107|Nacos基础认识
  • QPainter
  • 深入评测openEuler 24.03 LTS SP2:在云原生时代构筑高性能的应用与实战操作
  • 网站建设网页链接wordpress flash加载插件
  • wordpress积分阅读成都自动seo
  • [Linux——Lesson22.进程信号:信号保存 信号捕捉]
  • 10.【NXP 号令者RT1052】开发——实战-RT 看门狗(RTWDOG)
  • 维护一个网站需要多少钱黄山网站建设哪家强
  • 深夜思(原创诗)
  • 阿里云做的网站怎么样做网站都需要具备什么
  • openEuler 集群部署Nova计算服务:控制节点与计算节点实战操作
  • 怎么建设网站商城衡阳企业网站建设