У меня есть необходимость конвертировать образцы аудио от 11025 и 22050 до 44100; Я ищу самую быструю и удобную процедуру преобразования звука. Я требую, чтобы ответ был дан в чистой Java, без необходимости внешних подпрограмм или библиотек. Источник представляет собой массив коротких значений, представляющих левый и правый каналы, чередующиеся таким образом. LRLRLRLR
Я слышал, что гауссовое преобразование является лучшим, но это убийца cpu.
Update
Чтобы добавить больше деталей, я хотел бы сочетание между лучшим и быстрым. Ответ даст отличный звук, подходящий для общения в режиме реального времени.
Update 2
Я ищу несколько коротких примеров кода для этого, должны быть Э.З. точки для вас аудио гуруСамая быстрая и эффективная процедура повышения частоты дискретизации для аудио в Java
ответ
вы можете (в конечном счете) просто использовать ель после заполнения каждый другой образец с 0s - вы повышаете выборку на 2 или 4. Это будет очень быстро для реального времени. качество звука будет удовлетворительным для большинства приложений.
Я не уверен, но заполнение каждого другого образца нулем, вероятно, звучит * очень странно * ... Вероятно, он должен дублировать значения. – Frank
Даже после применения фильтра FIR (http://en.wikipedia.org/wiki/Finite_impulse_response) во встроенные нули, не будет ли это звучать странно? –
@Frank и Roland Illing вы можете не понимать, что дублирование образцов (при условии, что сигнал, воссозданный целым числом, который был заполнен нулями), может быть достигнут совершенно с помощью очень простой fir: все значения = 1, длина = сумма upsampling (2 или 4 в этом случае). на практике лучше использовать более длинную оконную функцию (например, sinc или Hamming). фильтр заполняет промежутки и служит в качестве интерполятора. какая функция «лучше» зависит от сигнала и характеристик, которые вы хотите (или не хотите). – justin
Ну, это трудно ресэмплировать это достаточно медленно, так что это не realtime :-) Один из лучших & еще быстрых решений заключается в том, чтобы делать FFT, а затем делать обратный FFT с любой частотой выборки, в которой вы нуждаетесь.
Вы можете реализовать это самостоятельно или скопировать & вставить любую реализацию FFT.
Это может работать как 100x реальное время или быстрее, не уверено, что вам нужно 1000x быстрее (в этом случае вы можете пойти на линейный или бикубический) :-)
Я думаю, что мне нужна эта формула, но я не математик. Любые математики-гики там чувствуют, что комментируют? http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter07/genDists.html –
Вам нужно будет сделать выбор между самым быстрым или лучшим. Решение * fastest * было бы похоже на просто дублирование сэмплов, в то время как для * наилучшего * вы можете представить * любой * объем вычислений, возможно даже AI, который понимает, что слышал и знает, как это должно звучать :) Вы не можете требовать как в то же время. Разумное ограничение (например, подходящее для реального времени), вероятно, даст вам больше ответов. Если вы настроены на определенный алгоритм, измените название вопроса, чтобы это отразить. – Durandal