我的目标是以特定频率生成音频,然后使用FFT结果检查它的频率。
function speak() {
gb.src = gb.ctx.createOscillator();
gb.src.connect(gb.ctx.destination);
gb.src.start(gb.ctx.currentTime);
gb.src.frequency.value = 1000;
}
function listen() {
navigator.getUserMedia = (navigator.getUserMedia
|| navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
navigator.getUserMedia({
audio : true,
video : false
}, function(stream) {
gb.stream = stream;
var input = gb.ctx.createMediaStreamSource(stream);
gb.analyser = gb.ctx.createAnalyser();
gb.analyser.fftSize = gb.FFT_SIZE;
input.connect(gb.analyser);
gb.freqs = new Uint8Array(gb.analyser.frequencyBinCount);
setInterval(detect, gb.BIT_RATE / 2);
}, function(err) {
console.log('The following gUM error occured: ' + err);
});
}
请参阅http://codepen.io/Ovilia/full/hFtrA/的工作示例。您可能需要将麦克风放在扬声器附近才能看到效果。
问题是,当频率大于15000(例如16000)时,似乎在高频区域不再有任何响应。
网络音频的频率是否有限制,还是我的设备限制?
getByteFrequencyData
来自每个元素的单位是什么?
答案 0 :(得分:3)
我认为WebAudio框架本身并不限制这一点。就像这里提到的其他答案一样。限制可能来自麦克风和扬声器的物理极限。
我试着使用我目前的书架式扬声器(Kurzweil KS40A)和一个不错的麦克风(Zoom H4)。麦克风离高音扬声器大约1厘米。
如您所见,这些扬声器和麦克风无法在这些频率上有效地生成/捕捉声音。
当您查看Zoom H4's frequency response时,这一点会更加明显。不幸的是,我找不到KS40a的频率设置。
您还可以使用非浏览器工具执行类似操作,以检查是否看到类似的结果。
来自getByteFrequencyData的每个元素的单位是来自FFT的归一化幅度数据,其被缩放以适合maxDecibles
上的minDecibles
和AnalyserNode
属性的dBFS范围。因此字节值0表示minDecibles
(默认值为-100dBFS)或更低,字节值255表示maxDecibles
(默认值为-30dBFS)或更高。
答案 1 :(得分:2)
查找奈奎斯特频率的概念 - 网络音频的默认采样率为44.1kHz - 这意味着在计算机内部提供完美的硬件(如麦克风和模数转换器),理论最大频率将为22050赫兹。 @Ovilia在同一台计算机上使用相同的麦克风录制相同的输入声音然后使用像Audacity这样的实用程序检查音频文件,您可以在其中查看其FFT分析的输出 - 在Audacity中打开音频文件时转到菜单分析 - &gt ; Plot Spectrum ...也可以看到一个非常好的FFT视图点击波形视图子窗口左侧附近的向下箭头并选择Spectrogram - 另一个优秀的FFT功能音频工具叫做Sonic Visualizer - 你现在看到的功率是你看不到的频率吗?在网络音频中使用FFT?
答案 2 :(得分:1)
我认为大多数麦克风在语音范围频率上运行良好,80 Hz to 1100 Hz
因此,您可能遇到硬件限制问题,请尝试与制造商联系或手动查看设备的频率输入响应!
答案 3 :(得分:1)
可能有一个抗混叠低通滤波器(在麦克风和ADC之间),其截止频率低于Fs / 2,以确保一切都被该频率下降(给定有限的滤波器过渡宽度) )。
房间的声学效果可能还有空值。在频率高于2 Khz时,麦克风放置的峰值位置可能只有几英寸。