交错式立体线性插值

时间:2014-11-05 20:09:07

标签: audio interpolation linear

我正在实现音频数据的实时线性插值,它存储在交错的音频缓冲区中。音频文件可以是单通道或多通道。在单通道音频文件的情况下,我插入如下:

f_dex = offset + ((position / oldlength) * (newlength * b_channelcount));
i_dex = trunc(f_dex); // get truncated index
fraction = f_dex - i_dex; // calculate fraction value for interpolation
b_read = (b_sample[i_dex] + fraction * (b_sample[i_dex + b_channelcount] - b_sample[i_dex]));
outsample_left += b_read;
outsample_right += b_read;

这听起来很棒,我没有任何问题。但是,当我想读取多声道文件时,我必须更正计算的读取位置,以确保它位于相应帧中的第一个样本上,例如:

f_dex = offset + ((position / oldlength) * (newlength * b_channelcount));
if ((long)trunc(f_dex) % 2) {
    f_dex -= 1.0;
}
i_dex = trunc(f_dex); // get truncated index
fraction = f_dex - i_dex; // calculate fraction value for interpolation
outsample_left += (b_sample[i_dex] + fraction * (b_sample[i_dex + b_channelcount] - b_sample[i_dex])) * w_read;
outsample_right += (b_sample[i_dex + 1] + fraction * (b_sample[(i_dex + 1) + b_channelcount] - b_sample[i_dex + 1])) * w_read;

现在这引入了一些数字噪音,我无法解释原因。有没有其他/更好的方法将实时线性插值应用于交错的立体声文件?

1 个答案:

答案 0 :(得分:0)

我对您的变量名称感到有些困惑,positionoldlengthoutsample_left/outsample_right似乎是输出,而newlengthoffset是来自输入b_sample

我认为您的问题包括b_channelcount计算f_dex。尝试改为

f_dex = offset + ((position / oldlength) * newlength);

您可以省略% 2检查和调整。这种调整并不符合你的意图。

附录11/7: 我错过了一些内容,您还需要调整i_dex的使用情况,因为我在这里设置了f_dex它将每个频道的整个块计为1.在此之前b_sample[i_dex]而是使用b_sample[i_dex*b_channelcount];这将使您进入块的第一个样本(如果是立体声,则为左侧)。同样地,如果有一个b_sample[i_dex*b_channelcount + 1],则可以使用b_sample[(i_dex+1)*b_channelcount]作为下一个插值块的第一个样本{{1}},等等。