离散传递函数实现(滤波器实现)

GPT讲挺好:
离散传递函数的一般形式为:
G ( z ) = b 0 z n + b 1 z ( n − 1 ) + . . . + b n a 0 z n + a 1 z ( n − 1 ) + . . . + a m G(z)=\frac{b_0z^n + b_1z^{(n-1)} + ... + b_n}{a_0z^{n} + a_1z^{(n-1)} + ... + a_m} G(z)=a0zn+a1z(n1)+...+amb0zn+b1z(n1)+...+bn
其中,b0、b1、…、bn是分子系数,a0、a1、…、am是分母系数,n和m分别是分子和分母的最高次幂。
差分方程的形式是:
y [ n ] = ( b 0 x [ n ] + b 1 ∗ x [ n − 1 ] + . . . + b n ∗ x [ n − n ] ) − ( a 1 ∗ y [ n − 1 ] + a 2 ∗ y [ n − 2 ] + . . . + a m ∗ y [ n − m ] ) y[n] = (b_0x[n] + b_1*x[n-1] + ... + b_n*x[n-n]) - (a_1*y[n-1] + a_2*y[n-2] + ... + a_m*y[n-m]) y[n]=(b0x[n]+b1x[n1]+...+bnx[nn])(a1y[n1]+a2y[n2]+...+amy[nm])
其中,x[n]是输入信号的当前样本,x[n-1]、x[n-2]、…、x[n-n]是输入信号的历史样本,y[n]是输出信号的当前样本,y[n-1]、y[n-2]、…、y[n-m]是输出信号的历史样本。

要实现离散传递函数,您可以定义一个函数,将输入信号和历史输入/输出作为参数传递给该函数,并在函数内部使用差分方程计算输出。在每个时间步长中,您需要更新历史输入/输出的值,以便在下一个时间步长使用。

示例伪代码:

function discreteTransferFunction(input, x, y)
    // 系数
    b = [b0, b1, ..., bn]  // 分子系数
    a = [a0, a1, ..., am]  // 分母系数

    // 计算输出
    output = (b[0]*input + b[1]*x[0] + ... + bn*x[n]) - (a[1]*y[0] + a[2]*y[1] + ... + am*y[m])

    // 更新历史输入和输出
    for i = n-1 to 1 do
        x[i] = x[i-1]
    end for
    x[0] = input

    for i = m-1 to 1 do
        y[i] = y[i-1]
    end for
    y[0] = output

    return output
end function

通过将输入信号的每个样本依次传递给discreteTransferFunction函数,并跟踪历史输入和输出,您可以获得离散传递函数的输出序列。

请注意,实际的实现可能需要添加错误检查和其他边界条件处理,以确保算法的正确性和稳定性。
对于陷波器离散传递函数,给出cpp实现
离散传递函数实现(滤波器实现)_第1张图片


double notchFilter(double input, std::vector<double>& x, std::vector<double>& y)
{
    // 系数
    double b[3] = { 0.9099, -1.075, 0.1887 };
    double a[3] = { 1.0, -1.075, 0.09856 };

    // 计算输出
    double output = b[0] * input + b[1] * x[0] + b[2] * x[1]
        - a[1] * y[0] - a[2] * y[1];

    // 更新历史输入和输出
    x[1] = x[0];
    x[0] = input;
    y[1] = y[0];
    y[0] = output;

    return output;
}

int main()
{
    // 输入信号
    std::vector<double> inputSignal = { 1.0, 2.0, 3.0, 4.0, 5.0 };
    // 输出信号
    std::vector<double> outputSignal(inputSignal.size(), 0.0);
    // 历史输入和输出
    std::vector<double> x = { 0.0, 0.0 };
    std::vector<double> y = { 0.0, 0.0 };

    // 应用离散传递函数
    for (size_t i = 0; i < inputSignal.size(); i++)
    {
        outputSignal[i] = notchFilter(inputSignal[i], x, y);
    }

    // 输出结果
    for (size_t i = 0; i < outputSignal.size(); i++)
    {
        std::cout << "Output at sample " << i << ": " << outputSignal[i] << std::endl;
    }

    return 0;
}

你可能感兴趣的:(算法)