特别鸣谢以下更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com

初中毕业读什么技校 http://cntkd.net

茂名一技http://www.enechn.com

ppt制作教程步骤 http://www.tpyjn.cn

兴化论坛http://www.yimoge.cn

电白论坛 http://www.fcdzs.com

永城信息港 http://www.1l4u.com

茂名一技有什么专业 http://www.jeob.cn

茂名市高级技工学校 http://www.szsyby.net

初中毕业读什么技校 http://www.ausq.cn

目录
  • 一、基础知识
  • 二、转换函数
  • 三、片段特征函数
  • 四、片段操作

一、基础知识

PCM(pulse code modulation) ,即脉冲编码调制,是将模拟信号转为数字信号的一种编码系统。而模数转换主要分两步,首先对连续的模拟信号进行采样,然后把采样得到的数据转化为数值,即量化。

设x xx为输入信号,F ( x ) F(x)F(x)为量化后的信号,则F ( x ) F(x)F(x)既可以是线性的,也可以是非线性的。在audioop中,主要提供三种编码支持,分别是a-Lawμ-Law以及ADPCM

在中国和欧洲主要实用的编码方式为A-Law,其表达式为:

其中A AA为压缩系数,在G.726标准中建议87.56。

ADPCM(Adaptive Differential PCM),即自适应差分PCM。

由于模拟信号的连续性,一般来说相邻时间单位的信号往往具有较高的线性度,甚至彼此相差无几,从而可以被高效率的压缩。然而,也存在跳跃幅度较大的信号,如果完全以缓变为原则,那么必然会丢失这部分数据。为了均衡这种差异,就需要进行自适应量化。

audioop中支持的Intel/DVI ADPCM算法可以在网上找到,但是信息并不多而且都很老旧,貌似不太重要的样子,甚至知网都搜不到,所以这里就不详细解读了。

二、转换函数

audioop提供了ADPCMA-Lawμ-Law和线性采样之间的转换函数

采样 ADPCM A-Law μ-Law
lin2lin lin2adpcm lin2alaw lin2ulaw
  adpcm2lin alaw2lin ulaw2lin

其中,与A-Lawμ-Law有关的转换函数的输入参数为(fragment, width),分别代表待处理片段和位宽;adpcm则会多一个state元组作为第三个参数,表示编码器状态。

lin2lin是将线性片段在1、2、3 和 4 字节格式之间转换的函数,其输入参数为(fragment, width, newwidth)。

下面新建一些数据来测试一下编码转换函数,

#下面代码来自于test_audioop.py
import audioop
import sys
import unittest

pack = lambda width, data :b’’.join(
? ? v.to_bytes(width, sys.byteorder, signed=True) for v in data)

packs = {w: (lambda *data, width=w: pack(width, data)) for w in (1, 2, 3, 4)}

unpack = lambda width, data: [int.from_bytes(
? ? data[i: i + width], sys.byteorder, signed=True)
? ? for i in range(0, len(data), width)]

datas = {
? ? 1: b’\x00\x12\x45\xbb\x7f\x80\xff’,
? ? 2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1),
? ? 3: packs[3](0, 0x123456, 0x456789, -0x456789, 0x7fffff, -0x800000, -1),
? ? 4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab,
? ? ? ? ? ? ? ? 0x7fffffff, -0x80000000, -1),
}

则datas的值为:

>>> for key in datas : print(datas[key])
...
b'\x00\x12E\xbb\x7f\x80\xff'
b'\x00\x004\x12gE\x99\xba\xff\x7f\x00\x80\xff\xff'
b'\x00\x00\x00V4\x12\x89gEw\x98\xba\xff\xff\x7f\x00\x00\x80\xff\xff\xff'
b'\x00\x00\x00\x00xV4\x12\xab\x89gEUv\x98\xba\xff\xff\xff\x7f\x00\x00\x00\x80\xff\xff\xff\xff'
>

则其转换函数测试如下:

>>> datas[1]
b'\x00\x12E\xbb\x7f\x80\xff'        #将要处理的1位线性码
>>> unpack(1,datas[1])
[0, 18, 69, -69, 127, -128, -1]     #转为整型
# 将1字节线性码转为2字节线性码
>>> datas1_2 = audioop.lin2lin(datas[1], 1, 2)
>>> print(datas1_2)
b'\x00\x00\x00\x12\x00E\x00\xbb\x00\x7f\x00\x80\x00\xff'
>>> unpack(2,datas1_2)    #转为整型,其值为datas[1]*256
[0, 4608, 17664, -17664, 32512, -32768, -256]
# 将1字节线性码转为1字节u-Law码
>>> datas1_u = audioop.lin2ulaw(datas[1], 1)
>>> unpack(1,datas1_u)   #转为整型,这个数和u-law的公式对不上,可能是其他算法
[-1, -83, -114, 14, -128, 0, 103]

三、片段特征函数

下表中函数的输入为(fragment, width),分别代表待统计片段和位宽。

  返回值
avg 片段采样值的均值
avgpp 片段采样值的平均峰峰值
max 片段采样值的最大绝对值
maxpp 声音片段中的最大峰峰值
minmax 由片段采样值中最小和最大值组成的元组
rms 片段的均方根
cross 片段穿越零点的次数

