Я реализую линейную интерполяцию аудиоданных в реальном времени, которые хранятся в чередующихся аудиобуферах. Аудио файлы могут быть одноканальными или многоканальными. В случае одноканальных аудиофайлов я интерполирую следующим образом:
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;
Теперь здесь появляется некоторый цифровой шум, и я не могу объяснить, почему. Есть ли другой / лучший способ применить линейную интерполяцию в реальном времени к чередующимся стерео файлам?