平滑算法

2023-11-26

我编写了这段代码来平滑曲线。 它需要一个点旁边的 5 个点并将它们相加并求平均值。

/* Smoothing */
void smoothing(vector<Point2D> &a)
{
    //How many neighbours to smooth
    int NO_OF_NEIGHBOURS=10;
    vector<Point2D> tmp=a;
    for(int i=0;i<a.size();i++)
    {

        if(i+NO_OF_NEIGHBOURS+1<a.size())
        {
            for(int j=1;j<NO_OF_NEIGHBOURS;j++)
            {
                a.at(i).x+=a.at(i+j).x;
                a.at(i).y+=a.at(i+j).y;
            }
            a.at(i).x/=NO_OF_NEIGHBOURS;
            a.at(i).y/=NO_OF_NEIGHBOURS;

        }
        else
        {
            for(int j=1;j<NO_OF_NEIGHBOURS;j++)
            {
                a.at(i).x+=tmp.at(i-j).x;
                a.at(i).y+=tmp.at(i-j).y;
            }
            a.at(i).x/=NO_OF_NEIGHBOURS;
            a.at(i).y/=NO_OF_NEIGHBOURS;
        }

    }

}

但我对每个点都得到非常高的值,而不是与前一点相似的值。形状被最大化了很多,这个算法出了什么问题?


这里看起来像是有限脉冲响应 (FIR) 滤波器的低低音实现,该滤波器实现了棚车窗功能。从DSP的角度思考问题,你需要过滤你的传入vector with NO_OF_NEIGHBOURS相等的 FIR 系数,每个系数的值为1/NO_OF_NEIGHBOURS。通常最好使用已建立的算法,而不是重新发明轮子。

这是一个相当蹩脚的实现,我很快就敲定了过滤器加倍的实现。您可以轻松修改它以过滤您的数据类型。该演示显示了对上升锯齿函数 (0,.25,.5,1) 的几个周期的过滤,仅用于演示目的。它可以编译,所以你可以使用它。

#include <iostream>
#include <vector>

using namespace std;

class boxFIR
{
    int numCoeffs; //MUST be > 0
    vector<double> b; //Filter coefficients
    vector<double> m; //Filter memories

public:
    boxFIR(int _numCoeffs) :
    numCoeffs(_numCoeffs)
    {
        if (numCoeffs<1)
            numCoeffs = 1; //Must be > 0 or bad stuff happens

        double val = 1./numCoeffs;
        for (int ii=0; ii<numCoeffs; ++ii) {
            b.push_back(val);
            m.push_back(0.);
        }
    }    

    void filter(vector<double> &a)
    {
        double output;

        for (int nn=0; nn<a.size(); ++nn)
        {
            //Apply smoothing filter to signal
            output = 0;
            m[0] = a[nn];
            for (int ii=0; ii<numCoeffs; ++ii) {
                output+=b[ii]*m[ii];
            }

            //Reshuffle memories
            for (int ii = numCoeffs-1; ii!=0; --ii) {
                m[ii] = m[ii-1];
            }                        
            a[nn] = output;
        }
    }


};

int main(int argc, const char * argv[])
{
    boxFIR box(1); //If this is 1, then no filtering happens, use bigger ints for more smoothing

    //Make a rising saw function for demo
    vector<double> a;
    a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
    a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
    a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
    a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);

    box.filter(a);

    for (int nn=0; nn<a.size(); ++nn)
    {
        cout << a[nn] << endl;
    }
}

使用这条线增加滤波器系数的数量可以看到逐渐更加平滑的输出。只有 1 个滤波器系数,没有平滑。

boxFIR box(1);

该代码足够灵活,如果您愿意,您甚至可以更改窗口形状。通过修改构造函数中定义的系数来做到这一点。

注意:这将为您的实现提供略有不同的输出,因为这是一个因果过滤器(仅取决于当前样本和先前样本)。您的实现不是因果关系,因为它会及时查看未来的样本以求平均值,这就是为什么您需要针对接近向量末尾的情况的条件语句。如果您想要输出类似于您尝试使用此算法对过滤器执行的操作,请通过此算法反向运行您的向量(只要窗口函数是对称的,这就可以正常工作)。这样你就可以获得类似的输出,而无需算法中令人讨厌的条件部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平滑算法 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 期望最大化算法的数值示例[重复]

    这个问题在这里已经有答案了 由于我不确定给出的公式 有人可以提供 EM 算法的简单数字示例吗 一个非常简单的具有 4 或 5 个笛卡尔坐标的坐标就可以了 那这个呢 http en wikibooks org wiki Data Mining