getsample(fragment, width, index),顾名思义用于采样,返回段中采样值索引index的值。

findfactor(fragment, reference),返回一个系数F使得rms(add(fragment, mul(reference, -F)))最小,即返回的系数乘以reference后与fragment最匹配。两个片段都应包含 2 字节宽的采样。

findfit(fragment, reference),尽可能尝试让 reference 匹配 fragment 的一部分。

findmax(fragment, length),在fragment中搜索所有长度为length的采样切片中,能量最大的那一个切片,即返回 i 使得 rms(fragment[i*2:(i+length)*2]) 最大。

四、片段操作

其返回值均为片段,下表的参数中,f表示fragment,w表示width,L表示lfactor,R表示rfactor

audioop.ratecv(f, w, nchannels, inrate, outrate, state[, weightA[, weightB]])

可用于转换输入片段的帧速率,其中

  • state为元组,表示转换器状态
  • weightA和weightB是简单数字滤波器的参数,默认为 1 和 0。

到此这篇关于如何利用python处理原始音频数据的文章就介绍到这了,更多相关利用python处理原始音频数据内容请搜索菜鸟教程www.piaodoo.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持菜鸟教程www.piaodoo.com!

如何利用python处理原始音频数据相关推荐

  1. python处理原始音频数据

    文章目录 基础知识 转换函数 片段特征函数 片段操作 audioop是python标准库中用于处理原始音频数据的模块,封装了一些便捷的编码转换函数. 基础知识 PCM(pulse code modul ...

  2. 使用Sinc卷积从原始音频数据进行轻量级的端到端语音识别

    论文: Lightweight End-to-End Speech Recognition from Raw Audio Data Using Sinc-Convolutions 摘要: 许多端到端自 ...

  3. python录入数据至ppt_利用Python进行数据分析之 数据加载.ppt

    利用Python进行数据分析之 数据加载 " " " " 数据加载,存储与文件格式 1,读写文本格式数据: (read_csv,read_table,read_ ...

  4. 利用Python批量识别电子账单数据

    文章目录 一.前言 二.调用Baidu aip识别 三.批量识别电子账单 一.前言 有一定数量类似如下截图所示的账单,利用 Python 批量识别电子账单数据,并将数据保存到Excel. 百度智能云接 ...

  5. 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据

    基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...

  6. 利用Python进行数据分析:数据规整(基于DataFrame)

    利用Python进行数据分析:数据规整 在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析.本部分关注可以聚合.合并.重塑数据的方法. 文章目录 利用Python进行数据分析:数据 ...

  7. 利用Python对NBA SportUV数据进行可视化及分析

    利用Python对NBA SportUV数据进行可视化及分析 SportUV是2005年,由以色列计算机科学家Gal Oz和Miky Tamir 创立的,其实,最早这两位大牛是搞导弹跟踪和高级光学识别 ...

  8. 利用python获取word图表数据和修改图表信息

    利用python获取word图表数据和修改图表信息 起因咸鱼有个人问word怎么修改图表信息,想用docx库找不到关于图表的方法,这里用了Win32com. import time import wi ...

  9. 利用python爬取股票交易数据

    利用python爬取股票交易数据 分析网站 找到返回的url url = https://xueqiu.com/service/v5/stock/screener/quote/list?page={p ...

最新文章

  1. 2017-2018-2 20165301 实验五《网络编程与安全》实验报告
  2. Java实现八皇后问题的解法(一维数组版本)
  3. 【MATLAB统计分析与应用100例】案例004:matlab调用smoothts函数对金融时间序列数据进行平滑处理
  4. 华侨大学计算机学院2019,华侨大学计算机科学与技术学院2019年非全日制研究生复试成绩(第四批)...
  5. why2cs学习之路
  6. android activity启动模式_从0系统学Android--2.5Activity启动模式
  7. XPATH获取USER列用户ID的小方法
  8. 一种新的排序算法,基于优先队列
  9. 捷宇高拍仪XY530 网页集成总结
  10. 基因组时代线粒体基因组拼装策略及软件应用现状
  11. 尚硅谷实战项目---手机影音APP
  12. clang diagnostic
  13. RK3568-ANDROID11-降频DDR
  14. Unity3d实现阿拉伯语适配,不规则特殊字符的处理。
  15. 联想 Thinkpad SL410使用体验
  16. 盘点大数据商业智能的十大戒律
  17. Spring Cloud 2022.0.0正式发布:OpenFeign稳得很全面迈向GraalVM
  18. mac笔记本当做服务器记录
  19. Manjaro 安装MySQL
  20. JQuery中常用的 属性选择器

热门文章

  1. android中clip的使用
  2. Paper Note - HOLMES:基于可疑信息流的实时APT检测
  3. 关于开发Android应用时写从图库选择头像功能时遇到的一些问题。
  4. 身体各个部分减肥方法
  5. 九江义犬舍身尝剧毒狗肉,百人送葬(zz)
  6. 求生之路2 局域网联机教程
  7. 7-6 悼念512汶川大地震遇难同胞 (20 分)
  8. win7 自建wifi热点供安卓手机/ipad 使用
  9. 甘肃省职称计算机应用能力要求暂行规定,甘肃省职称评审规定.doc
  10. python求奇数的乘积_python求偶数之积