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

2023-07-0919:01:42后端程序开发Comments512 views字数 2680阅读模式

一、在网上下载了一个wav文件,周杰伦的《告白气球》文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

python+wav文件音频周杰伦《告白气球》数字信号处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

网址:https://www.xmwav.com/文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

 二、一些参数说明文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

针对一个音频信号:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

2.1、通道数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

是在采集声音时用几个通道去录制声音,单声道和双声道的音频文件较为常见。例如在声源的不同位置放置通道去录制,则可以获得多通道的音频数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

以双通道(左右声道)的音频举例,数据存储格式为:【左1右1-左2右2-左3右3-左4右4-左5右5-左6右6...】文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

2.2、采样位数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

将采样值振幅量化成已知的振幅,常见的量化位数有8位【1字节】、16位【2字节】、32位【4字节】文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

其中8位可以存储256个振幅值,16位可以存储65536个振幅值,32位可以存储4294967296个振幅值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

采样位数又叫做量化位数、位深度、分辨率,即每个表示振幅值的位数长度文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

2.3、采样率文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

每秒钟内采集的样本个数,每个通道分别同时采集,音频处理常见的有11025Hz、22050Hz、24000Hz、44100Hz、48000Hz文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

2.4、帧数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

样本个数,一般是单个通道的采样个数,假设某段音频的帧数为100,即采样了100次,如果是双通道,则分别采样100次,而总共采样了200个振幅数据【每个通道100个振幅数据】文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

以16PCM、双通道为例,存储格式为【左1低字节左1高字节右1低字节右1高字节-左2低字节左2高字节右2低字节右2高字节...】文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

三、python代码实现wav文件处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

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()

绘图结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

python+wav文件音频周杰伦《告白气球》数字信号处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

 四、代码分析文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

4.1、读取wav文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

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

4.2、获取文件格式信息文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

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

结果:_wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=9507502, comptype='NONE', compname='not compressed')文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

即通道数为2,位深度为2字节,采样率为44100Hz,帧数为9507502【一个通道9507502,两个通道需要乘2=19015004】文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

4.3、读取帧数据并且按照short进行存储文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

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)

默认读取返回的是字符串:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

python+wav文件音频周杰伦《告白气球》数字信号处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

将这个字符串转为short数组,数组大小为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

python+wav文件音频周杰伦《告白气球》数字信号处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

 4.4、转为双通道数组文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

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

将19015004行、1列的一维数组转为9507502行、2列的二维数据,第一列为1通道,第二列为2通道文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

4.5、获取这段音频的时长并绘图文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

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() 

帧数=采样率*时间文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51154.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/51154.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定