gpt4 book ai didi

Python u-Law (MULAW) 波解压到原始波信号

转载 作者:行者123 更新时间:2023-11-28 21:37:12 37 4
gpt4 key购买 nike

我在过去 2 周内搜索了这个问题,但无法找到算法或解决方案。我有一些简短的 .wav 文件,但它有 MULAW 压缩,而 python 内部似乎没有功能 wave.py可以成功解压它。所以我决定自己在 python 中构建一个解码器。

我在基本元素中找到了一些关于 MULAW 的信息:

  • Wikipedia
  • A-law u-Law comparison
  • Some c-esc codec library

  • 所以我需要一些指导,因为我不知道如何从有符号短整数到全波信号。这是我目前收集的初步想法:

    所以从 wiki 我得到了一个 u-law 压缩和解压方程:

    压缩: compression

    解压: enter image description here

    所以从压缩方程来看,看起来输出仅限于 float范围为 -1 到 +1 ,并且带有从 –32,768 到 32,767 的有符号短整数,因此看起来我需要将其从 转换short int float 在特定范围内。

    现在,老实说,我以前听说过量化,但我不确定我是否应该先尝试去量化然后再解压或以其他方式,或者即使在这种情况下它是同一件事......教程/文档的术语可能有点棘手。

    我正在使用的波形文件应该包含类似于语音合成的“A”音,我可能可以通过比较某些音频软件和自定义波形分析器中的 2 个波形来验证成功,但我真的很想减少试错部分过程。

    所以我想到的是:
    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

    正如你所看到的,263-255 = 8 在界限内。当我尝试实现 seeemmmm G.711 中描述的方法,那种用户奥利弗查尔斯沃思建议我查看,数据中最大值的解码值为 -8036,接近 uLaw 规范的最大值,但我无法对解码函数进行逆向工程以从维基百科获得二进制等效函数.

    最后,我必须说,我目前对 Python 库不支持所有类型的压缩算法感到失望,因为它不仅是人们使用的工具,而且还是 Python 消费者从中学习的资源,因为大部分数据可用于进一步深入研究代码不容易获得或理解。

    编辑

    通过 wave.py 解码数据并写入 wav 文件后我已经成功地编写了一个新的原始线性 PCM 文件。这有效......即使我一开始持怀疑态度。

    编辑 2:::> 您可以在 compressions.py 上找到真正的解决方案

    关于Python u-Law (MULAW) 波解压到原始波信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085735/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com