首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Web audio API隔离音频上下文的频率

使用Web audio API隔离音频上下文的频率
EN

Stack Overflow用户
提问于 2018-01-23 06:37:49
回答 2查看 2.5K关注 0票数 11

我正在试验WebAudio API,并试图建立一个分析器,用户可以与之交互,并最终打开和关闭音乐中的不同频率,以隔离轨道中的不同节拍,即贝斯,踢等等。

我正在使用画布可视化频率数据,并希望用户能够突出显示部分可视化,反过来静音频率。

默认情况下,可视化将如下所示,用户将听到所有频率。

但是,当用户选择几个条时,灰显的条将使相关频率静音:

我的想法是,我是否可以对frequencyData阵列进行反向工程,并实质上将相关频率静音?

**更新**

因此,我一直在尝试添加几个具有一种notch类型的biquadFilter,然后调整它们的频率和Q值。这确实有助于分离音乐的片断,但不完全是我想要的。这就是我目前使用的代码...

代码语言:javascript
复制
const audioContext = new window.AudioContext();
const source = audioContext.createMediaElementSource(element);
const biquadFilter1 = audioContext.createBiquadFilter();
const biquadFilter2 = audioContext.createBiquadFilter();
const biquadFilter3 = audioContext.createBiquadFilter();
const analyser = audioContext.createAnalyser();

biquadFilter1.connect(analyser);
biquadFilter2.connect(analyser);
biquadFilter3.connect(analyser);
source
    .connect(biquadFilter1)
    .connect(biquadFilter2)
    .connect(biquadFilter3);
analyser.connect(audioContext.destination);

我不确定我的设置是否正确,但它确实允许我非常粗略地操纵频率,但感觉没有准确的科学方法来做到这一点。

是我正在尝试的可能性,如果是这样的话,任何建议都是非常感谢的:)

EN

回答 2

Stack Overflow用户

发布于 2018-01-31 02:43:40

您正在寻找的是一个带通滤波器。

带通滤波器(也称为带通滤波器,

)是一种在一定范围内传递频率,并拒绝(衰减)超出该范围的频率的设备。https://en.wikipedia.org/wiki/Band-pass_filter

我们很幸运,web audio api通过BiquadFilterNode.提供了它。

https://developer.mozilla.org/en-US/docs/Web/API/BiquadFilterNode

因此,基于所提供的演示代码,将400 at频率范围的带通滤波器应用于html音频播放器。

html音频元素必须由js创建,然后插入到DOM中,否则它将无法与web音频api一起工作。

代码语言:javascript
复制
 <div id="hello"></div>

 <script>
    var audioCtx = new (window.AudioContext || window.webkitAudioContext)();

    // Create new player 
    var a = document.createElement("audio");
    // Give a source song
    a.src = "vorbis.ogg";
    // Show the controls
    a.setAttribute("controls", "");
    // Append to the DOM
    hello.appendChild(a);

    // Player now ready for the web audio api
    var mediaElement = a;

    //set up the different audio nodes we will use for the app

    var gainNode = audioCtx.createGain();
    var biquadFilter = audioCtx.createBiquadFilter();

    // connect the nodes together

    source = audioCtx.createMediaElementSource(mediaElement);
    source.connect(biquadFilter);
    biquadFilter.connect(gainNode);
    gainNode.connect(audioCtx.destination);

    // Manipulate the Biquad filter

    biquadFilter.type = "bandpass";
    biquadFilter.frequency.value = 400;
    biquadFilter.gain.value = 25;
</script>

biquadFilter.frequency.value表示范围频率的中心。范围随着增益值的增加而扩展。

此过滤器可以像本例一样与其他一些GainNode链接在一起,请参见https://developer.mozilla.org/en-US/docs/Web/API/GainNode

以类似的方式,使用两个滤波器,一个低通和一个高通,用于1000 the到1500 the的范围。

票数 8
EN

Stack Overflow用户

发布于 2018-01-23 06:57:05

您正在处理音频,所以您需要一个带通滤波器。这将允许您只播放特定的频率。

我看得出你已经在用FFT得到频率了。从那里开始,您有两个选择。一种是从进行FFT后获得的阵列中删除您想要的频率。然后,为了得到声音,你需要时域中的信号,所以你需要一个逆FFT。另一种选择是在时域中进行滤波,然后与原始信号进行卷积。

我没有发布代码,因为我是用C编写的,但我非常确定有很多库可以轻松地完成这些操作(卷积/IFFT)。

:)

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

https://stackoverflow.com/questions/48391402

复制
相关文章

相似问题

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