C

时间:2018-06-29 10:11:16

标签: c algorithm filtering

我想创建一个值的过滤器,以防止它立即更改。我有一个在20毫秒执行的任务。最终目的是创建一个过滤器,该过滤器将接收时间常数,以显示随着delta的抛物线变化(数据更改步骤)达到目标值应经过的时间。例如,将过滤配置为在初始值0的情况下达到8的值10。

我已经实现了PT1过滤,但是它仅减少了增量变化(开始时,随着数据更改步长,增量变大,并且直到达到目标值时,增量越来越小)。我要达到的过滤条件是在过滤时间的开始和结束时具有较小的增量,而在过滤时间的中间具有最大的增量。

我的问题是是否已经有这样的算法?或者您能给我一些如何处理该问题的建议。

目标增量随时间变化:

enter image description here

2 个答案:

答案 0 :(得分:0)

您的过滤率f'( t )是一个二次函数,在时间0和时间T(8秒)处的值为0,并且时间0和时间T之间的曲线下面积为F (8个单元)。因此过滤率函数的形式为:

  

f′( t )= K· t ·(T − t

其中常数K将被确定。扩展以上内容即可:

  

f′( t )= K·T· t -K· t 2

相对于 t 对f'( t )进行积分得到:

  

∫f′( t )· dt =(K·T / 2)· t 2 −(K / 3)· t 3 + c

F是f( t )从0到T相对于 t 的积分,因此,由于下界为0,我们可以用T代替 t > t ,然后删除积分c的常数,得出:

  

F =(K·T / 2)·T 2 −(K / 3)·T 3

它简化为:

  

F = K·T 3 / 6

重新排列以上内容会得出:

  

K = 6·F / T 3

因此我们可以将其代入原始f'( t ),得到:

  

f′( t )=(6·F / T 3 )· t ·(T − t

以上内容仅适用于连续函数f'( t ),因此您可能需要进行一些细微调整,因为您的实际f'( t )仅在20时变化毫秒间隔。取f'( t )和f'( t + .02)之间的平均值可能足够接近。另一种选择是在每个步骤中使用f'( t +。01)。最准确的选择是使用上述积分的公式在每个步骤中将 t 集成到 t +。02,然后除以.02。

对于T = 8,F = 10,过滤速率为:

  

f′( t )= 0.1171075· t ·(8 − t

答案 1 :(得分:0)

您的问题有点难以理解...但是,如果您希望输出对输入中的阶跃变化具有S形响应,并且S形由抛物线弧制成,那么这样做非常容易-只需应用两次移动平均值过滤器即可。

在数字信号处理中,此技术很常见,被称为级联积分梳状(CIC)滤波器。您可以在Google上搜索并获得很多成功,但恐怕找不到适合没有DSP经验的人。没关系-只是多次应用的简单移动平均值。

如果您希望输出在输入发生阶跃变化后花费6秒才能达到最终值,请应用两次3秒移动平均值,或两次应用2秒移动平均值。后者将具有分段的立方体形状,而不是抛物线形状,您可能会更喜欢。