Web音频频率限制?

4
我的目标是产生一定频率的音频,然后使用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)时,高频区域似乎不再有任何响应。
Web Audio有频率限制吗?还是我的设备有限制?
当我从getByteFrequencyData获取元素时,每个元素的单位是什么?

3
大多数消费级麦克风和扬声器的频率响应通常在15 kHz及以上开始下降。 - Paul R
4个回答

3

Web Audio是否有频率上限?还是我的设备有限制?

我认为WebAudio框架本身并没有这个限制。就像其他答案在这里提到的一样。限制可能来自麦克风和扬声器的物理限制。

我试图使用我当前的书架音箱(Kurzweil KS40A)以及一个不错的麦克风(Zoom H4)。麦克风距离高音喇叭约1厘米。

Analyzer data at 5kHz Analyzer data at 15kHz Analyzer data at 17kHz Analyzer data at 19kHz

正如你所看到的,这些扬声器和麦克风无法有效地产生/捕获这些频率的声音。

当你查看Zoom H4的频率响应时,这更加明显。不幸的是,我找不到KS40a的频率响应。

您还可以使用非浏览器工具执行类似的操作,以查看是否会出现类似结果。

当我从getByteFrequencyData获得每个元素时,每个元素的单位是什么?

从getByteFrequencyData获得的每个元素的单位是FFT的标准化幅度数据,缩放以适合AnalyserNode上的maxDeciblesminDecibles属性的dBFS范围。因此,字节值0将表示minDecibles(默认值为-100dBFS)或更低,而字节值255将表示maxDecibles(默认值为-30dBFS)或更高。


我尝试使用Audacity和在17000Hz的频率下进行测试,因为扬声器可以产生这个频率,我也能听到它,但FFT结果仍然接近于0。所以是否有可能放大某个频率的音频,使分析仪中的数据更大? - Ovilia
是的。可能是麦克风无法捕捉到17000赫兹的声音。放大肯定会有所帮助。即使是我们的耳朵,在更高的响度水平下,也能更好地听到更极端(低或高)的频率。参见Fletcher-Munson曲线:http://en.wikipedia.org/wiki/Fletcher%E2%80%93Munson_curves - notthetup

2

查找奈奎斯特频率的概念 - 网络音频的默认采样率为44.1kHz - 这意味着在您的计算机内部使用完美的硬件,如麦克风和模拟数字转换器,理论上最大的频率将是22050赫兹。在同一台计算机上,@Ovilia使用相同的麦克风记录相同的输入声音,然后使用类似Audacity的实用程序检查音频文件,您可以在其中查看其FFT分析的输出 - 在Audacity中,当您打开音频文件时,转到菜单分析 -> 绘制频谱...还可以通过单击波形视图子窗口左侧附近的下箭头并选择频谱图来查看非常好的FFT视图 - 另一个出色的FFT能力音频工具称为Sonic Visualizer - 您现在是否看到了在网络音频中未能看到的频率处的功率?


是的 - 但从理论上讲,这仍然允许在15-20 kHz范围内的频率,这就是OP遇到问题的地方。更可能是由于超声波换能器在较高频率下的限制所致。 - Paul R
我认为这很不可能,如果是这种情况,采样率将会是30KHz,以重现@Ovilia的问题限制... - ederwander
1
針對無限長度信號和無限長FFT,取樣率的一半是Nyquist頻率才有效;或者正好符合相位要求。對於較短的FFT,任意未知相位輸入的最大頻率低於Fs / 2。 - hotpaw2
Web Audio 使用硬件的采样率 - 通常是44.1kHz,但并非总是如此。 - cwilso
我尝试分析来自Audacity的FFT结果,发现当频率大于15000Hz时,其数值甚至比Web Audio生成的还要弱。这是否意味着使用如此高的频率发送消息是不可行的? - Ovilia

1

我认为大多数麦克风的有效频率范围是声音范围频率,约为80 Hz至1100 Hz

因此,您可能会遇到硬件限制问题,请尝试查看制造商或手册中设备的频率输入响应!


你正在查看语音 - 消费级麦克风和扬声器的频率响应通常在50 Hz至15 kHz左右,这对于中等保真度的语音和音乐已经足够了。 - Paul R
谢谢@PaulR,很有道理 :-) - ederwander

1

可能会有一种抗锯齿低通滤波器(位于麦克风和ADC之间),其截止频率低于Fs/2,以确保所有频率都在该频率以下(考虑到有限的滤波器过渡带宽)。

房间的声学效应也可能存在空洞。在高于2KHz的频率下,麦克风放置位置可能只有几英寸距离就可以到达峰值或空洞位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接