首页 > 编程语言 >python+音频数字信号处理

python+音频数字信号处理

时间:2023-06-23 19:11:24浏览次数:38  
标签:plt python 音频 wave params 数组 time data 信号处理

一、在网上下载了一个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() 

帧数=采样率*时间

 

标签:plt,python,音频,wave,params,数组,time,data,信号处理
From: https://www.cnblogs.com/judes/p/17499741.html

相关文章

  • 用python写一个保存文本到文件的函数
    用python写一个保存文本到文件的函数━━━━━━━━━━━━━━━━━━━━━━━━━可以通过Python的文件操作来实现保存文本到文件的功能。下面是一个保存文本到文件的函数的示例:defsave_text_to_file(text,file_path):try:withopen(file_path,'w')a......
  • Python播放GIF图片(ChatGPT代码参考)
    在网上找了好几个方法,最后还是出现各种问题,解决不了播放GIF的功能。最后,通过ChatGPT给出了简单明了的方案(使用第三方库imageio和matplotlib.animation来实现),调试直接通过。但有小瑕疵,就是显示gif时隐藏掉坐标轴的功能无效,于是再做了一下优化。 [最终代码]显示GIF动画:imp......
  • 基于Python+QT5+Dialog开发的舆情可视化分析系统
    基于Python+QT5开发的舆情可视化分析系统项目介绍......
  • 花朵识别系统Python+TensorFlow+Django+卷积神经网络算法实现
    一、背景花朵识别系统,基于Python实现,深度学习卷积神经网络,通过TensorFlow搭建卷积神经网络算法模型,并对数据集进行训练最后得到训练好的模型文件,并基于Django搭建可视化操作平台。在当今信息化社会,图像识别技术在各种领域都展现出了重要的应用价值,包括医学影像分析、自动驾驶、......
  • 文本识别分类系统python,基于深度学习的CNN卷积神经网络算法
    一、介绍文本分类系统,使用Python作为主要开发语言,通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练,最后得到一个h5格式的本地模型文件,然后采用Django开发网页界面,实现用户在界面中输入一段文字,识别其所属的文本种类。在我们的日常生活和工作中,文本数据无......
  • 解放计算力:使用并行处理提升python for循环速度
    Python是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈。幸运的是,Python提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作。本文将介绍如何使用并行处理技术来优化for循环,从而提高Python程序的执行速度。我们将讨论并行处......
  • Python基于Socket编写TcpServer通信基本框架
    如下主要是实现单客户端连接通信,如下为Socket模块的常用属性和方法介绍。如要实现多客户端连接,请使用threading模块的多线程技术实现。属性:•socket.AF_INET:IPv4地址族。•socket.AF_INET6:IPv6地址族。•socket.SOCK_STREAM:TCP协议类型。•socket.SOCK_DGRAM:UDP协议类......
  • gRPC学习记录--python
    gRPC学习记录基于:gRPC官方文档中文版v1.0目录gRPC学习记录gRPC是什么?应用在准备:安装安装Git安装gRPCPython使用protocolbuffersProtocolbuffers版本HelloWorfgRPC!定义服务生成gRPC代码写一个服务器服务实现服务端实现写一个客户端连接服务调用RPC试一下!gRPC......
  • Ubuntu-Python创建虚拟环境
    要在Ubuntu上使用VSCode为Python创建一个虚拟环境,可以按照以下步骤进行:打开终端(Ctrl+Alt+T)。安装Python的虚拟环境工具(如果尚未安装):sudoaptinstallpython3-venv在终端中进入您希望创建虚拟环境的目录:cd/path/to/directory请将/path/to/direct......
  • Python 设计一个简单的计算器
    Python设计一个简单的计算器设计目标实现加减乘除及拓号优先级解析用户输入1-2*((6-3+(-5/5)*(9-2*3/3+7/3*7/4*12+10*5/5))-(-4*3)/(12-3*2))等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致......