Обратите внимание, что Speex — это кодек с потерями. Таким образом, по определению он не может дать такой же результат, как закодированный буфер. Кроме того, он разработан как кодек для голоса. Таким образом, диапазон 1-2 кГц будет наиболее эффективным, так как он рассчитан на определенную форму сигнала. В чем-то ее можно сравнить с технологией JPEG для растровых изображений.
Я немного изменил ваш пример jsfiddle, чтобы вы могли поиграть с разными параметрами и сравнить результаты. Просто предоставить простую синусоиду с неизвестной частотой — неправильный способ проверки кодека. Однако в примере видно разное влияние на исходный сигнал на разных частотах.
buffer1.push(Math.sin(2*Math.PI*i*frequency/sampleRate));
Я думаю, вам следует построить пример с записанным голосом и сравнить результаты в этом случае. Это было бы правильнее.
В общем, чтобы понять идею в деталях, вам нужно изучить цифровую обработку сигналов. Я даже не могу дать правильную ссылку, так как это целая наука, и она математически интенсивна. (единственная известная мне подходящая книга для чтения находится на русском). Если кто-нибудь здесь с сильным математическим образованием может поделиться подходящей литературой для этого случая, я был бы признателен.
РЕДАКТИРОВАТЬ: как упоминал Курои Неко, есть проблема с границами буфера. И кажется, что невозможно сохранить состояние декодера, как указано в этом post, потому что библиотека в использование не поддерживает его. Если вы посмотрите на исходный код, вы увидите, что они используют сторонний кодек speex и не предоставляют полный доступ к его функциям. Я думаю, что лучшим подходом было бы найти достойную библиотеку для speex, поддерживающую восстановление состояния, аналогичную этой а>
person
Kirill Slatin
schedule
05.03.2015
verg, а не сdecV, оба имеют одинаковое искажение после кодирования-декодирования, хотя в середине объединенного звука есть заметный разрыв. Вы также не зацикливаете все свои массивы должным образом, но я не верю, что исправление этого остановит прерывание звука посередине. - person Paul S.   schedule 05.03.2015