Применить гребенчатый фильтр к WAV-файлу (Javascript) - PullRequest
0 голосов
/ 14 марта 2020

Я хочу применить эффект гребенчатого фильтра к существующему файлу wav. Вот код, который у меня есть:

public combFilter = async (delay, decay, filepath, wavDest) => {
        const arraybuffer = fs.readFileSync(wavFile, null).buffer
        const array = new Uint8Array(arraybuffer)
        const header = array.slice(0, 44)
        const samples = array.slice(44)
        const {sampleRate} = this.getWavInfo(header)
        const delayedSamples = Math.floor(delay * (sampleRate/1000))
        const combSamples = samples.slice()
        for (let i = 0; i < samples.length - delayedSamples; i++) {
            combSamples[i + delayedSamples] += combSamples[i] * decay
        }
        const combArray = [...header, ...combSamples]
        fs.writeFileSync(wavDest, Buffer.from(new Uint8Array(combArray)))
        return wavDest
}

Я ничего не знаю о dsp, но, насколько я понимаю, вы создаете копию аудиосэмплов и задерживаете их на определенную величину. Однако конечным результатом является крайне искаженная и обрезанная версия исходного файла, где значение задержки равно 70, затуханию равно 0.5, а sampleRate равно 44100. Другой метод, используемый здесь, прекрасно работает, но здесь он для справки.

public getWavInfo = (header) => {
        function int32ToDec(bin) {
            const binArr = bin.split("-")
            let binDigits = ""
            for (let i = 0; i < binArr.length; i++) {
                binDigits += ("00000000"+Number(binArr[i]).toString(2)).slice(-8)
            }
            const num = parseInt(binDigits, 2)
            return num
        }
        let littleEndian = false
        let bitDepth = 0
        let sampleRate = 0
        let channels = 0
        let topCode = ""
        for (let i = 0; i < 4; i++) {
            topCode += String.fromCharCode(header[i])
        }
        if (topCode === "RIFF") {
            littleEndian = true
        }
        if (littleEndian) {
            bitDepth = Number(`${header[35]}${header[34]}`)
            sampleRate = Number(int32ToDec(`${(header[27])}-${(header[26])}-${(header[25])}-${(header[24])}`))
            channels = Number(`${header[23]}${header[22]}`)
        } else {
            bitDepth = Number(`${header[34]}${header[35]}`)
            sampleRate = Number(int32ToDec(`${header[24]}-${(header[25])}-${(header[26])}-${(header[27])}`))
            channels = Number(`${header[22]}${header[23]}`)
        }
        const byteDepth = (bitDepth) / 8
        return {byteDepth, bitDepth, sampleRate, channels}
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...