【问题标题】:Python: Frequency Analysis of Sound FilesPython:声音文件的频率分析
【发布时间】:2011-05-17 23:45:52
【问题描述】:

我正在生成一些声音文件,它们以不同频率播放具有一定数量谐波的音调。
最终,这些声音将在带有小扬声器的设备上播放。

我有扬声器的频率响应曲线,想在 Python 中做以下事情:

  1. 绘制声音文件的频谱。我需要对文件进行 FFT 并用gnuplot 绘制它
  2. 根据数据表中的频率响应曲线应用非线性传递函数。
  3. 绘制函数应用后的结果。

有谁知道:

  • 最简单的方法会是什么?
  • 或可以为我执行此操作的应用程序(基于 GNU/Linux)?

【问题讨论】:

标签: python audio wav fft gnuplot


【解决方案1】:

scipy 有一个 FFT 并很好地连接到 gnuplot。您应该可以使用signal 模块进行数学运算。

【讨论】:

    【解决方案2】:

    我知道你没有提到 Pylab/Matplotlib,但它确实有效。下面是一个例子(假设单通道信号):

    x, fs, nbits = audiolab.wavread('schubert.wav')
    audiolab.play(x, fs)
    N = 4*fs    # four seconds of audio
    X = scipy.fft(x[:N])
    Xdb = 20*scipy.log10(scipy.absolute(X))
    f = scipy.linspace(0, fs, N, endpoint=False)
    pylab.plot(f, Xdb)
    pylab.xlim(0, 5000)   # view up to 5 kHz
    
    Y = X*H
    y = scipy.real(scipy.ifft(Y))
    

    【讨论】:

    • 不,我的意思是H。对不起,我只是跳过了一堆步骤,因为我很懒。如果h 是你的脉冲响应,那么H = scipy.fft(h)。在您问题的第 2 项中,您将直接获得传递函数频率响应,即H
    • 顺便说一句,20*log10 表示声波的压力。对于声音强度,它应该是 10*log10。
    【解决方案3】:

    您可以使用 numpy 和 matPlotLib。类似于下面的代码:

    spectrum = numpy.fft.fft(signal)
    frequencies = numpy.fft.fftfreq(len(spectrum))
    pylab.plot(frequencies,spectrum)
    pylab.show()
    

    这将显示 fft 频谱图。

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      相关资源
      最近更新 更多