【问题标题】:C++, determine the part that have the highest zero crossesC++,确定具有最高零交叉的部分
【发布时间】:2013-10-14 08:18:37
【问题描述】:

我不是信号处理方面的专家。我正在使用 c++ 对一维信号进行简单处理。我真的很想知道如何确定具有最高过零率(最高频率!)的部分。有没有简单的方法或方法来告诉这部分的开始和结束。

This image说明我信号的形式,this image是我需要做的(开始和结束两个索引)

已编辑:

其实我对开头和结尾的宽度一无所知,它是如此多变。 我可以计算过零的数量,但我不知道如何定义它的范围

 double calculateZC(vector<double> signals){
        int ZC_counter=0;
        int size=signals.size();

        for (int i=0; i<size-1; i++){
                if((signals[i]>=0 && signals[i+1]<0) || (signals[i]<0 && signals[i+1]>=0)){
                    ZC_counter++;
                }
        }                       

        return ZC_counter;
    }

【问题讨论】:

  • 我不确定我是否理解你。我认为首先你需要选择一个范围来检查,从 0 到 10、10 到 20 等等......我在照片中看到的两个红色条的“宽度”。当您知道该宽度时,您必须在每个“范围”中检查有多少部分完成了 f(a)>0 和 f(b)0 和 f(1 )
  • 过零可疑部分的范围如此多变。我不知道它的宽度。如果我将它分成 4 个或更多子部分,我不确定是否找到合适的部分,它可以在两个相邻的子部分中找到

标签: c++ image-processing signal-processing


【解决方案1】:

这是一个相当简单的策略,可能会给您一些起点。算法大纲如下

  • 输入:数据点的向量{y0,y1,...}
  • 参数:
    1. 窗口大小sigma
    2. 阈值0&lt;p&lt;1 定义何时开始查找区域。
  • 输出:过零次数最多的区域的起点和终点{t0,t1}

我不会给出任何 C++ 代码,但该方法应该易于实现。例如,让我们使用以下函数

我们想要的是大约 480 到 600 之间的区域,其中零密度高于前面。算法的第一步是计算零点的位置。您可以通过已有的值来执行此操作,但不是计算,而是存储遇到零的i 的值。

这会给你一个零位置列表

从此列表(您可以直接在上面的 for 循环中执行此操作!)您创建一个与输入数据大小相同的列表,看起来像 {0,0,0,...,1,0,..,1,0,..}。输入数据中的每个过零位置都用 1 标记

下一步是使用大小为sigma 的平滑过滤器对该列表进行平滑处理。在这里,你可以用你喜欢的;在最简单的情况下,moving average 或高斯滤波器。您选择的sigma 越高,您的 环顾 窗口就越大,该窗口测量某个点周围有多少过零。让我给出这个滤波器的输出以及原始的零位置。请注意,我在这里使用了大小为 10 的高斯滤波器

在下一步中,您将通过过滤后的数据找到最大值。在这种情况下,它约为 0.15。现在您选择第二个参数,它是该最大值的某个百分比。比如说p=0.6

最后一步是遍历过滤后的数据,当值大于p 时,您开始记住一个新区域。只要值低于p,您就结束这个区域并记住开始和结束点。完成数据浏览后,您会看到一个区域列表,每个区域都由起点和终点定义。现在您选择扩展最大的区域,您就完成了。

(或者,您可以将过滤器大小添加到最终区域的每一端)

对于上面的例子,我得到11个区域如下

{{164,173},{196,205},{220,230},{241,252},{259,271},{278,290},
{297,309},{318,327},{341,350},{458,468},{476,590}}

其中扩展最大的是最后一个{476,590}。最终结果看起来(带有 1/2 过滤器区域填充)

结论

请不要因为我的回答太长而气馁。我试图详细解释一切。实现实际上只是一些循环:

  • 一个循环创建过零列表{0,0,..,1,0,...}
  • 移动平均滤波器的一个嵌套循环(或者您使用一些库高斯滤波器)。这里可以同时提取最大值
  • 一个循环提取所有区域
  • 如果您在上述步骤中尚未提取最大区域,则循环提取最大区域

【讨论】:

  • 我几乎有类似的想法,我正在编写它。你的想法已经澄清了一些方面,我会尽量考虑你解释的,我会回来的
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多