
本文介绍使用 python 批量分析 wav 音频文件的频谱能量分布,重点检测 10 khz 以上频段是否存在显著能量,适用于蝙蝠声学筛查等生态监测场景。
本文介绍使用 python 批量分析 wav 音频文件的频谱能量分布,重点检测 10 khz 以上频段是否存在显著能量,适用于蝙蝠声学筛查等生态监测场景。
在野外声学监测(如蝙蝠洞录音)中,人工逐一听辨大量 WAV 文件效率极低。更科学的方法是:不追求“最高频率”的绝对值(受噪声与采样限制不可靠),而是定量评估高频段(如 10–100 kHz)的能量强度。这既符合物理实际(理想麦克风+ADC 系统若采样率 ≥20 kHz,理论上可捕获 10 kHz 信号,但真实信噪比决定是否可检出),也契合生物声学分析惯例。
以下是一个完整、可运行的 Python 教程方案,基于 scipy 和 numpy 实现:
✅ 核心思路
- 使用 短时傅里叶变换(STFT) 或 FFT 提取频谱;
- 聚焦 10 kHz 以上频带的能量总和(线性或分贝尺度);
- 对每个文件输出该频段的 归一化能量值(dB),便于阈值筛选与 Excel 导出。
? 示例代码(含注释)
import numpy as np
import scipy.io.wavfile as wav
from scipy.fft import fft, fftfreq
import os
import pandas as pd
def analyze_high_freq_energy(file_path, high_freq_cutoff=10000, sample_rate_target=44100):
"""分析单个 WAV 文件中高于 high_freq_cutoff 的频段能量(dB)"""
try:
sr, data = wav.read(file_path)
# 若为立体声,取左声道;若采样率过低,跳过(无法可靠覆盖10kHz)
if len(data.shape) > 1:
data = data[:, 0]
if sr < 2 * high_freq_cutoff:
return np.nan # 不满足奈奎斯特采样定理,结果无效
# 截取前 2 秒(避免长文件计算过载,可按需调整)
max_samples = min(len(data), sr * 2)
data = data[:max_samples].astype(np.float64)
# FFT 分析
n = len(data)
yf = fft(data)
xf = fftfreq(n, 1 / sr)
# 只保留正频率部分,并筛选 >10kHz 的 bins
mask = (xf >= high_freq_cutoff) & (xf <= sr/2)
energy_linear = np.sum(np.abs(yf[mask]) ** 2) / n # 平均功率
# 转换为分贝(参考值:最大可能幅度平方)
if energy_linear > 0:
energy_db = 10 * np.log10(energy_linear / (np.max(np.abs(data))**2 + 1e-12))
else:
energy_db = -np.inf
return round(energy_db, 2)
except Exception as e:
print(f"Error processing {file_path}: {e}")
return np.nan
# 批量处理目录下所有 .wav 文件
folder = "./bat_recordings"
results = []
for fname in sorted([f for f in os.listdir(folder) if f.lower().endswith(".wav")]):
full_path = os.path.join(folder, fname)
db_val = analyze_high_freq_energy(full_path)
results.append({"filename": fname, "high_freq_energy_dB": db_val})
# 生成结果表(可直接保存为 Excel)
df = pd.DataFrame(results)
df.to_excel("bat_frequency_report.xlsx", index=False)
print("✅ 分析完成!结果已保存至 bat_frequency_report.xlsx")
print(df.head())⚠️ 关键注意事项
- 采样率是前提:确保原始 WAV 文件采样率 ≥ 22.05 kHz(推荐 ≥ 44.1 kHz),否则 10 kHz 以上信息已丢失(混叠);
-
能量 ≠ 存在性判断:单一高 dB 值可能来自电子噪声,建议结合时频图(spectrogram)目视验证(可用
matplotlib.pyplot.specgram快速绘制); -
阈值设定:实践中,对安静环境录音,
high_freq_energy_dB > -30 dB通常指示有效蝙蝠叫声;需用已知阳性样本校准; -
性能优化:对千级文件,可启用多进程(
concurrent.futures.ProcessPoolExecutor)加速。
✅ 总结
与其执着于“文件中最高频率是多少”(易受噪声主导且无生态意义),不如采用频带能量量化法——它稳健、可复现、易于自动化,并天然兼容后续机器学习分类。本方案无需额外安装复杂库(仅 numpy, scipy, pandas),适合科研一线快速部署。将输出 Excel 表按 high_freq_energy_dB 排序,即可高效锁定候选蝙蝠录音。

