随机推荐

  • 如果有人在我的浏览器中禁用了cookie,我该如何在java中进行会话?

    我想知道如果有人禁用了我的浏览器中的 cookie 那么 cookie 不适用于我的浏览器 那么我如何在 java 中进行会话 我正在为服务器端编程编写 servlet 那么我的会话如何进行 它如何识别用户 由于 JSESSION ID 存
  • 如何从 Apache Spark 中的数据帧中选择相同大小的分层样本?

    我在 Spark 2 中有一个数据框 如下所示 其中用户有 50 到数千个帖子 我想创建一个新的数据框 其中包含原始数据框中的所有用户 但每个用户只有 5 个随机抽样的帖子 user id post id text 67778705 447
  • 将文本附加到富文本框中的开头

    private void button1 Click object sender EventArgs e richTextBox1 AppendText r n richTextBox1 Focus string s Enter richT
  • 如何在R中生成具有指定对数正态分布的随机数?

    我想从对数正态分布中随机生成 20 个数字 几何平均值为 10 几何标准差为 2 5 我应该使用哪个 R 函数来完成此任务 The rlnorm功能 rlnorm 20 log 10 log 2 5 R 中更一般的分布通常可用于d 强度 p
  • 动态添加删除线性布局的控件

    我有 3 个布局 当单击按钮访问某些布局时 我需要删除其中的控件 并且知道如何实现该布局 这是我使用的代码
  • git bare 存储库、工作树和跟踪分支

    我正在使用一个代码库 在该代码库中我需要出于不同的目的同时处理多个分支 因此 我克隆到一个裸存储库 然后设置一些工作树 git clone bare ssh email protected project repo repo git cd
  • 无法从 Google Cloud Function 访问存储在 Secrets Manager 中的密钥

    在测试我编写的尝试访问存储在 Secret Manager 中的密钥的 Google Cloud Function 时 出现以下错误 Error 7 PERMISSION DENIED Permission secretmanager ve
  • Swift 1.2 中的神秘崩溃 - 仅在发布版本中

    更新到 Xcode 6 3 beta 1 和 Swift 1 2 后 我的所有应用程序都神秘崩溃仅在发布版本中 在更新我的 Swift 1 2 代码后 它们在调试版本中工作正常 调试器没有任何感觉where崩溃正在发生 但原因尚不清楚 一些
  • jQuery点击表格单元格事件

    我有一个如下所示的html代码 tbody tr td class name Joe td td class surname White td td class age 25 td tr tbody 并且有这样的 jQuery 代码 tr
  • 有没有更好的方法用 Python 编写这个 URL 操作?

    我很好奇是否有一种更简单的方法可以从 url 中删除特定参数 我想出的是以下内容 这似乎有点冗长 使用的库或者更Pythonic的版本值得赞赏 parsed urlparse url if parsed query params dict
  • Docker - 如何将文件从映像复制到主机?

    我的问题与这个问题将文件从容器复制到主机 我有一个 Dockerfile 它可以获取依赖项 从源代码编译构建工件并运行可执行文件 我还想复制构建工件 在我的例子中它是 zip由 生产sbt dist在 target 中 但我认为这个问题也适
  • 如何进行视野自动对焦?

    当用户打开页面时 我需要聚焦该字段 我不知道它是否会改变任何东西 但它位于我从 PHP 文件加载的模式窗口内 有简单的方法吗 使用 JavaScript 您可以实现此目的 document onload function document
  • 使用 Jasmine 在 JavaScript 中存根 WebSocket

    我尝试测试是否onmessage是一个适当的函数 这是一个测试 describe init address window function beforeEach function address ws test address window
  • MigLayout 推送 VS 增长

    这两个约束有什么区别 从文档中 PUSH 使组件所在的行和 或列随着 权重 而增长 GROW 设置组件相对于同一单元中的其他组件的增长程度 那么 主要的想法是缩小组件内部和外部的尺寸 重要的是要明白fill 列 行 grow push协同工
  • 当未指定默认命名空间时,函数 getMessageData 必须使用前缀[重复]

    这个问题在这里已经有答案了 我收到这个错误 WEB INF jsp account index jsp 6 0 函数 getMessageData 必须 当未指定默认名称空间时与前缀一起使用
  • 二叉树插入算法

    我最近完成了我正在从事的一个项目的二叉搜索树的实现 一切都很顺利 我学到了很多东西 然而 现在我需要实现一个常规的二叉树 由于某种原因 这让我感到困惑 我正在寻找一种方法来执行我的 InsertNode 功能 通常在 BST 中 您只需检查
  • 动态改变listview的分隔线高度?

    这个问题已被问到这里a link 我也想澄清一下问题 我有 10 个列表项Listview我想要拥有deviderheight每个列表项的不同之处就像第一个项目应该是setDividerheight 2 第二次setDividerheigh
  • Maven:在pom.xml中设置settings.xml位置?

    是否可以设置位置settings xml文件内的pom xml file 我知道你可以通过命令行输入来做到这一点mvn s location of settings xml 但我想知道是否可以将其设置在pom xml所以我不必继续通过命令行
  • 如何使用媒体源 API 将两个视频文件数据附加到源缓冲区?

    我有两个视频 名称为 v11 webm 和 v12 webm 我想要的是这两个视频应该无缝运行 没有任何间隙 我正在遵循将数据附加到源缓冲区的媒体源 api 方法 我指的是对此给出的演示link 我修改了该示例并删除了对视频进行分块的部分
  • 平滑算法

    我编写了这段代码来平滑曲线 它需要一个点旁边的 5 个点并将它们相加并求平均值 Smoothing void smoothing vector