scipy 如何在C# / ASP.NET Core中运行sicpy. signalfreqz?

brqmpdu1  于 2023-03-30  发布在  C#
关注(0)|答案(1)|浏览(220)

我需要在ASP.NET Core上下文中运行依赖于numpyscipy.signal的Python源代码(.py)。我发现IronPython是一个合适的解决方案,但它不支持这两个依赖项(GitHub issue #355)。
所以,我决定从Python自动生成C#代码,并手动检查所有构建错误。所有看起来都很有希望,numpy似乎被Numpy.NET支持,但我缺少的难题是scipy.signalfreqz方法。
用法示例:
w, h = signal.freqz(b, a, worN=freq_hz, fs=fs_hz)
关于freqz函数的问题:

  1. C#中是否有fork函数?
    1.是否有函数的源代码,以便我可以从中生成C#代码?
    1.我想知道我是否可以使用MATLAB freqz函数。这两个函数是否等价?是否可以在C#环境中运行MATLAB函数?
juzqafwq

juzqafwq1#

基本上,解决方案是将freqz函数(我不需要完全重写freqz,只是部分逻辑)重写为C#沿着依赖代码(使用Numpy):

public static (NDarray w, NDarray h) freqz(NDarray b,
                                           NDarray a,
                                           NDarray? worN,
                                           float fs = (float)Math.PI * 2)
{
    using var b_ = np.atleast_1d(b);
    using var a_ = np.atleast_1d(a);

    NDarray w = np.atleast_1d(worN);

    w = 2 * np.pi * w / fs;

    using var i = np.array(new Complex[] { new(real: 0, imaginary: -1) });
    var zm1 = (i * w).exp();

    var nppPolyval_b = npp_polyval(zm1, b_);
    var nppPolyval_a = npp_polyval(zm1, a_);
    NDarray h = nppPolyval_b / nppPolyval_a;

    w = w * fs / (2 * np.pi);

    return (w, h);
}

private static NDarray npp_polyval(NDarray x, NDarray c)
{
    using var c_ = np.array(c, ndmin: 1, copy: false);

    var c0 = c_[":, -1"] + x * 0;

    for (int i = 2; i <= c_.size; i++)
    {
        c0 = c_[$":, -{i}"] + (c0 * x);
    }
    return c0;
}

相关问题