python+音频数字信号处理

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

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

 二、一些参数说明

针对一个音频信号:

2.1、通道数

是在采集声音时用几个通道去录制声音,单声道和双声道的音频文件较为常见。例如在声源的不同位置放置通道去录制,则可以获得多通道的音频数据。

以双通道(左右声道)的音频举例,数据存储格式为:【左1右1-左2右2-左3右3-左4右4-左5右5-左6右6...】

2.2、采样位数

将采样值振幅量化成已知的振幅,常见的量化位数有8位【1字节】、16位【2字节】、32位【4字节】

其中8位可以存储256个振幅值,16位可以存储65536个振幅值,32位可以存储4294967296个振幅值

采样位数又叫做量化位数、位深度、分辨率,即每个表示振幅值的位数长度

2.3、采样率

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

2.4、帧数

样本个数,一般是单个通道的采样个数,假设某段音频的帧数为100,即采样了100次,如果是双通道,则分别采样100次,而总共采样了200个振幅数据【每个通道100个振幅数据】

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

三、python代码实现wav文件处理

import wave  
import numpy as np
import 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 = 10000
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)
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() 

绘图结果:

 四、代码分析

4.1、读取wav文件

import wave  
import numpy as np
import 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='not compressed')

即通道数为2,位深度为2字节,采样率为44100Hz,帧数为9507502【一个通道9507502,两个通道需要乘2=19015004】

4.3、读取帧数据并且按照short进行存储

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)

默认读取返回的是字符串:

 将这个字符串转为short数组,数组大小为:

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

帧数=采样率*时间

说明:

①、内存储存

 ②、16位PCM的WAV文件,能够存储的幅度范围是-32768到32767,用Python读取WAV并绘图,幅度就是这个范围;但是用Matlab读取WAV(使用audioread函数),幅度范围是-1到1,是因为audioread自动进行了幅度标准化,使其映射到 -1 到 1 的浮点数范围内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
音频信号处理是指使用计算机对音频信号进行各种操作和处理的过程。在Python中,可以使用各种库和工具进行音频信号处理。下面是一些常用的方法和步骤: 1. 读取音频文件:使用Python中的库,如wave、soundfile或pydub,可以读取.wav、.mp3等格式的音频文件,并将其转换为数字信号进行处理。 2. 分析音频信号:可以使用库如Librosa或Scipy来分析音频信号的特征,如频谱、音调、节奏等。这些特征可以帮助我们理解音频信号的内容和结构。 3. 音频滤波:滤波是音频信号处理中的一项重要技术,可以通过去除噪声或改变音频的频率响应来改善音频质量。Python中的库,如Scipy或pydsm,提供了各种滤波器设计和应用的功能。 4. 音频增强:音频增强是通过增加音频的音量、改变音频的平衡或增加音频效果等方式改善音频质量或增强音频的感染力。Python中的库,如pydub,可以完成这些任务。 5. 音频编码和解码:音频编码是将数字音频信号转换为可传输或存储的压缩格式,而音频解码是将压缩格式的音频还原为数字音频信号。Python中的库,如pydub或ffmpeg-python,提供了音频编码和解码的功能。 6. 音频可视化:音频可视化可以帮助我们直观地理解音频信号的特征和结构。Python中的库,如matplotlib或librosa.display,可以用于绘制音频信号的波形图、频谱图等。 总结一下,Python提供了丰富的库和工具,可以进行音频信号处理。我们可以使用这些库来读取、分析、滤波、增强、编码和解码音频信号,并通过可视化来展示和理解音频信号的特征。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱小勇本勇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值