首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤网页音频

问过滤网页音频
EN

Stack Overflow用户
提问于 2016-04-16 18:03:46
回答 1查看 360关注 0票数 2

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

代码语言:javascript
复制
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使用了级联双四级过滤器。但是,即使使用10个级联滤波器也会导致曲线,而不是精确的切割。此外,根据此图,该范围内的频率也会受到影响。

​

​

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

EN

回答 1

Stack Overflow用户

发布于 2016-04-17 07:09:19

绿线,如果它真的是垂直的,在物理上是不可能实现的。您可以做的最好的是将一堆双四元组(小心地)级联在一起以生成近似值。或者使用IIRFilterNode (如果可用)进行过滤。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36662709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档