# 从 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 |
|---|---|---|---|
| 信号处理和无线通信 | 信号处理 | TySignalProcessing | mworks.TySignalProcessing |
| DSP系统 | TyDSPSystem | mworks.TyDSPSystem | |
| 小波 | TyWavelet | mworks.TyWavelet | |
| 雷达 | TyRadar | mworks.TyRadar | |
| 相控阵 | TyPhasedArray | mworks.TyPhasedArray | |
| 基础通信 | TyCommunication | mworks.TyCommunication | |
| 控制系统 | 控制系统 | TyControlSystems | mworks.TyControlSystems |
| 系统辨识 | TySystemIdentification | mworks.TySystemIdentification | |
| 鲁棒控制 | TyRobustControl | mworks.TyRobustControl | |
| AI 与数据科学 | 机器学习 | TyMachineLearning | scipy、scikit-learn、statsmodels |
| 强化学习 | TyReinforcementLearning | MindSpore Reinforcement(需自行安装)、PyTorch(需自行安装) | |
| 深度学习 | TyDeepLearning | MindSpore、PyTorch(需自行安装) | |
| 数学、统计和优化 | 曲线拟合 | TyCurveFitting | mworks.TyCurveFitting |
| 统计 | TyStatistics | mworks.TyStatistics | |
| 优化 | TyOptimization | mworks.TyOptimization | |
| 全局优化 | TyGlobalOptimization | mworks.TyGlobalOptimization | |
| 符号数学 | TySymbolicMath | sympy | |
| 基础 | 基础数学 | TyMath | numpy |
| 图形 | TyPlot | matplotlib | |
| 语言基础 | TyBase | python内置库 |
需要注意的是:
虽然您可以在自己习惯的 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 的数据交换,这将有助于处理复杂数据结构或其他问题。