第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以上的版本,太老的版本有些新库不支持。
安装时注意两点:
- 勾选「Add Anaconda to my PATH environment variable」——虽然安装程序会警告,但加上更方便
- 安装路径不要有中文和空格
我曾经遇到过:有学员把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()
如果能看到三条曲线,说明你的环境已经全部就绪。绿色是干净的信号,红色是加了噪声的,蓝色是滤波后的。你看,滤波后的蓝色曲线基本跟绿色重合了——这就是咱们后面要深入讲的滤波算法。
好了,环境搭好了,咱们下章开始正式讲数据采集。