【发布时间】:2018-07-10 16:25:09
【问题描述】:
我正在实现一个音频通道混合器并使用Viktor T. Toth's algorithm。试图混合两个音频通道流。
在代码中,quantization_ 是通道位深度的字节表示。我的mix 函数采用指向目标和源 uint8_t 缓冲区的指针,混合两个通道并写入目标缓冲区。因为我在 uint8_t 缓冲区中获取数据,执行加法、除法和乘法运算以获取实际的 8、16 或 24 位样本并将它们再次转换为 8 位。
通常,它会给出预期的输出样本值。但是,有些样本的值接近 0,因为当我在 Audacity 中查看输出时它们不应该是这样。在屏幕截图中,底部 2 个信号是两个单声道,顶部是混合通道。可以看出有一些非常低的值,尤其是中间。
下面是我的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;
}
}
}
【问题讨论】: