Code前端首页关于Code前端联系我们

python+wav文件声音周杰伦《告白气球》数字信号处理

terry 2年前 (2023-09-24) 阅读数 63 #后端开发

1.从网上下载了一个wav文件,周杰伦的《告白气球》

python+wav文件音频周杰伦《告白气球》数字信号处理

网站:https://www.xmwav.com/

2.一些参数说明 对于音频信号:

2.1,通道数

是采集声音时使用多个通道来录制声音。单声道和双声道音频文件更为常见。例如,将通道放置在音源的不同位置进行录音,就可以获得多通道的音频数据。

以两声道(左右)音频为例,数据存储格式为:[Left 1 Right 1-Left 2 Right 2-Left 3 Right 3-Left 4 Right 4-Left 5 Right 5-Left 6右6..】

2.2。采样位

将样本值幅度量化为已知幅度。常见的量化位有8位[1字节]、16位[2字节]和32位[4字节]

8位可存储256个幅度值,16位可存储65536个幅度值,32位可存储729699个幅度值值

采样位数又称为量化位数、位深、分辨率,即表示幅度值的每一位的长度

2.3,采样率❀每秒采集的样本数,每个通道同时采集,常见的音频处理有11025Hz、22050Hz、24000Hz、44100Hz、48000Hz

2,4,帧数通常就是样本数。假设特定音频片段的帧数为100,即采样100次。如果是双通道,分别采样100次,总共采样了200个幅度数据【每通道100个幅度数据】

以16PCM、双通道为例,存储格式为【左1低字节,左1高字节,右1低字节右1高字节-左2低字节左2高字节右2低字节右2高字节...】

3.Python代码实现wav文件处理

import wave  import numpy as npimport pylab as plt 
#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。f = wave.open(r"C:\Users\jude\Desktop\jay.wav","rb")#读取格式信息  #一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采  #样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息params = f.getparams()  print(params)# _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=9507502, comptype='NONE', compname='not compressed')nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据  #读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)  # nframes = 10000str_data  = f.readframes(nframes)  # print(str_data)f.close()#将波形数据转换成数组#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组  wave_data = np.fromstring(str_data,dtype = np.short)#将wave_data数组改为2列,行数自动匹配。在修改shape的属性时,需使得数组的总长度不变。print(wave_data.shape)wave_data.shape = -1,2#转置数据wave_data = wave_data.T#通过取样点数和取样频率计算出每个取样的时间。time=np.arange(0,nframes)/framerate#print(params)  plt.figure(1) plt.subplot(2,1,1)  #time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标plt.plot(time,wave_data[0])  plt.subplot(2,1,2)  plt.plot(time,wave_data[1],c="r")  plt.xlabel("time")  plt.show()

绘图结果:

python+wav文件音频周杰伦《告白气球》数字信号处理

4.代码分析

4.1。读取 wav 文件

import wave  import numpy as npimport pylab as plt 
f = wave.open(r"C:\Users\jude\Desktop\jay.wav","rb")

4.2。获取文件格式信息

params = f.getparams()  print(params)nchannels, sampwidth, framerate, nframes = params[:4]

结果:_wave_params(nchannels=2, sampwidth=2,framerate=44100, nframes=9507502, comptype='NONE', compname='未压缩')

通道的编号,即为2,位深为2字节,采样率为44100Hz,帧数为9507502【一个通道是9507502,两个通道必须乘以2=19015004】

4.3。读取帧数据并将其存储为短数组

str_data  = f.readframes(nframes)  print(str_data)f.close()#将波形数据转换成数组#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组  wave_data = np.fromstring(str_data,dtype = np.short)#将wave_data数组改为2列,行数自动匹配。在修改shape的属性时,需使得数组的总长度不变。print(wave_data.shape)

默认读取返回一个字符串:

python+wav文件音频周杰伦《告白气球》数字信号处理

将此字符串转换为短数组。矩阵大小为:

python+wav文件音频周杰伦《告白气球》数字信号处理

4.4。转换为双通道矩阵

wave_data.shape = -1,2#转置数据wave_data = wave_data.T#通过取样点数和取样频率计算出每个取样的时间。

将19015004行1列的一维矩阵转换为9507502行2列的二维数据。第一列是 1 个通道,第二列是 2 个通道

4.5。获取此声音和绘图的持续时间

time=np.arange(0,nframes)/framerate#print(params)  plt.figure(1) plt.subplot(2,1,1)  #time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标plt.plot(time,wave_data[0])  plt.subplot(2,1,2)  plt.plot(time,wave_data[1],c="r")  plt.xlabel("time")  plt.show() 

帧数 = 采样率 * 时间

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门