Javascript 需要将音频采样从8k提高到16k

Javascript 需要将音频采样从8k提高到16k,javascript,audio-streaming,web-audio-api,resampling,pcm,Javascript,Audio Streaming,Web Audio Api,Resampling,Pcm,我在录音时使用下面的代码对音频进行下采样 let inputSampleRate; let inputBuffer = []; function init(x) { inputSampleRate = x; } function process(inputFrame) { for (let i = 0; i < inputFrame.length; i++) { inputBuffer.push((inputFrame[i]) * 32767);

我在录音时使用下面的代码对音频进行下采样

let inputSampleRate; let inputBuffer = [];

function init(x) {
     inputSampleRate = x; 
}

function process(inputFrame) {
     for (let i = 0; i < inputFrame.length; i++) {
        inputBuffer.push((inputFrame[i]) * 32767);
     }

     const PV_SAMPLE_RATE = 16000;
     const PV_FRAME_LENGTH = 512;
 
     while ((inputBuffer.length * PV_SAMPLE_RATE / inputSampleRate) > PV_FRAME_LENGTH) {
        let outputFrame = new Int16Array(PV_FRAME_LENGTH);
        let sum = 0;
        let num = 0;
        let outputIndex = 0;
        let inputIndex = 0;

        while (outputIndex < PV_FRAME_LENGTH) {
            sum = 0;
            num = 0;
            while (inputIndex < Math.min(inputBuffer.length, (outputIndex + 1) * inputSampleRate / PV_SAMPLE_RATE)) {
                sum += inputBuffer[inputIndex];
                num++;
                inputIndex++;
            }
            outputFrame[outputIndex] = sum / num;
            outputIndex++;
        }

        postMessage(outputFrame);

        inputBuffer = inputBuffer.slice(inputIndex);
    } 
}
让输入采样;让inputBuffer=[];
函数init(x){
输入采样率=x;
}
函数进程(inputFrame){
for(设i=0;iPV_帧长度){
let outputFrame=新的INT16阵列(PV_帧长度);
设和=0;
设num=0;
设outputinex=0;
设inputIndex=0;
while(outputIndex

有谁能建议我如何编辑这个,以便可以使用它将我的音频从8k增加到16k?

传统的上采样(和下采样)方法可以在

如果你想要便宜又脏的东西,只需在样本之间线性插值即可。因此,如果有样本x0和x1,上采样值为y0=x0,y2=x1,新样本y1=(x0+x1)/2。这不是很好,你可能会听到人工制品

编辑:

在代码中,您可以尝试以下操作:

s0 = inputBuffer[inputIndex];
s1 = inputBuffer[inputIndex + 1];
outputFrame[outputIndex] = s0;
outputFrame[outputIndex + 1] = (s0 + s1)/2;
outputFrame[outputIndex + 2] = s1

您必须跟踪索引,这样就不会试图访问超出数组长度的内容。这是完全未经测试的。

上采样(和下采样)的传统方法可以在中找到

如果你想要便宜又脏的东西,只需在样本之间线性插值即可。因此,如果有样本x0和x1,上采样值为y0=x0,y2=x1,新样本y1=(x0+x1)/2。这不是很好,你可能会听到人工制品

编辑:

在代码中,您可以尝试以下操作:

s0 = inputBuffer[inputIndex];
s1 = inputBuffer[inputIndex + 1];
outputFrame[outputIndex] = s0;
outputFrame[outputIndex + 1] = (s0 + s1)/2;
outputFrame[outputIndex + 2] = s1

您必须跟踪索引,这样就不会试图访问超出数组长度的内容。这完全没有经过测试。

谢谢您的回复,先生。我明白你的意思,但你能建议我如何在我所附的代码中应用这些,计算部分需要做哪些更改。我想应该是这样的:我试着完成了我的代码,请看一看。函数init(x){inputSampleRate=x;}函数进程(inputFrame){for(let i=0;i