Как уже упоминалось, линейная интерполяция не дает лучшего качества звука, но это просто и дешево.
Для каждого нового образца, который вы создаете, просто сравните его со следующим, например.
short[] source = ...;
short[] result = new short[source.length * 2];
for(int i = 0; i < source.length; ++i) {
result[i * 2] = source[i];
result[i * 2 + 1] = (source[i] + source[i + 1])/2;
}
Вам обязательно нужно найти библиотеку, которая поможет вам работать с файлами WAV. Несмотря на то, что это простой формат, вам не нужно делать это самостоятельно, если есть доступный код, который будет делать то, что вам нужно. Кстати, почему вы это делаете в первую очередь? Возможно, вы могли бы просто использовать sox или аналогичный инструмент для этого.
Хорошо, я с помощью линейной интерполяции и расчеты кажутся правильными, но все, что я получаю некоторые статические, как шум. Я интерполирую между каждыми двумя байтами, добавляя новый байт между ними ... но я думаю, что это моя ошибка. Поскольку pcm равно 16 бит, это означает, что на выборку приходится 16 бит, поэтому, возможно, я должен интерполировать между каждыми двумя образцами (куски 16 бит). Это правильно, или я понял, что вся идея не так? –
Если вы покажете свой код, я могу взглянуть на него и посмотреть, что-то не так (просто часть интерполяции). – Phonon
@gosho: Да, конечно, вы должны интерполировать между парами * samples *, а не парами * байтов *. Отдельные байты не имеют никакого значения. –