我想在javascript中对音频缓冲区进行下采样。我正在使用OfflineAudioContext,但输出音频质量明显差于原始音频(44100Hz)。是否有任何解决方案可以在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
}
答案 0 :(得分:1)
直接插值算法不足以实现合格/无损转换。线性插值几乎可以消除波形。这就像是在向下倾斜一个物体。你需要一个支持正弦/余弦曲线的重采样器 非线性插值但现在很难找到一个纯 js解决方案,除非有人实现强大的解决方案并分享。
尝试以您想要的频率捕获数据。重新采样它总是会降低质量(特别是在纯JavaScript代码中)
在XAudioJS中查看基于线性权重的插值重采样: https://stackoverflow.com/a/30032095/5896342