(Полагаю, * * * * * * * * * * * * * * * * * * * * * * * * * * * - - ответила Филу. Я просто отправляю это, чтобы добавить свои два цента о повторной выборке.)
Краткий ответ: Создайте AudioInputStream
, который либо отбрасывает сэмплы, либо добавляет ноль сэмплов.В качестве длины вы можете установить AudioSystem.NOT_SPECIFIED
.
Длинный ответ: Если вы добавляете ноль выборок, вы можете интерполировать , но не линейно.Причиной интерполяции для повышения частоты дискретизации является aliasing , которого вы можете избежать.Вы делаете это, применяя фильтр нижних частот .Причина этого проста.Теорема Найквиста-Шеннона гласит, что когда сигнал дискретизируется с X Hz
, вы можете однозначно представлять частоты только до X/2 Hz
.Когда вы повышаете частоту, вы увеличиваете частоту сэмплирования, поэтому теоретически вы можете представить больший частотный диапазон.Действительно, просто добавляя нули, вы видите некоторую энергию в этих дополнительных частотных диапазонах, которых не должно быть, потому что у вас нет информации об этом.Таким образом, вам нужно «отрезать их», используя фильтр низких частот.Подробнее о повышении частоты дискретизации можно найти в Википедии .
Короче говоря, есть правильный способ сделать это.Кажется, с искажениями у вас все в порядке, поэтому правильное выполнение может быть необязательным, но это пустая трата времени.
Бесстыдная вилка: если вы все же хотите это сделать несколько правильнее , вы можете найти Resample класс jipes полезным.Это не универсальный ресэмплер, т. Е. Он поддерживает только ограниченное количество факторов, таких как 2
, 4
, ..., но может оказаться полезным для вас.
import com.tagtraum.jipes.math.MultirateFilters.Resampler;
[...]
float[] original = ... ; // original signal as float
Resampler downsampler2 = new MultirateFilters.Resampler(1, 2);
float[] downsampled = downsampler2.map(original);
Resampler upsampler2 = new MultirateFilters.Resampler(2, 1);
float[] upsampled = upsampler2.map(original);
Если вы хотите модификация шкалы времени (TSM) , т. е. для изменения темпа без изменения частот вы можете использовать Rubberband для Java .