c++ - 混合音频 channel

标签 c++ algorithm audio

我正在实现一个音频 channel 混合器并使用 Viktor T. Toth's algorithm .尝试混合两个音频 channel 流。

在代码中,quantization_是 channel 比特深度的字节表示。我的 mix 函数采用指向目标和源 uint8_t 缓冲区的指针,混合两个 channel 并写入目标缓冲区。因为我在 uint8_t 缓冲区中获取数据,执行加法、除法和乘法运算以获得实际的 8、16 或 24 位样本并将它们再次转换为 8 位。

一般来说,它给出了预期的输出样本值。然而,当我查看 Audacity 中的输出时,一些样本的值接近于 0,因为它们不应该是这样的。 .在屏幕截图中,底部的 2 个信号是两个单声道,顶部的一个是混合 channel 。可以看到有一些很低的值,尤其是在中间。

Mixed Channels

下面是我的mix函数;

void audio_mixer::mix(uint8_t* dest, const uint8_t* source)
{
    uint64_t mixed_sample = 0;
    uint64_t dest_sample = 0;
    uint64_t source_sample = 0;
    uint64_t factor = 0;

    for (int i = 0; i < channel_size_; ++i)
    {
        dest_sample = 0;
        source_sample = 0;
        factor = 1;

        for (int j = 0; j < quantization_; ++j)
        {
            dest_sample += factor * static_cast<uint64_t>(*dest++);
            source_sample += factor * static_cast<uint64_t>(*source++);
            factor = factor * 256;
        }

        mixed_sample = (dest_sample + source_sample) - (dest_sample * source_sample / factor);

        dest -= quantization_;

        for (int k = 0; k < quantization_; ++k)
        {
            *dest++ = static_cast<uint8_t>(mixed_sample % 256);
            mixed_sample = mixed_sample / 256;
        }
    }
}

最佳答案

您似乎没有正确处理签名的音频样本。水平线应为音频信号的零电压。

如果您查看正电压音频样本,它们会正确地遵循您的等式(除了中心的峰值)。负值被压缩,这让我觉得它们被视为小的正电压而不是负电压。

换句话说,也许那些无符号整数应该是有符号整数,这样最高位表示电压极性,您可以在 +127 到 -128 范围内获得音频样本。

中心的那些峰值看起来像是环绕模 255,这将是音频无符号字节表示的峰值。我不确定这会如何发生,但它似乎与无符号信号和有符号信号有关。

也许你应该试试 Viktor 在他的文档中提供的其他公式:

Z = 2(A+B) - (AB/128) - 256

关于c++ - 混合音频 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48544216/

相关文章:

php - 在页面拆分输出中合并来自不同表的搜索结果

java - N-Puzzle 伪随机洗牌?

matlab - 如何通过for循环在Matlab中读取许多声音文件?

c++ - "right"将python脚本添加到非python应用程序的方法

c++ - 如何检查 vector 中是否存在单词

相当于 JMX 的 C++?

algorithm - GJK 中的碰撞点

windows - 在 Windows 7 上通过 cygwin/node.js 创建音频 Sprite 需要一些帮助

ubuntu - "Stereo Mix"类似 Ubuntu 的功能

python - 取得引用的 Eigen3 矩阵的所有权