第2章:环境搭建——Python环境、TensorFlow/PyTorch安装、Librosa与Scipy库配置
好,咱们正式开始动手了。
说实话,做FFT频谱特征分类,最怕的不是算法难,而是环境配了一整天,跑起来全是红字报错。我当年刚入行时,光装一个音频处理库就折腾了三个小时,最后发现是Python版本不对。嗯,这种坑,咱们今天一次性填平。
2.1 Python环境:选对版本,少走弯路
我个人习惯用Python 3.8到3.10之间的版本。为什么?因为TensorFlow和PyTorch对3.11以上的支持还不够稳定,尤其是Librosa,在3.11上偶尔会抽风。
推荐用Anaconda来管理环境。你想想看,一个项目一个环境,互不干扰,多清爽。
# 创建独立环境
conda create -n fft_classifier python=3.9
# 激活环境
conda activate fft_classifier
# 验证版本
python --version
# 输出:Python 3.9.18
我个人习惯在项目根目录放一个requirements.txt,把所有依赖写进去。这样换机器时,一行命令就能复现环境。
2.2 TensorFlow vs PyTorch:我两个都装
这个问题经常有人问:做FFT分类到底用哪个?
我的答案是:两个都装。为什么?因为不同项目、不同团队用的框架不一样。你想想看,万一面试官让你用PyTorch写个频谱分类器,你只会TensorFlow,那多尴尬。
安装命令很简单,但要注意版本匹配。
# TensorFlow 2.10 是最后一个支持GPU的Windows版本
pip install tensorflow==2.10.0
# PyTorch 推荐用官网命令,自动匹配CUDA版本
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 验证TensorFlow GPU
import tensorflow as tf
print("GPU可用:", tf.config.list_physical_devices('GPU'))
# 验证PyTorch GPU
import torch
print("CUDA可用:", torch.cuda.is_available())
print("GPU数量:", torch.cuda.device_count())
如果输出是空的或者False,别慌。大概率是CUDA版本没对上。我建议直接用conda安装,它会自动帮你搞定CUDA和cuDNN的匹配问题。
# conda安装,省心
conda install tensorflow-gpu=2.10
conda install pytorch torchvision torchaudio cudatoolkit=11.8 -c pytorch
2.3 Librosa:音频处理的瑞士军刀
Librosa是做音频特征提取的核心库。FFT、梅尔频谱、MFCC,全靠它。
安装很简单,但有个坑——它依赖的soundfile库在Windows上需要额外装一个动态链接库。我曾经在这上面栽过跟头,装完Librosa,一读音频就报错。
# 标准安装
pip install librosa
# 如果报错,先装soundfile
pip install soundfile
# 或者用conda
conda install -c conda-forge librosa
验证安装:
import librosa
import librosa.display
# 加载一个示例音频
y, sr = librosa.load(librosa.example('nutcracker'), sr=22050)
print(f"音频长度: {len(y)/sr:.2f}秒, 采样率: {sr}Hz")
# 计算FFT频谱
D = librosa.stft(y)
print(f"频谱形状: {D.shape}")
# 输出:频谱形状: (1025, 646)
你看,一行代码就完成了STFT变换。Librosa底层用的是scipy的FFT实现,但封装得特别优雅。
2.4 Scipy:FFT的底层引擎
虽然Librosa已经封装了STFT,但有时候我们需要自己控制FFT的参数,比如做自定义的频谱特征提取。这时候Scipy就派上用场了。
# 安装
pip install scipy
# 手动FFT示例
import numpy as np
from scipy.fft import fft, fftfreq
# 生成一个模拟信号
fs = 1000 # 采样率
t = np.linspace(0, 1, fs, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 120 * t)
# 计算FFT
fft_vals = fft(signal)
freqs = fftfreq(len(signal), 1/fs)
# 只取正频率部分
pos_mask = freqs >= 0
fft_mag = np.abs(fft_vals[pos_mask])
fft_freq = freqs[pos_mask]
print(f"频率分辨率: {fft_freq[1] - fft_freq[0]:.2f} Hz")
# 输出:频率分辨率: 1.00 Hz
2.5 完整环境验证脚本
最后,我习惯写一个验证脚本,一键检查所有库是否就绪。这样上课前跑一遍,心里有底。
"""
环境验证脚本:FFT频谱特征CNN分类实战
运行方式:python check_env.py
"""
def check_env():
print("=" * 50)
print("环境验证开始...")
print("=" * 50)
# 1. Python版本
import sys
print(f"[OK] Python版本: {sys.version.split()[0]}")
# 2. TensorFlow
try:
import tensorflow as tf
gpu = tf.config.list_physical_devices('GPU')
print(f"[OK] TensorFlow {tf.__version__}, GPU: {len(gpu) > 0}")
except:
print("[FAIL] TensorFlow 安装失败")
# 3. PyTorch
try:
import torch
print(f"[OK] PyTorch {torch.__version__}, CUDA: {torch.cuda.is_available()}")
except:
print("[FAIL] PyTorch 安装失败")
# 4. Librosa
try:
import librosa
print(f"[OK] Librosa {librosa.__version__}")
except:
print("[FAIL] Librosa 安装失败")
# 5. Scipy
try:
import scipy
print(f"[OK] Scipy {scipy.__version__}")
except:
print("[FAIL] Scipy 安装失败")
print("=" * 50)
print("环境验证完成!")
if __name__ == "__main__":
check_env()
运行这个脚本,如果全部显示[OK],恭喜你,环境搭建完成。如果有[FAIL],别急,对照上面的步骤重新装一下对应的库。
- Librosa读音频报错:安装ffmpeg(conda install -c conda-forge ffmpeg)
- TensorFlow找不到GPU:检查CUDA版本,建议用conda安装
- PyTorch安装慢:换国内镜像源(pip install -i https://pypi.tuna.tsinghua.edu.cn/simple)
好了,环境搭好了,下一章咱们就开始真正接触FFT频谱了。说实话,我第一次看到频谱图时,觉得这东西跟天书一样。但别怕,跟着我一步步来,你会发现其实挺有意思的。
公众号:蓝海资料掘金营,微信deep3321