Python:音频文件的频率分析

7
我正在生成一些声音文件,这些文件会以不同频率和一定数量的谐波播放。最终,这些声音将在一个带有小喇叭的设备上播放。
我有扬声器的频率响应曲线,并想在Python中执行以下操作:
  1. 绘制声音文件的频谱图。我需要对文件进行FFT并使用gnuplot进行绘制。
  2. 基于数据表中的频率响应曲线应用非线性转换函数。
  3. 在应用函数后绘制结果。
是否有人知道:
  • 最简单的方法是什么?
  • 或者是否有一个(基于GNU/Linux的)应用程序可以为我完成此操作?

SciPy的介绍包括执行FFT和绘制结果:http://www.scipy.org/Getting_Started - Thomas K
3个回答

10

我知道你没有提到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)。在你问题的第二项中,你直接得到了一个传递函数频率响应,所以那就是 H - Steve Tjoa
顺便说一句,20log10 显示声波的压力。对于声强度而言,应该使用10log10。 - Piotr Borys

4
你可以使用numpy和matPlotLib。类似下面的代码:
spectrum = numpy.fft.fft(signal)
frequencies = numpy.fft.fftfreq(len(spectrum))
pylab.plot(frequencies,spectrum)
pylab.show()

那将显示FFT频谱的图表。

0

Scipy拥有FFT并且可以很好地与gnuplot集成。您应该能够使用signal模块来进行数学计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接