0

I want to downsample an audio buffer in javascript. I am using OfflineAudioContext, but the output audio quality is significantly worse than the original audio (at 44100Hz). Is there any solution for higher quality audio resampling in javascript than this:

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
}
bear
  • 663
  • 1
  • 14
  • 33
  • Have you seen [this JS downsampling function](https://stackoverflow.com/a/26245260/813988) ? – octavn Jul 13 '18 at 08:51

1 Answers1

1

Direct interpolation algorithms are not enough to achieve qualified/lossless conversions. Linear interpolation is nearly killing the waveform. It's like downcasting an object. You need a resampler supporting sine/cosine curving nonlinear interpolation but it's now so difficult to find a pure js solution for it unless anyone implement o strong solution and share.

Try to capture your data at the frequency you desire. Resampling it always reduces the quality (especially in pure javascript code)

take a look at for linear-weight based interpolation resampling in XAudioJS: https://stackoverflow.com/a/30032095/5896342

Deniz aydın
  • 91
  • 1
  • 4