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