下采样和上采样后的音频关闭
Audio shuttering after down and upsampling
我尝试再次上下采样我的麦克风音频(用于传输)。但是在这个过程之后音频有点破(快门)。有麦克风的可以自己试试:
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...具有相同的快门效果。
快门总是发生在块的边缘。您可以通过将示例中的块大小从 1024 更改为 4096 来听到这一点(它会发生得更少)。
但是为什么呢?任何人都可以解释这个以及如何解决?
感谢任何提示:)
我不是音频编程方面的专家。
当我得到奇怪的结果(有一般的编程问题)时,我尝试改变算法的参数并将其恢复到基础。
当你不缩减采样时会发生什么?
即使是最小的错误,音频也非常敏感。
如果缓冲区不够大或者(使用主线程)处理阻止播放声音怎么办。
除了在此线程上进行调制之外,您是否正在执行任何其他处理?
换一个 (HTML5) 浏览器怎么样?
目前我想不出任何其他解决方案或提示。
祝你好运,希望对你有所帮助。
请post解决方案,这对其他程序员也有帮助。
根据 OS 和您 运行 使用的机器,您可能需要增加 creatScriptProcessor 中指定的缓冲区大小。使用您的尺寸,我听到了伪影,但是当我将尺寸增加到 16384 时,我不再听到伪影。 (但现在我在听到任何声音之前有很长的延迟,正如大缓冲区大小所预期的那样)。
当 i = (data.length-1) 时,您将获得数据 [i+1] 的空值 - 因此上采样可能会将最后一个样本平均为零?
(这不是很好的下采样 - 因为它首先不限制带宽 - 但我希望你知道这一点。)
您的插值代码存在的问题是,您不知道下一个块的第一个样本,因此无法正确插值当前块的最后一个样本。
为了解决这个问题,您需要保存一个块中的最后一个样本,以计算下一个块的第一个插值样本。
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];
我尝试再次上下采样我的麦克风音频(用于传输)。但是在这个过程之后音频有点破(快门)。有麦克风的可以自己试试:
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...具有相同的快门效果。
快门总是发生在块的边缘。您可以通过将示例中的块大小从 1024 更改为 4096 来听到这一点(它会发生得更少)。
但是为什么呢?任何人都可以解释这个以及如何解决?
感谢任何提示:)
我不是音频编程方面的专家。
当我得到奇怪的结果(有一般的编程问题)时,我尝试改变算法的参数并将其恢复到基础。
当你不缩减采样时会发生什么?
即使是最小的错误,音频也非常敏感。 如果缓冲区不够大或者(使用主线程)处理阻止播放声音怎么办。
除了在此线程上进行调制之外,您是否正在执行任何其他处理? 换一个 (HTML5) 浏览器怎么样? 目前我想不出任何其他解决方案或提示。
祝你好运,希望对你有所帮助。 请post解决方案,这对其他程序员也有帮助。
根据 OS 和您 运行 使用的机器,您可能需要增加 creatScriptProcessor 中指定的缓冲区大小。使用您的尺寸,我听到了伪影,但是当我将尺寸增加到 16384 时,我不再听到伪影。 (但现在我在听到任何声音之前有很长的延迟,正如大缓冲区大小所预期的那样)。
当 i = (data.length-1) 时,您将获得数据 [i+1] 的空值 - 因此上采样可能会将最后一个样本平均为零?
(这不是很好的下采样 - 因为它首先不限制带宽 - 但我希望你知道这一点。)
您的插值代码存在的问题是,您不知道下一个块的第一个样本,因此无法正确插值当前块的最后一个样本。
为了解决这个问题,您需要保存一个块中的最后一个样本,以计算下一个块的第一个插值样本。
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];