gpt4 book ai didi

C++,确定具有最高零交叉的部分

转载 作者:太空狗 更新时间:2023-10-29 21:44:46 25 4
gpt4 key购买 nike

我不是信号处理方面的专家。我正在使用 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;
}

最佳答案

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

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

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

Mathematica graphics

我们想要的是大约 480 和 600 之间的区域,其中零密度高于前面。该算法的第一步是计算零的位置。您可以通过已有的东西来做到这一点,但不是计算,而是存储 i 的值。遇到零的地方。

这会给你一个零位置列表

Mathematica graphics

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

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

Mathematica graphics

在下一步中,您将通过过滤后的数据找到最大值。在这种情况下,它约为 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过滤区域填充)

Mathematica graphics

结论

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

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

关于C++,确定具有最高零交叉的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19356030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com