代码之家  ›  专栏  ›  技术社区  ›  listener

在Python中创建音频文件的振幅与频谱图

  •  0
  • listener  · 技术社区  · 8 年前

    我正在尝试用Python创建音频文件的振幅与频谱图。这样做的程序是什么? 一些示例代码将非常有帮助。

    2 回复  |  直到 8 年前
        1
  •  3
  •   SleuthEye    8 年前

    简单光谱

    获得均匀采样信号振幅与频率关系的最简单方法 x 是计算 Discrete Fourier Transform 通过高效 Fast Fourier Transform 算法。发出信号 x个 按常规采样率采样 fs ,您可以使用:

    import numpy as np
    Xf_mag = np.abs(np.fft.fft(x))
    

    每个 index Xf_mag 然后,阵列将包含频率单元的振幅,其频率由 index * fs/len(Xf_mag) 。这些频率可以使用以下公式方便地计算:

    freqs = np.fft.fftfreq(len(Xf_mag), d=1.0/fs)
    

    最后,可以使用matplotlib绘制光谱:

    import matplotlib.pyplot as plt
    plt.plot(freqs, Xf_mag)
    

    细化频谱估计

    您可能会注意到,使用简单的FFT方法获得的频谱会产生一个看起来非常嘈杂的频谱(即具有许多尖峰)。 为了得到更准确的估计,更复杂的方法是计算 power spectrum estimate 使用技术,如 periodograms (实施人 scipy.signal.periodogram )以及 Welch's method (实施人 scipy.signal.welch )。然而,请注意,在这些情况下,计算的频谱与振幅的平方成正比,因此其平方根提供了均方根(RMS)振幅的估计值。

    返回信号 x个 按常规采样率采样 fs公司 ,这样的功率谱估计值可以按照scipy文件样本中的描述获得,如下所示:

    f, Pxx = signal.periodogram(x, fs)
    A_rms = np.sqrt(Pxx)
    

    相应的频率 f 也会在过程中进行计算,因此您可以使用

    plt.plot(f, A_rms)
    

    使用 西皮。信号韦尔奇 非常相似,但使用的实现略有不同,这提供了不同的精度/分辨率权衡。

        2
  •  1
  •   andrrrify    8 年前
    from scipy import signal
    import matplotlib.pyplot as plt
    fs = 10e3
    N = 1e5
    amp = 2 * np.sqrt(2)
    noise_power = 0.01 * fs / 2  
    time = np.arange(N) / float(fs)
    mod = 500*np.cos(2*np.pi*0.25*time)
    carrier = amp * np.sin(2*np.pi*3e3*time + mod)
    noise = np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
    noise *= np.exp(-time/5)
    x = carrier + noise
    f, t, Sxx = signal.spectrogram(x, fs)
    plt.pcolormesh(t, f, Sxx)
    plt.ylabel('Frequency [Hz]')
    plt.xlabel('Time [sec]')
    plt.show()
    

    这是从scipy文档中提取的,因为您需要科学计算来创建光谱图。 如果尚未在计算机上安装scipy,请阅读其文档:

    https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.spectrogram.html