在 C 中检查输入方波周期的快速方法是什么?

What is a quick way to check the period of an input square wave in C?

提问人:cercio 提问时间:11/9/2023 更新时间:11/9/2023 访问量:101

问:

我有一个采样方波(假设占空比为 80%)作为输入,我需要检查信号周期是否为 20 秒。由于我每 100 毫秒采样一次,因此我将信号保存在 200 个数组中。然后,数组将如下所示:

int signal_buffer [200] = {0,0, . . . , 1500,1500,1500, . . . , 0}

1500 是我的“高”状态。当然,如果波的高部分从记录缓冲区的开头或中间的某个地方开始,这个信号缓冲区可能看起来不同,那么我会有类似的东西:

int signal_buffer [200] = {1500,1500, . . . , 0,0,0, . . . , 1500,1500}

我现在的问题是,实际检查该信号的周期是否实际上是 20 秒的好算法是什么?我试着计算高点之间的零,并试图从那里推断出这段时间,如果缓冲区正好覆盖 20 秒,这项任务是否可能?

C 算法 信号 频率

评论

2赞 Eugene Sh. 11/9/2023
任何“快速方法”仍然需要遍历整个数组。所以 O(n) 是。
5赞 Weather Vane 11/9/2023
如果信号的周期应该是 20 秒,则需要采样超过 20 秒。然后寻找同一方向上的两个转变(从低到高或从高到低)。
0赞 cercio 11/9/2023
谢谢。因此@WeatherVane假设我使缓冲区覆盖 30 秒。确定两个低点到高点并简单地确保它们相隔 200 个样本就足够了吗?
1赞 Weather Vane 11/9/2023
为什么不等待转换,开始计时,然后等待同一方向的下一次转换,而不是使用数组。(您需要预防性超时)。
4赞 Weather Vane 11/9/2023
你不需要这样的计时器。当信号转换时,读取时钟。当它下一次转换时,再次读取时钟并减去。计时器的原因是为了“超时”,这样如果信号停止,您就不会永远等待。但这也取决于您使用的是 PC 还是微型。在微观上,您可能会使用中断来检测转换,并将“滚动周期”放置在程序主要部分可以监控的位置。

答:

1赞 Eric Postpischil 11/9/2023 #1

...如果缓冲区正好覆盖 20 秒,这项任务是否可行?

函数 f 是周期性的,周期为 p iff f(x+p) = f(x) (因此对于任何整k,fx+kp) = f(x)。为了测试这一点,您必须至少在某个点 x 和另一个点 x+p 处具有函数的值。如果在一个时间段内只有函数的值,则在必要点处没有值,因此无法测试此属性。

您拥有的间隔可能包含所有一个值班部分(值 1500)或所有一个非值班部分(值 0),并且您可以测试该部分是否为预期持续时间。但是你无法测试互补部分的长度是否正确,因为你没有迹象表明它在你所拥有的间隔之外的开始或结束。

此外,关于是否只观察到值 0 或 1500 也存在一些问题。物理测量值往往会有所不同。即使信号控制良好,正好是 1500 个单位,并且您的测量设备测量正确,预计在从 0 到 1500 的过渡间隔内,反之亦然,测量设备会报告介于两者之间的一些值。你会希望对此有一定的容忍度。