Понижение частоты звука в javascript

Я хочу уменьшить звуковой буфер в javascript. Я использую OfflineAudioContext, но качество выходного звука значительно хуже исходного (44100 Гц). Есть ли какое-либо решение для более качественной передискретизации звука в javascript, чем это:

var sampleRate = 44100;
var outSampleRate = 16000;
var durationInSamples = audioBuffer441k.length;
var o = new OfflineAudioContext(1, durationInSamples*outSampleRate/sampleRate, outSampleRate);
var b = o.createBuffer(1, durationInSamples, sampleRate);

var buf = b.getChannelData(0);
for (var i = 0; i < durationInSamples; i++) {
   buf[i] = audioBuffer441k[i];
}

var source = o.createBufferSource();
source.buffer = b;
source.connect(o.destination);
source.start(0);
o.startRendering();
o.oncomplete = function(audiobuffer16k) {
  console.log("done resampling!!");
  console.log(audiobuffer16k.renderedBuffer);
  //do something with resampled audio
}

person bear    schedule 05.11.2017    source источник
comment
Вы видели эту функцию понижающей дискретизации JS?   -  person Octavian Naicu    schedule 13.07.2018


Ответы (1)


Алгоритмов прямой интерполяции недостаточно для достижения квалифицированных/без потерь преобразований. Линейная интерполяция почти убивает сигнал. Это как принижение объекта. Вам нужен ресемплер, поддерживающий синусоидальную/косинусную кривую нелинейной интерполяции, но сейчас очень сложно найти для него чистое js-решение, если только кто-нибудь не реализует надежное решение и не поделится им.

Попробуйте захватить ваши данные с желаемой частотой. Передискретизация всегда снижает качество (особенно в чистом коде javascript)

взгляните на передискретизацию интерполяции на основе линейного веса в XAudioJS: >

person Deniz aydın    schedule 13.11.2017