【问题标题】:Convert first order transfer function to c code [closed]将一阶传递函数转换为c代码[关闭]
【发布时间】:2013-03-12 00:43:09
【问题描述】:

我有一个简单的一阶传输,例如“3/s+3”或“tf(3,[1 3])”函数,我想用 c 代码实现。我有一个 C 函数,它使用自上次迭代以来的增量时间调用:

double output(double input, double t); //usually, t is around 0.01 second

如何在C中实现传递函数3/s+3?

【问题讨论】:

  • 这不清楚。拉普拉斯域中是“5/s+3”吗?您是在问如何以编程方式执行拉普拉斯逆变换吗?
  • 我想它在拉普拉斯域中。对了,应该是3/(s+3)吧?
  • 我编辑了这个问题。是的,它是 3/(s+3),它在拉普拉斯域中。
  • @gregoiregentil:好的,标准拉普拉斯身份的there are tables。如果你在s中有一个有理多项式,那么你可以使用部分分数技术,然后你就基本完成了!
  • 明确地说,你没有在拉普拉斯域中实现传递函数。这对分析/设计/等有好处,但是在实现时我们生活在真实域中,因此您需要将该 TF 转换为脉冲响应或差分方程才能实际实现它。

标签: c function matlab transfer simulink


【解决方案1】:

这不仅仅是直接实现 3/(s+3) 的问题。 您需要使用适当的技术(前向欧拉、后向欧拉、tustin、零阶保持)将其离散到 z 域,然后实现过滤器的离散版本。

以下是 Tustin 转换的简单版本。 正如所写,需要初始化状态并将其存储在此函数外部的某个位置。

double firstOrderLag(double input, double coeff, double dT, double *state){
// Function to implement the discretization of a continuous time first
// order lag sys = coeff/(s+coeff) using the Tustin (Bilinear) transformation.

    double num = (1/(1+2/coeff/dT)); // numerator
    double den = (1-2/coeff/dT)*num; // denominator
    double temp;
    double output;

    temp = input - den*(*state);
    output = num*(temp + (*state));
    *state = temp;

    return output;
}

【讨论】:

  • 为什么需要通过z域?您可以轻松获得连续时间等价物的符号表示,然后以所需的任何采样率对其进行评估。
  • 因为在给定采样率下采样的连续时间等效等于 z 变换,所以为什么不直接去那里而不是引入一个中间步骤。
  • 只是因为使用普通的身份表似乎比通过 z 变换更简单!
  • 抱歉死灵,只是想我会清除它:@OliverCharlesworth 的原因是推导精确的逆拉普拉斯方程将给出精确的值,无论采样如何,而使用 Z 变换它只是一个尽可能好的近似值——它也需要一个相当低的(取决于变换)采样率。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2010-10-18
相关资源
最近更新 更多