如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# -*- coding: utf-8 -*-
import wave
import numpy as np
import matplotlib.pyplot as plt
# 打开wav文件 ,open返回一个的是一个wave_read类的实例,通过调用它的方法读取wav文件的格式和数据。
f = wave. open (r "d:\project\rec001.wav" , "rb" )
# 读取格式信息
# 一次性返回所有的wav文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采
# 样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
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)
# 将wave_data数组改为2列,行数自动匹配。在修改shape的属性时,需使得数组的总长度不变。
wave_data.shape = - 1 , 2
# 转置数据
wave_data = wave_data.t
# 通过取样点数和取样频率计算出每个取样的时间。
time = np.arange( 0 ,nframes / 2 ) / framerate
# print(params)
plt.figure( 1 )
# time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标
plt.subplot( 211 )
plt.plot(time,wave_data[ 0 ])
plt.xlabel( "time/s" )
plt.title( 'wave' )
n = 44100
start = 0
# 开始采样位置
df = framerate / (n - 1 )
# 分辨率
freq = [df * n for n in range ( 0 ,n)]
# n个元素
wave_data2 = wave_data[ 0 ][start:start + n]
c = np.fft.fft(wave_data2) * 2 / n
# 常规显示采样频率一半的频谱
plt.subplot( 212 )
plt.plot(freq[: round ( len (freq) / 2 )], abs (c[: round ( len (c) / 2 )]), 'r' )
plt.title( 'freq' )
plt.xlabel( "freq/hz" )
plt.show()
|
以上这篇使用python进行波形及频谱绘制的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sinat_29242905/article/details/86499907