第1章:Python环境搭建与工具链

各位同学好,我是老张。做嵌入式这些年,我踩过最多的坑,反而不是算法本身,而是环境没配好。你想想看,辛辛苦苦写好的滤波代码,一运行报错说缺少这个库、那个包,多耽误事。

所以第一章,咱们先把吃饭的家伙备齐了。说白了,就是给你的电脑装上Python数据分析的「军火库」。

1.1 为什么选Anaconda?

我刚开始做信号处理那会儿,用的是原生Python。装个NumPy要手动编译,SciPy更是折腾半天。后来换了Anaconda,真香。

Anaconda是什么?它就是一个Python的「全家桶」。

  • 自带Python解释器
  • 预装了150+科学计算包
  • 有图形化界面,点两下就能装包
  • 最关键是——环境隔离

环境隔离有多重要?

我在项目A里用NumPy 1.19,项目B需要NumPy 1.24。如果没有隔离,两个项目会打架。Anaconda的虚拟环境就是给每个项目一个独立的「小房间」。

1.2 安装Anaconda

去官网下载对应系统的安装包。我建议选Python 3.8以上的版本,太老的版本有些新库不支持。

安装时注意两点:

  1. 勾选「Add Anaconda to my PATH environment variable」——虽然安装程序会警告,但加上更方便
  2. 安装路径不要有中文和空格

我曾经遇到过:有学员把Anaconda装在了「D:\程序文件」这个路径下,结果后面所有包都装不上。因为路径里的中文让编译器懵了。

1.3 创建虚拟环境

装好之后,打开Anaconda Prompt(Windows)或终端(Mac/Linux)。

# 创建一个叫sensor_env的环境,指定Python版本
conda create -n sensor_env python=3.9

# 激活环境
conda activate sensor_env

# 退出环境
conda deactivate

我个人习惯给每个课程项目单独建一个环境。这样就算某个环境搞坏了,也不影响其他项目。

1.4 安装NumPy和SciPy

这两个是信号处理的基石。NumPy负责数组运算,SciPy提供滤波算法。

# 安装NumPy
conda install numpy

# 安装SciPy
conda install scipy

# 验证安装
python -c "import numpy; print(numpy.__version__)"
python -c "import scipy; print(scipy.__version__)"

如果没报错,说明装好了。嗯,就这么简单。

小技巧:用conda安装比用pip安装更稳定。因为conda会帮你处理底层依赖,比如BLAS库、LAPACK库这些。我自己在项目中遇到过,用pip装SciPy结果跑起来慢一倍,换成conda装就正常了。

1.5 Matplotlib可视化

做信号处理,光看数据不够,得画图。Matplotlib就是干这个的。

conda install matplotlib

装好后,咱们画个正弦波试试手:

import numpy as np
import matplotlib.pyplot as plt

# 生成数据
t = np.linspace(0, 1, 1000)
y = np.sin(2 * np.pi * 10 * t)

# 画图
plt.figure(figsize=(10, 4))
plt.plot(t, y)
plt.xlabel('时间 (秒)')
plt.ylabel('幅值')
plt.title('10Hz正弦波')
plt.grid(True)
plt.show()

你想想看,如果数据里有噪声,用肉眼根本看不出来。但一画图,异常点立马现原形。这就是可视化的价值。

1.6 Jupyter Notebook

这个工具我强烈推荐。它让你能把代码、运行结果、图表、文字说明放在同一个文档里。

# 安装Jupyter
conda install jupyter

# 启动
jupyter notebook

启动后浏览器会自动打开一个页面。点「New」→「Python 3」就能新建一个笔记本。

Jupyter有个好处:可以一段一段地跑代码。调试滤波算法时,我经常先跑一段生成数据,看看波形对不对,再跑下一段做滤波,对比效果。这种交互式的工作流,比写完整脚本再运行高效得多。

我的工作习惯:

在Jupyter里做算法原型验证,验证通过后再把代码整理成.py脚本,放到嵌入式系统里跑。这样既保证了开发效率,又保证了代码的规范性。

1.7 验证整个工具链

最后,咱们写个小程序,把今天装的所有东西串起来跑一遍:

import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt

# 生成带噪声的信号
t = np.linspace(0, 1, 1000)
clean = np.sin(2 * np.pi * 5 * t)
noise = 0.5 * np.random.randn(len(t))
noisy = clean + noise

# 设计一个低通滤波器
b, a = signal.butter(4, 0.1, 'low')
filtered = signal.filtfilt(b, a, noisy)

# 画图对比
plt.figure(figsize=(12, 6))
plt.plot(t, clean, 'g-', label='原始信号', alpha=0.6)
plt.plot(t, noisy, 'r-', label='含噪信号', alpha=0.4)
plt.plot(t, filtered, 'b-', label='滤波后信号', linewidth=2)
plt.legend()
plt.xlabel('时间 (秒)')
plt.ylabel('幅值')
plt.title('传感器信号滤波效果对比')
plt.grid(True)
plt.show()

如果能看到三条曲线,说明你的环境已经全部就绪。绿色是干净的信号,红色是加了噪声的,蓝色是滤波后的。你看,滤波后的蓝色曲线基本跟绿色重合了——这就是咱们后面要深入讲的滤波算法。

好了,环境搭好了,咱们下章开始正式讲数据采集。