javascript - 下采样和上采样后的音频关闭

标签 javascript audio web-audio-api resampling

我尝试再次向下和向上采样我的麦克风音频(用于传输)。但在处理之后,音频有点损坏(快门声)。如果你有麦克风,你可以自己尝试一下:

fiddle : https://jsfiddle.net/q4yjfxqv/10/ (2016 年 7 月 21 日更新)

频率越高,您就越能听到快门声。

我通过仅删除数组的一半来降低采样

function newDownSample(data) {
  var retBuffer = [];
  for(var i=0;i<data.length;i++) {
    if(i%2==0)
    retBuffer.push(data[i])
  }
  return retBuffer;
};

和上采样(线性)

function newUpSample(data) {
  var retBuffer = [];
  for(var i=0;i<data.length;i++) {
    retBuffer.push(data[i])
    if(i<data.length-1)
      retBuffer.push((data[i]+data[i+1])/2);
    else
        retBuffer.push(data[i]);
  }
  return retBuffer;
};

我尝试了其他插值方法,如线性、三次和 lanczos 形式 here以及...具有相同的快门效果。

快门总是发生在 block 的边缘。您可以通过将示例中的 block 大小从 1024 更改为 4096 来听到这一点(这种情况会发生得更少)。

但是为什么呢?任何人都可以解释一下这个问题以及如何解决?

任何提示表示赞赏:)

最佳答案

插值代码的问题是,您不知道下一个 block 的第一个样本,因此无法正确插值当前 block 的最后一个样本。

要解决此问题,您需要保存一个 block 中的最后一个样本,以计算下一个 block 的第一个插值样本。

https://jsfiddle.net/hhb240ms/1/

usSample[0] = (lastSample + data[0]) / 2;
usSample[1] = data[0];
for(var i=1;i<512;i++) {
  usSample[2*i] = (data[i] + data[i-1]) / 2;
  usSample[2*i+1] = data[i]
}
lastSample = data[data.length-1];

关于javascript - 下采样和上采样后的音频关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426670/

相关文章:

javascript - 在 Facebook 墙上张贴; fb 错误 191 - 使用 facebook 连接插件

javascript - Primefaces 和 RemoteCommand : Best pratice to handle parameters from JavaScript

javascript - 尝试以编程方式粘贴

javascript - 动态 HTML 音频播放器

ios - 如何在我的应用程序中播放来自iOS/iPhone的内部声音文件?

javascript - 将变量传递给另一个函数

Linux 驱动程序 : how do I access PCI sound card ADC and DAC

javascript - 如何使用 Web Audio API 捕获扬声器的输出?

javascript - 波表合成 - WebAudioApi

javascript - 构造失败 'AudioContext' : number of hardware contexts reached maximum