作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在过去 2 周内搜索了这个问题,但无法找到算法或解决方案。我有一些简短的 .wav 文件,但它有 MULAW 压缩,而 python 内部似乎没有功能 wave.py
可以成功解压它。所以我决定自己在 python 中构建一个解码器。
我在基本元素中找到了一些关于 MULAW 的信息:
float
范围为 -1 到 +1 ,并且带有从 –32,768 到 32,767 的有符号短整数,因此看起来我需要将其从
转换short int
至
float
在特定范围内。
u = 0xff
data_chunk = b'\xe7\xe7' # -6169
data_to_r1 = unpack('h',data_chunk)[0]/0xffff # I suspect this is wrong,
# # but I don't know what else
u_law = ( -1 if data_chunk<0 else 1 )*( pow( 1+u, abs(data_to_r1)) -1 )/u
.wav
PCM 调制的文件类型,而不是在出现疯狂压缩时如何管理它。
最佳答案
因此,在搜索 google 之后,在 github 中找到了解决方案(去图)。我搜索了许多算法,发现 1 个在有损压缩的误差范围内。 这适用于 30 -> 1 的正值和 -32 -> -1 的负值的 u 定律
老实说,我认为这个解决方案是足够的,但不是完全按照方程说的,但它是目前最好的解决方案。此代码直接从 gcc9108 audio codec 转录到 python
def uLaw_d(i8bit):
bias = 33
sign = pos = 0
decoded = 0
i8bit = ~i8bit
if i8bit&0x80:
i8bit &= ~(1<<7)
sign = -1
pos = ( (i8bit&0xf0) >> 4 ) + 5
decoded = ((1 << pos) | ((i8bit & 0x0F) << (pos - 4)) | (1 << (pos - 5))) - bias
return decoded if sign else ~decoded
def uLaw_e(i16bit):
MAX = 0x1fff
BIAS = 33
mask = 0x1000
sign = lsb = 0
pos = 12
if i16bit < 0:
i16bit = -i16bit
sign = 0x80
i16bit += BIAS
if ( i16bit>MAX ): i16bit = MAX
for x in reversed(range(pos)):
if i16bit&mask != mask and pos>=5:
pos = x
break
lsb = ( i16bit>>(pos-4) )&0xf
return ( ~( sign | ( pos<<4 ) | lsb ) )
print( 'normal :\t{0}\t|\t{0:2X}\t:\t{0:016b}'.format(0xff) )
print( 'encoded:\t{0}\t|\t{0:2X}\t:\t{0:016b}'.format(uLaw_e(0xff)) )
print( 'decoded:\t{0}\t|\t{0:2X}\t:\t{0:016b}'.format(uLaw_d(uLaw_e(0xff))) )
normal : 255 | FF : 0000000011111111
encoded: -179 | -B3 : -000000010110011
decoded: 263 | 107 : 0000000100000111
seeemmmm
G.711 中描述的方法,那种用户奥利弗查尔斯沃思建议我查看,数据中最大值的解码值为 -8036,接近 uLaw 规范的最大值,但我无法对解码函数进行逆向工程以从维基百科获得二进制等效函数.
wave.py
解码数据并写入 wav 文件后我已经成功地编写了一个新的原始线性 PCM 文件。这有效......即使我一开始持怀疑态度。
关于Python u-Law (MULAW) 波解压到原始波信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085735/
我是一名优秀的程序员,十分优秀!