【问题标题】:Audio frequency analysis - Python音频分析 - Python
【发布时间】:2022-10-15 02:33:10
【问题描述】:

AI 使用 Audacity 生成了这个频谱图(汉窗,对数刻度)。我需要基于 .wav 文件使用 Python 生成类似的数据。有谁知道,我应该使用哪些库/函数?

【问题讨论】:

  • 对软件库等的建议与 SO 无关。但是实现代码/功能不是。所以你可能想稍微改一下你的问题。

标签: python audio wav librosa spectrogram


【解决方案1】:

这里有两种计算音频信号频谱的方法。


import librosa # for loading example audio
from matplotlib import pyplot as plt
import scipy.signal
import pandas
import numpy

def spectrum_stft(audio, sr, n_fft, window):
    """Method 1: Compute magnitude spectrogram, average over time"""
    S = librosa.stft(audio, n_fft=n_fft, window=window)
    S_db = librosa.amplitude_to_db(numpy.abs(S*S), ref=0.0, top_db=120)
    freqs = librosa.fft_frequencies(sr=sr, n_fft=n_fft)
    spectrum = numpy.mean(S_db, axis=1)
    return pandas.Series(spectrum, index=freqs)

def spectrum_welch(audio, sr, n_fft, window):
    """Method 2: Use Welch method. Uses overlapped complex spectrum"""
    freqs, power = scipy.signal.welch(audio, fs=sr, nfft=n_fft, window=window,
        scaling="spectrum", average='median')
    db = librosa.power_to_db(power, ref=0.0, top_db=120)
    return pandas.Series(db, index=freqs)


fft_length = 512*16
window = "hann"


# load some short example audio
path = librosa.example("trumpet")
audio, sr = librosa.load(path)
section = audio[int(1.0*sr):int(2.0*sr)]

# compute the spectrums
w = spectrum_welch(section, sr=sr, n_fft=fft_length, window=window)
s = spectrum_stft(section, sr=sr, n_fft=fft_length, window=window) - 65.0

# plot it
fig, ax = plt.subplots(1)
w.plot(ax=ax, label="welch")
s.plot(ax=ax, label="STFT")
ax.legend()
fig.savefig("spectrum.png")

运行它应该会产生这样的结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2020-09-18
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多