1、需求分析
现有一个QPSK.wav的音频文件,要求使用Python读取该文件画出其波形和频谱。
2、代码实现
import wave
import numpy
as np
import pylab
as pl
f = wave.open(
r"E:\团队文件\音频\14、QPSK.wav",
"rb")
params = f.getparams()
nchannels, sampwidth,framerate, nframes = params[:
4]
str_data = f.readframes(nframes)
f.close()
wave_data = np.fromstring(str_data,dtype = np.short)
time=np.arange(
0,nframes)/framerate
len_time = len(time)//
2
time = time[
0:len_time]
fft_size =
512
xs = wave_data [:fft_size]
xf = np.fft.rfft(xs)/fft_size
freqs = np.linspace(
0, framerate/
2, fft_size/
2+
1)
xfp =
20*np.log10(np.clip(np.abs(xf),
1e-20,
1e100))
pl.figure(figsize=(
8,
4))
pl.subplot(
311)
pl.plot(time,wave_data)
pl.xlabel(
"time(s)")
pl.title(
u"WaveForm And Freq")
pl.subplot(
312)
pl.plot(time[:fft_size], xs)
pl.xlabel(
u"Time(S)")
pl.subplot(
313)
pl.plot(freqs, xfp)
pl.xlabel(
u"Freq(Hz)")
pl.subplots_adjust(hspace=
0.4)
pl.show()
注意:
len_time =
len(
time
time =
time[
0:len_time]
1、上一篇MORSE音频的代码中没有上面两行代码。在该程序中就会报错: ValueError:x and y must have same first dimension, but have shapes (193032,) and (96516,) 提示plot函数里的两个参数维度不同,于是打印了time 和 wave_data[0]的长度: 所以将time的长度截取一半,再run一边,图就出现啦。
2、在使用Python进行矩阵操作时,当内部含有除法时,会产生错误:
TypeError: slice indices must be integers or None or have an index method.
解决办法:将len_time = len(time)/2中的“/”改为“//”,即:len_time = len(time)//2,程序就可以正常运行了。
3、实现结果
4、结果分析
在pycharm运行中可以看出wav文件的格式信息如下: 上图中第一条波形为音频文件的原始波形;第二条波形为512个取样点的波形;第三条波形为512个取样点的波形对应的频谱图。