为何Librosa生成的流星频谱图与SpectrumLab不符?如何复现?
问题:Librosa生成的频谱图与SpectrumLab瀑布图样式不符
我使用SpectrumLab搭配SDR记录流星数据,该软件会生成事件的瀑布图截图和对应的WAV文件。尝试用Librosa从WAV文件复现SpectrumLab的瀑布图,但生成的频谱图样式和原截图存在明显差异。
我用的代码如下:
import librosa import matplotlib.pyplot as plt import librosa.display import numpy as np # 后续调整需用到 audio_data = 'event20230131_101027_26.wav' x , sr = librosa.load(audio_data) plt.figure(figsize=(14, 5)) librosa.display.waveshow(x, sr=sr) X = librosa.stft(x) Xdb = librosa.amplitude_to_db(abs(X)) plt.figure(figsize=(14, 5)) librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log') plt.colorbar() plt.show()
SpectrumLab生成的瀑布图:
Librosa生成的频谱图:
对应的WAV文件为event20230131_101027_26.wav
调整方案(匹配SpectrumLab样式)
对齐FFT参数
SpectrumLab的FFT设置(窗口类型、大小、重叠率)和Librosa默认值不同。先查看SpectrumLab内的FFT配置(比如窗口大小1024、重叠75%),然后修改stft参数:X = librosa.stft(x, n_fft=1024, hop_length=256, window='hamming')修正频率轴类型
你的代码用了对数频率轴,而SpectrumLab的瀑布图是线性轴,改成:librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='linear')保留原始采样率
Librosa默认会把音频重采样到22050Hz,导致时间轴缩放不对,加载时指定sr=None保留原采样率:x , sr = librosa.load(audio_data, sr=None)调整幅度与色彩映射
- 幅度校准:让dB计算基于音频的最大幅度,更贴合SpectrumLab的显示逻辑:
Xdb = librosa.amplitude_to_db(abs(X), ref=np.max) - 配色与动态范围:SpectrumLab常用jet配色,加上
cmap='jet',再限制dB范围匹配原图:librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='linear', cmap='jet', vmin=-80, vmax=0)
- 幅度校准:让dB计算基于音频的最大幅度,更贴合SpectrumLab的显示逻辑:
内容的提问来源于stack exchange,提问作者honeymoon
相关产品推荐
相关产品推荐

