Python: 声音文件的频率分析

7 投票
3 回答
26338 浏览
提问于 2025-04-16 07:49

我正在生成一些声音文件,这些文件会播放不同频率的音调,并且有一定数量的谐波。
最终,这些声音会在一个小扬声器的设备上播放。

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

  1. 绘制声音文件的频谱。我需要对文件进行快速傅里叶变换(FFT),然后用 gnuplot 来绘图。
  2. 根据数据表中的频率响应曲线,应用一个非线性传递函数。
  3. 在应用这个函数后,绘制结果。

有没有人知道:

  • 做这些事情的最简单方法是什么?
  • 或者有没有一个应用程序(基于GNU/Linux)可以帮我完成这些?

3 个回答

0

scipy 是一个很棒的工具,它有快速傅里叶变换(FFT)的功能,并且可以很方便地和gnuplot这个绘图工具配合使用。你可以使用signal模块来进行相关的数学计算。

4

你可以使用numpy和matplotlib这两个库。下面的代码大概是这样的:

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

这段代码会显示一个fft频谱的图表。

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))

撰写回答