第1章:Python科学计算环境搭建:NumPy、SciPy、Matplotlib安装与配置
各位同学,咱们正式开始。做雷达信号处理,说白了就是跟一堆数字打交道。你拿到的原始回波数据,就是一堆复数点。没有趁手的工具,你连看一眼波形都费劲。所以第一件事,就是把Python的科学计算环境搭好。
我个人习惯用Anaconda来管理环境。为什么?省心。你想想看,NumPy、SciPy、Matplotlib这些库,依赖关系错综复杂。自己手动装,装到一半报个错,查半天可能是个版本冲突。我当年刚入行时,就吃过这个亏——装SciPy装了一下午,最后发现是BLAS库没链接对。嗯,从那以后我就老老实实用Anaconda了。
1.1 环境管理器选择:Anaconda vs Miniconda
先说结论:新手用Anaconda,老手用Miniconda。
Anaconda自带了一百多个常用包,装完就能用。Miniconda只带一个Python解释器和conda命令,你需要什么再装什么。我在项目里一般用Miniconda,因为生产环境要轻量。但教学嘛,我建议你用Anaconda,省得一开始就被各种依赖搞心态。
下载地址我就不贴了,直接去官网找对应操作系统的安装包。安装时注意一点:把「Add Anaconda to my PATH environment variable」勾上。我曾经见过有人没勾,然后在命令行里死活找不到python命令,折腾了半天。
1.2 创建独立的虚拟环境
为什么要用虚拟环境?说白了,就是隔离。你手头可能有多个项目,一个项目用NumPy 1.19,另一个用NumPy 1.24。混在一起,迟早出问题。我在做雷达信号处理时,经常需要对比不同版本的FFT实现,虚拟环境帮我省了不少事。
打开终端(Windows用户用Anaconda Prompt),执行:
conda create -n radar_signal python=3.9
conda activate radar_signal
这里我用了Python 3.9。为什么不是最新的3.12?因为有些科学计算库对最新Python的支持会慢半拍。3.9是个稳定版本,我实测过,NumPy、SciPy、Matplotlib都能完美运行。
1.3 安装核心库
激活环境后,开始安装三大件。直接上命令:
conda install numpy scipy matplotlib
这条命令会帮你解决所有依赖。NumPy负责多维数组和基础数学运算,SciPy在NumPy基础上加了信号处理、优化、插值等高级功能,Matplotlib就是画图的。
在雷达信号处理中,这三个库的分工很明确:
- NumPy:存数据、做FFT、做矩阵运算。你的回波数据就是一个二维NumPy数组,行是距离门,列是脉冲数。
- SciPy:做滤波器设计、窗函数、插值。比如你要设计一个匹配滤波器,scipy.signal.firwin就很好用。
- Matplotlib:画频谱图、距离-多普勒图、时频图。没有它,你只能看一堆数字发呆。
安装完成后,验证一下:
python -c "import numpy; print(numpy.__version__)"
python -c "import scipy; print(scipy.__version__)"
python -c "import matplotlib; print(matplotlib.__version__)"
如果没报错,说明装好了。我曾经遇到一个情况,SciPy装上了但import时报错,原因是系统里同时有多个Python版本,环境变量乱了。解决办法:用where python(Windows)或which python(Linux/Mac)看看当前用的是哪个解释器。
1.4 安装Jupyter Notebook(可选但强烈推荐)
做雷达信号处理,我强烈建议你用Jupyter Notebook。为什么?因为你可以一边写代码,一边看结果,还能随时加注释。调试FFT算法时,你肯定不想每次改个参数就重新跑整个脚本。
conda install jupyter
jupyter notebook
启动后,浏览器里会打开一个界面。新建一个Notebook,选你刚才创建的radar_signal内核。嗯,这里要注意:如果内核列表里没有radar_signal,说明没注册。执行:
python -m ipykernel install --user --name radar_signal --display-name "Python (radar_signal)"
这样就能在Jupyter里切换内核了。
1.5 常见问题与避坑指南
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 安装速度慢 | 默认源在国外 | 换国内镜像源,比如清华源:conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ |
| ImportError: No module named 'numpy' | 没激活环境,或者装到了base环境 | 检查当前环境:conda info --envs,确保radar_signal前面有星号 |
| Matplotlib中文乱码 | 缺少中文字体 | 在代码开头加:plt.rcParams['font.sans-serif'] = ['SimHei'] |
1.6 快速测试:你的第一个雷达信号处理脚本
环境搭好了,咱们跑个简单的例子试试。生成一个线性调频信号(LFM),这是雷达里最常用的信号之一。
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
fs = 10e6 # 采样率 10 MHz
T = 100e-6 # 脉冲宽度 100 us
B = 1e6 # 带宽 1 MHz
t = np.arange(0, T, 1/fs)
# 生成LFM信号
k = B / T # 调频斜率
signal = np.exp(1j * 2 * np.pi * (k/2) * t**2)
# 画实部
plt.figure(figsize=(10, 4))
plt.plot(t * 1e6, np.real(signal))
plt.xlabel('时间 (us)')
plt.ylabel('幅度')
plt.title('线性调频信号(实部)')
plt.grid(True)
plt.show()
如果能看到一个频率逐渐变化的波形,恭喜你,环境搭建成功了。这个信号后面我们会反复用到——做脉冲压缩、做匹配滤波,都离不开它。
- 用Anaconda管理环境,省去依赖烦恼
- 每个项目建一个独立虚拟环境,避免版本冲突
- NumPy存数据、SciPy做处理、Matplotlib画图,三件套缺一不可
- Jupyter Notebook是调试雷达算法的利器,强烈推荐
好了,环境搭好了,下一章咱们就开始玩真的——用NumPy实现FFT,看看雷达信号在频域里长什么样。到时候我会带你手写一个FFT函数,再跟库函数对比,看看性能差多少。