我正在试验WebAudio API,并试图建立一个分析器,用户可以与之交互,并最终打开和关闭音乐中的不同频率,以隔离轨道中的不同节拍,即贝斯,踢等等。
我正在使用画布可视化频率数据,并希望用户能够突出显示部分可视化,反过来静音频率。
默认情况下,可视化将如下所示,用户将听到所有频率。

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

我的想法是,我是否可以对frequencyData阵列进行反向工程,并实质上将相关频率静音?
**更新**
因此,我一直在尝试添加几个具有一种notch类型的biquadFilter,然后调整它们的频率和Q值。这确实有助于分离音乐的片断,但不完全是我想要的。这就是我目前使用的代码...
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);我不确定我的设置是否正确,但它确实允许我非常粗略地操纵频率,但感觉没有准确的科学方法来做到这一点。
是我正在尝试的可能性,如果是这样的话,任何建议都是非常感谢的:)
发布于 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一起工作。
<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的范围。
发布于 2018-01-23 06:57:05
您正在处理音频,所以您需要一个带通滤波器。这将允许您只播放特定的频率。
我看得出你已经在用FFT得到频率了。从那里开始,您有两个选择。一种是从进行FFT后获得的阵列中删除您想要的频率。然后,为了得到声音,你需要时域中的信号,所以你需要一个逆FFT。另一种选择是在时域中进行滤波,然后与原始信号进行卷积。
我没有发布代码,因为我是用C编写的,但我非常确定有很多库可以轻松地完成这些操作(卷积/IFFT)。
:)
https://stackoverflow.com/questions/48391402
复制相似问题