Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 过滤网络音频_Javascript_Web Audio Api - Fatal编程技术网

Javascript 过滤网络音频

Javascript 过滤网络音频,javascript,web-audio-api,Javascript,Web Audio Api,我正在通过Tone.js的播放器播放mp3文件,我只需要播放该文件中的特定频率范围。此范围由用户动态选择,用户应该能够在不停止播放的情况下更改它。同时,Tone.js播放合成音符。目前,我正在使用带通/低通/高通滤波器,但据我所知,它们不会严格地将频率削减到选定范围之外,而是平滑地降低增益,如我在一些教程中发现的下图中的红线所示。以下是我的代码: function applyLimits([min,max]) { minFreq = min > max ? Number.NEGAT

我正在通过Tone.js的播放器播放mp3文件,我只需要播放该文件中的特定频率范围。此范围由用户动态选择,用户应该能够在不停止播放的情况下更改它。同时,Tone.js播放合成音符。目前,我正在使用带通/低通/高通滤波器,但据我所知,它们不会严格地将频率削减到选定范围之外,而是平滑地降低增益,如我在一些教程中发现的下图中的红线所示。以下是我的代码:

function applyLimits([min,max]) {
    minFreq = min > max ? Number.NEGATIVE_INFINITY : min;
    maxFreq = min > max ? Number.POSITIVE_INFINITY : max;
    if (mp3Player) {
        if (minFreq == Number.NEGATIVE_INFINITY && maxFreq == Number.POSITIVE_INFINITY) {
            if (mp3Filter) {
                mp3Filter.dispose();
                mp3Player.toMaster();
                mp3Filter = null;
            }
        }
        else {
            if (!mp3Filter) {
                mp3Player.disconnect();
                mp3Filter = new Tone.Filter();
                mp3Player.chain(mp3Filter, Tone.Master);
            }
            if (minFreq != Number.NEGATIVE_INFINITY && maxFreq != Number.POSITIVE_INFINITY) {
                let centerFrequency = Math.sqrt(maxFreq * minFreq);
                let q = centerFrequency / (maxFreq - minFreq);
                mp3Filter.set({frequency: centerFrequency, Q: q, type: 'bandpass', rolloff: -96});
            }
            else if (minFreq != Number.NEGATIVE_INFINITY) {
                mp3Filter.set({frequency: minFreq, Q: 1, type: 'highpass', rolloff: -96});
            }
            else {
                mp3Filter.set({frequency: maxFreq, Q: 1, type: 'lowpass', rolloff: -96});
            }
        }
    }
}
我需要的是绿线。查看Tone.js源代码,我可以看到Tone.js使用了级联的biquadfilter。但即使使用10个级联滤波器,也会产生一条曲线,而不是精确的切割。此外,根据该图,该范围内的频率也受到影响


如何使用Tone.js、Web Audio API或任何其他js库实现这种效果

绿线,如果它是真正垂直的,在物理上是无法实现的。你能做的最好的事情就是(小心地)将一堆双四边形级联在一起,以产生一个近似值。或者使用IIRFilterNode(如果可用)进行过滤