# 从 Python 调用 Syslab 函数库


Syslab 是多语言科学计算编程环境,采用 Julia 为主语言,同时支持 Python 语言,并支持二者的互调用。

# 编程语言的选择

Syslab 内置的科学计算函数库主要以 Julia 语言实现,涵盖信号处理、DSP 系统、小波、雷达、相控阵、通信、控制系统等各个领域。得益于 Julia 语言的开发高效率和极高的性能上限,Syslab 内置函数库的性能会得到持续的提升。因此,如果是没有历史代码束缚的新项目,或者是对性能有较高要求的科学计算任务,我们推荐用户使用 Julia 语言,结合内置的 Julia 函数库,您可以获得最佳的开发和运行体验。

Python 语言拥有大量用户,而且在科学计算和 AI 领域有着广泛的应用(如 SciPy、NumPy、Matplotlib、MindSpore 等)。但社区缺乏维护良好的专业领域库,要么是性能不足,要么散落在各处,难以兼容。为 Syslab 的专业函数库提供 Python API 正好可以弥补这一不足。因此,如果您的项目需要用到 Syslab 中的专业库,并且需要与 Python 生态中的其他工具进行交互,您可以使用 Python 语言。

# Syslab 函数库对 Python API 的支持

当前版本 Syslab 中,信号处理和无线通信、控制系统、数学统计和优化等专业函数库提供了 Python API。基础库和部分专业库在 Python 生态有完备的替代品,因此我们不为其提供 Python API,例如 PyTorch 深度学习库 ,需要您根据需要自行安装。Syslab 函数库对 Python API 的支持如下表所示:

类别 Syslab 函数库 Julia Python
信号处理和无线通信信号处理TySignalProcessingmworks.TySignalProcessing
DSP系统TyDSPSystemmworks.TyDSPSystem
小波TyWaveletmworks.TyWavelet
雷达TyRadarmworks.TyRadar
相控阵TyPhasedArraymworks.TyPhasedArray
基础通信TyCommunicationmworks.TyCommunication
控制系统控制系统TyControlSystemsmworks.TyControlSystems
系统辨识TySystemIdentificationmworks.TySystemIdentification
鲁棒控制TyRobustControlmworks.TyRobustControl
AI 与数据科学机器学习TyMachineLearningscipy、scikit-learn、statsmodels
强化学习TyReinforcementLearningMindSpore Reinforcement(需自行安装)、PyTorch(需自行安装)
深度学习TyDeepLearningMindSpore、PyTorch(需自行安装)
数学、统计和优化曲线拟合TyCurveFittingmworks.TyCurveFitting
统计TyStatisticsmworks.TyStatistics
优化TyOptimizationmworks.TyOptimization
全局优化TyGlobalOptimizationmworks.TyGlobalOptimization
符号数学TySymbolicMathsympy
基础基础数学TyMathnumpy
图形TyPlotmatplotlib
语言基础TyBasepython内置库

需要注意的是:

  • 虽然您可以在自己习惯的 Python 开发环境中使用 Python API,但底层函数库是由 Julia 实现的,其依赖于 Syslab 中的 Julia 环境。因此,当使用 Python API 时,确保安装了完整的 Syslab 环境。

  • 目前 Python API 是由 Julia 函数库自动生成,因此没有为 Python API 单独提供函数帮助,而是跟 Julia 原生 API 公用一套,我们确保两套 API 的参数位置和含义完全一致。另外,自动生成的 Python API 在数据类型、接口习惯等方面可能不具备 Python 语言的原生体验,如果有改进建议,请及时反馈给我们。

# 典型示例

以下展示了分别用 Julia 和 Python 实现的带通滤波器示例,二者都使用了信号处理库中的firpm函数(最优 FIR 滤波器设计),Julia 版的示例代码如下:

using TyPlot
using TySignalProcessing

# 指定 0.3π 和 0.7π rad/sample 的归一化阻带频率
# 和 0.4π 和 0.6π rad/sample 的归一化带通频率。
f = [0, 0.3, 0.4, 0.6, 0.7, 1]
a = [0, 0, 1, 1, 0, 0]

# 使用 Parks-McClellan 算法设计 17 阶 FIR 带通滤波器
res = firpm(17,f,a)
b = res[1]

res1 = freqz(b, [1], 512)
h = res1[1]
w = res1[2]

# 绘制理想和实际幅度响应。
plot(f, a, w / π , abs.(h))
legend(["Ideal", "firpm Design"])
xlabel("Radian Frequency(w / π)")
ylabel("Magnitude")

以下是 Python 版的示例,其中矩阵运算基于 numpy 实现,绘图基于 matplotlib 实现:

import numpy as np
import matplotlib.pyplot as plt
from mworks import TySignalProcessing 

# 指定 0.3π 和 0.7π rad/sample 的归一化阻带频率
# 和 0.4π 和 0.6π rad/sample 的归一化带通频率。
f = np.array([0, 0.3, 0.4, 0.6, 0.7, 1])
a = np.array([0, 0, 1, 1, 0, 0])

# 使用 Parks-McClellan 算法设计 17 阶 FIR 带通滤波器
res = TySignalProcessing.firpm(17,f,a)
b = res[0]

res1 = TySignalProcessing.freqz(b, np.array([1]), 512)
h = res1[0]
w = res1[1]

# 绘制理想和实际幅度响应。
plt.plot(f, a, w / np.pi, np.abs(h))
plt.legend(np.asarray(["Ideal", "firpm Design"]))
plt.xlabel("Radian Frequency(w / π)")
plt.ylabel("Magnitude")
plt.show()

以上两个示例运行后都将得到以下相同的运行结果:

Syslab 提供的专业函数 Python API,具备编码提示功能,开箱即用。但是,Python API 是基于跨语言调用机制实现,如果您需要进一步了解语言之间的数据交换和映射规则,请参考 Python 与 Julia 的数据交换,这将有助于处理复杂数据结构或其他问题。