将一阶传递函数转换为c代码

将一阶传递函数转换为c代码,c,function,matlab,transfer,simulink,C,Function,Matlab,Transfer,Simulink,我有一个简单的一阶传递,比如“3/s+3”或“tf(3,[13])”函数,我想用c代码实现。我有一个C函数,自上次迭代以来使用增量时间调用该函数: double output(double input, double t); //usually, t is around 0.01 second 如何在C中实现传递函数3/s+3?这不仅仅是直接实现3/(s+3)的问题。 您需要使用适当的技术(向前euler、向后euler、tustin、零阶保持)将其离散到z域,然后实现离散版本的过滤器 下面是

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

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

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

这不仅仅是直接实现3/(s+3)的问题。 您需要使用适当的技术(向前euler、向后euler、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;
}

这还不清楚。“5/s+3”是否属于拉普拉斯域?你是在问如何以编程方式执行拉普拉斯逆变换吗?我想它是在拉普拉斯域中。顺便说一下,应该是
3/(s+3)
,不是吗?我编辑了这个问题。是的,它是3/(s+3),它在拉普拉斯域中。@gregoiregentil:好的,标准拉普拉斯恒等式。如果你在
s
中有一个有理多项式,那么你可以只使用部分分式技术,然后你基本上就完成了!明确地说,在拉普拉斯域中没有实现传递函数。这对分析/设计等很有好处,但在实现时,我们生活在实域中,因此需要将TF转换为脉冲响应或差分方程来实际实现它。为什么需要通过z域?您可以简单地获得连续时间等价物的符号表示,然后以所需的任何采样率对其求值。因为以给定采样率采样的连续时间等价物与z变换等价,所以为什么不直接去那里而不是引入一个中间步骤呢?只是因为使用简单的身份表似乎比通过z变换更简单!为巫术道歉,我只是想澄清一下:@OliverCharlesworth的原因是,无论采样如何,推导精确的逆拉普拉斯方程都会给出精确的值,而Z变换只是一个近似值,尽可能好——这也需要一个相当低的(取决于变换)采样率。