第2章:环境搭建——Python环境、TensorFlow/PyTorch安装、Librosa与Scipy库配置

好,咱们正式开始动手了。

说实话,做FFT频谱特征分类,最怕的不是算法难,而是环境配了一整天,跑起来全是红字报错。我当年刚入行时,光装一个音频处理库就折腾了三个小时,最后发现是Python版本不对。嗯,这种坑,咱们今天一次性填平。

2.1 Python环境:选对版本,少走弯路

我个人习惯用Python 3.8到3.10之间的版本。为什么?因为TensorFlow和PyTorch对3.11以上的支持还不够稳定,尤其是Librosa,在3.11上偶尔会抽风。

⚠️ 避坑指南: 我曾经在Python 3.11上装Librosa,结果报了个“No module named ‘audioread’”的错误,折腾半天发现是依赖包没跟上。所以,老老实实用3.9吧,稳如老狗。

推荐用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
💡 小技巧: 装完记得验证一下GPU是否可用。我遇到过好几次,装完发现TensorFlow在用CPU跑,白白浪费了显卡。
# 验证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
💡 个人经验: 在实际项目中,我通常用Librosa做快速原型,用Scipy做精细调优。比如在工业设备的故障诊断中,需要自定义窗函数和重叠率,这时候Scipy的灵活性就体现出来了。

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