问题描述
我有一些wav文件.我想使用SciPy FFT绘制这些wav文件的频谱图.我将如何去做?
I have a handful of wav files. I'd like to use SciPy FFT to plot the frequency spectrum of these wav files. How would I go about doing this?
推荐答案
Python
提供了一些api来相当快地完成此操作.我从此链接下载了绵羊哭声wav文件.您可以将其保存在桌面上,并在终端中的cd
上保存.在python
提示符下的这些行应该足够了:(忽略>>>
)
Python
provides several api to do this fairly quickly. I download the sheep-bleats wav file from this link. You can save it on the desktop and cd
there within terminal. These lines in the python
prompt should be enough: (omit >>>
)
import matplotlib.pyplot as plt
from scipy.fftpack import fft
from scipy.io import wavfile # get the api
fs, data = wavfile.read('test.wav') # load the data
a = data.T[0] # this is a two channel soundtrack, I get the first track
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1)
c = fft(b) # calculate fourier transform (complex numbers list)
d = len(c)/2 # you only need half of the fft list (real signal symmetry)
plt.plot(abs(c[:(d-1)]),'r')
plt.show()
这是输入信号的图:
Here is a plot for the input signal:
这是光谱
要获得正确的输出,必须将xlabel
转换为频谱图的频率.
For the correct output, you will have to convert the xlabel
to the frequency for the spectrum plot.
k = arange(len(data))
T = len(data)/fs # where fs is the sampling frequency
frqLabel = k/T
如果必须处理大量文件,则可以将其实现为一个函数:将这些行放入test2.py
:
If you are have to deal with a bunch of files, you can implement this as a function:put these lines in the test2.py
:
import matplotlib.pyplot as plt
from scipy.io import wavfile # get the api
from scipy.fftpack import fft
from pylab import *
def f(filename):
fs, data = wavfile.read(filename) # load the data
a = data.T[0] # this is a two channel soundtrack, I get the first track
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1)
c = fft(b) # create a list of complex number
d = len(c)/2 # you only need half of the fft list
plt.plot(abs(c[:(d-1)]),'r')
savefig(filename+'.png',bbox_inches='tight')
说,我在当前工作目录中有test.wav
和test2.wav
,在python
提示符界面中的以下命令就足够了: 导入测试2 map(test2.f,['test.wav','test2.wav'])
Say, I have test.wav
and test2.wav
in the current working dir, the following command in python
prompt interface is sufficient: import test2 map(test2.f, ['test.wav','test2.wav'])
假设您有100个此类文件,并且不想单独键入它们的名称,则需要glob
软件包:
Assuming you have 100 such files and you do not want to type their names individually, you need the glob
package:
import glob
import test2
files = glob.glob('./*.wav')
for ele in files:
f(ele)
quit()
如果.wav文件不是同一位,则需要在test2.f中添加getparams
.
这篇关于Python Scipy FFT WAV文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!