##matlab转python实现(四)
##后附完整代码及windows环境下的pyaudio库的安装。
Wav信号的录制与频谱分析
程序结构
自定义函数
#定义sound recoding 函数
参数为录音时间t。
def
sound_rec(t):
#定义wav文件读取函数
参数为wav文件的路径path,代码中因为保存的录音文件就在该代码路径下,可以不用输入绝对路径。返回值为:左右声道的波形数组wave_data,采样率framerate,采样率*时间nframes
def wave_read(path):
#定义画出时域上的波形图函数time plot
第一个参数为采样率,第二个参数为采样率*时间,第三个参数为左右声道的数据wave data list
def time_plt(frames,nframes,wave):
#定义画出信号频谱上的波形图函数frequence plot
第一个参数为采样率,第二个参数为左右声道的数据wave data list
def freq_plt(frames,wave):
主要进程
a.
录制音频,将音频保存在文件路径下的output.wav文件中。(本步骤可以忽略,在已经录制过音频的情况下。)
b.
读取音频信号,将双声道信号的信息存储在数组中,并得出采样率,以及信号长度。
c.
做出时域上的波形图,频域上,进行傅里叶变换,单边谱处理以及归一化处理,得出频域幅度谱,最后一起显示。
附完整代码
import wave
import pyaudio
import numpy
from pyaudio import PyAudio
import matplotlib.pyplot as plt
def sound_rec(t):
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = t
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)
print("start recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
def wave_read(path):
wf = wave.
open(path, 'rb')
p = PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)
nframes = wf.getnframes()
framerate = wf.getframerate()
str_data = wf.readframes(nframes)
wf.close()
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
wave_data.shape = -1,2
wave_data = wave_data.T
return wave_data,framerate,nframes
def time_plt(frames,nframes,wave):
time = numpy.arange(0, nframes)*(1.0/frames)
plt.figure(num=1,figsize=(6,4))
plt.subplot(211)
plt.plot(time, wave[0], c='r')
plt.subplot(212)
plt.plot(time, wave[1], c='g')
plt.xlabel('time (seconds)')
plt.ylabel('ampliude')
def freq_plt(frames,wave):
N = 44100
start = 0
df = frames/(N-1)
freq = [df*n for n in range(0, N)]
wave_data2 = wave[0][start:start+N]
c = numpy.fft.fft(wave_data2)*2/N
d = int(len(c)/2)
while freq[d] > 4000:
d -= 10
plt.figure(num=2,figsize=(6,4))
plt.plot(freq[:d-1
], abs(c[:d-1]), 'r')
wave,frames,nframes=wave_read('output.wav')
time_plt(frames,nframes,wave)
freq_plt(frames,wave)
plt.show()
- 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
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 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
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
windows下安装pyaudio库
建议工具:一个python编辑器(用来查看你的python.exe存放的位置),windows powershell。
首先下载一个
直接使用pip install来安装会报错error:failed building wheel for pyaudio。
找适合自己的版本,本机环境为window+python3.7选择了PyAudio-0.2.11-cp37-cp37m-win_amd64.whl。自己看情况选择。
下载完后放在自己的python的Scripts文件夹下;这里找不到可以在自己的python编辑器里面找路径,会方便一点。
之后通过powershell进入scripts文件夹下:
~$: cd Scripts
~/Scripts$: pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
~/Scripts$: pip install pyaudio
最后试用上述代码,没报错就为成功。