设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11667|回复: 0

如何利用python处理原始音频数据

[复制链接]

90

主题

865

回帖

1576

积分

金牌会员

Rank: 6Rank: 6

积分
1576
发表于 2022-3-26 11:00:15 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录


一、基础知识
  1. PCM(pulse code modulation)
复制代码
,即脉冲编码调制,是将模拟信号转为数字信号的一种编码系统。而模数转换主要分两步,首先对连续的模拟信号进行采样,然后把采样得到的数据转化为数值,即量化。
设x xx为输入信号,F ( x ) F(x)F(x)为量化后的信号,则F ( x ) F(x)F(x)既可以是线性的,也可以是非线性的。在
  1. audioop
复制代码
中,主要提供三种编码支持,分别是
  1. a-Law
复制代码
  1. μ-Law
复制代码
以及A
  1. DPCM
复制代码


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

其中A AA为压缩系数,在G.726标准中建议87.56。
  1. ADPCM(Adaptive Differential PCM)
复制代码
,即自适应差分PCM。
由于模拟信号的连续性,一般来说相邻时间单位的信号往往具有较高的线性度,甚至彼此相差无几,从而可以被高效率的压缩。然而,也存在跳跃幅度较大的信号,如果完全以缓变为原则,那么必然会丢失这部分数据。为了均衡这种差异,就需要进行自适应量化。
audioop中支持的Intel/DVI ADPCM算法可以在网上找到,但是信息并不多而且都很老旧,貌似不太重要的样子,甚至知网都搜不到,所以这里就不详细解读了。

二、转换函数
  1. audioop
复制代码
提供了
  1. ADPCM
复制代码
  1. A-Law
复制代码
  1. μ-Law
复制代码
和线性采样之间的转换函数
采样ADPCMA-Lawμ-Lawlin2linlin2adpcmlin2alawlin2ulaw adpcm2linalaw2linulaw2lin其中,与
  1. A-Law
复制代码
  1. μ-Law
复制代码
有关的转换函数的输入参数为(
  1. fragment
复制代码
,
  1. width
复制代码
),分别代表待处理片段和位宽;
  1. adpcm
复制代码
则会多一个
  1. state
复制代码
元组作为第三个参数,表示编码器状态。
  1. lin2lin
复制代码
是将线性片段在1、2、3 和 4 字节格式之间转换的函数,其输入参数为(
  1. fragment
复制代码
,
  1. width
复制代码
,
  1. newwidth
复制代码
)。
下面新建一些数据来测试一下编码转换函数,
  1. #下面代码来自于test_audioop.py
  2. import audioop
  3. import sys
  4. import unittest

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

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

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

  11. datas = {
  12.     1: b'\x00\x12\x45\xbb\x7f\x80\xff',
  13.     2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1),
  14.     3: packs[3](0, 0x123456, 0x456789, -0x456789, 0x7fffff, -0x800000, -1),
  15.     4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab,
  16.                 0x7fffffff, -0x80000000, -1),
  17. }
复制代码
则datas的值为:
  1. >>> 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'>
复制代码
则其转换函数测试如下:
  1. >>> 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]
复制代码
三、片段特征函数

下表中函数的输入为(
  1. fragment
复制代码
,
  1. width
复制代码
),分别代表待统计片段和位宽。
返回值avg片段采样值的均值avgpp片段采样值的平均峰峰值max片段采样值的最大绝对值maxpp声音片段中的最大峰峰值minmax由片段采样值中最小和最大值组成的元组rms片段的均方根cross片段穿越零点的次数
  1. getsample(fragment, width, index)
复制代码
,顾名思义用于采样,返回段中采样值索引index的值。
  1. findfactor(fragment, reference)
复制代码
,返回一个系数F使得
  1. rms(add(fragment, mul(reference, -F)))
复制代码
最小,即返回的系数乘以
  1. reference
复制代码
后与
  1. fragment
复制代码
最匹配。两个片段都应包含 2 字节宽的采样。
  1. findfit(fragment, reference)
复制代码
,尽可能尝试让
  1. reference
复制代码
匹配
  1. fragment
复制代码
的一部分。
  1. findmax(fragment, length)
复制代码
,在
  1. fragment
复制代码
中搜索所有长度为length的采样切片中,能量最大的那一个切片,即返回 i 使得 rms(fragment[i*2:(i+length)*2]) 最大。

四、片段操作

其返回值均为片段,下表的参数中,f表示fragment,w表示width,L表示lfactor,R表示rfactor
  1. audioop.ratecv(f, w, nchannels, inrate, outrate, state[, weightA[, weightB]])
复制代码
可用于转换输入片段的帧速率,其中

  • state为元组,表示转换器状态
  • weightA和weightB是简单数字滤波器的参数,默认为 1 和 0。
到此这篇关于如何利用python处理原始音频数据的文章就介绍到这了,更多相关利用python处理原始音频数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表