数字音频基本知识
1.声音
声音是一种波形。
1)频率(音调):声音1秒内周期性变化的次数。人耳的听觉频率范围在20Hz-20kHz。 低频的声音沉闷厚重,高频的声音尖锐刺耳。
2)振幅(响度):声音的大小。通常使用分贝(dB)形容声音大小。dB是一个比值,是一个数值,没有任何单位标注。
2.声音的采集和存储
1)采样:将连续量转化成离散量的过程。对声音的采样常用麦克风等设备将声音信号转换成电信号,再用模/数转换器将电信号转换成二进制表示的数字信号。每秒对声音采样上万次,获得上万个按照时间顺序排列的二进制数字。于是,我们就将连续变化不断的声音转化成了计算机可储存并识别的二进制数字。
2)采样频率:采样频率指录音设备在一秒钟内对声音信号的采样次数。采样频率越高,声音的还原就越真实越自然。
3)量化位数:量化位数指用几位二进制数来存储采样获得的数据。量化位数越大,声音的质量越高。采样后的声音越接近原始声音。
4)声道数:声道分为单声道与双声道。单声道即为左右耳听到的声音相同。双声道两耳听到的信息不同。
3.绘制时域波形图代码
# 绘制波形图
import wave
import matplotlib.pyplot as plt
import numpy as np
import os
s_path = 'F:\\libsoralearning\\music\\'
file = []
for files in os.listdir(s_path):
if files.endswith('.wav'):
file.append(files)
for i in range(len(file)):
f = wave.open(s_path + file[i], 'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# nchannels:声道数,sampwidth:量化位数,framerate:采样率,nframes:采样点数
str_data = f.readframes(nframes) # 读取音频
wave_data = np.frombuffer(str_data, dtype = np.int16)
wave_data = wave_data * 1.0/max(abs(wave_data)) # 幅值归一化
wave_data =np.reshape(wave_data, [nframes, nchannels]).T
f.close()
time = np.arange(0, nframes) * (1.0 / framerate)
time = np.reshape(time, [nframes, 1]).T
plt.plot(time[0, :nframes], wave_data[0, :nframes], c="b")
plt.xlabel("time(seconds)")
plt.ylabel("amplitude")
plt.title("Original wave")
plt.show()