【问题标题】:Converting 16 bit audio sample to char将 16 位音频样本转换为字符
【发布时间】:2017-08-21 16:27:12
【问题描述】:

我正在使用矩阵创建板,我正在尝试为他们的麦克风数组 C++ 代码制作一个 python 包装器。

该库有一个读取函数,它返回一个包含 128 个样本的 uint16_t 数组。

我正在尝试将其与 ALSA readi 函数进行比较,该函数将缓冲区写入用户作为参数传递给函数的 char 数组。

问题是,当单个char 仅 8 位宽时,ALSA 如何将 16 位样本写入 char 数组? 我怎么能对 uint16_t 数组做同样的事情并将它传递给 python,所以我会得到与 ALSA readi 函数相同的结果?

【问题讨论】:

  • 您的 16 位样本数据是 16 位字的序列。 char 的数组是一个 8 位字的序列。 128 个 16 位字的数组等于 256 个 8 位字的数组。没有进行“转换”,只是从一个数组复制到另一个数组。
  • 你可以使用memcpy
  • 我使用了 memcpy 但现在的问题是当我将 char 数组返回给 python 并将其从 char 指针转换为字符串时,长度会发生变化,所以现在有时字符串的长度小于 256 个字符并且它在 0 到 70 之间跳跃

标签: python c++ casting alsa


【解决方案1】:

一个 uint16 可以作为 2 个字节(uint8)传递,c++ 代码可能使用联合,以便将数据保存为 uint16,而 USB 代码可以将数据作为字节传递。

至于python代码,这是我用来将8位字节转换为uint16的函数

def convert_int8_int16(self, byte_array):
    new_array = [0]*(len(byte_array)/2)
    for i in range(len(byte_array)/2):
        new_array[i] = byte_array.pop(0)*256 + byte_array.pop(0)

    return new_array

这将遍历字节数组并将值添加到新的 uint16 数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多