【问题标题】:Web Audio frequency limitation?网络音频频率限制?
【发布时间】:2014-11-02 08:50:22
【问题描述】:

我的目标是生成某个频率的音频,然后使用 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得到的每个元素的单位是什么?

【问题讨论】:

  • 大多数消费级麦克风和扬声器的频率响应通常在 15 kHz 及以上时开始下降。

标签: javascript html audio fft web-audio-api


【解决方案1】:

网络音频有频率限制,还是我的设备有限制?

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

我尝试使用我现有的书架式扬声器 (Kurzweil KS40A) 和一个不错的麦克风 (Zoom H4)。麦克风距离高音扬声器约 1 厘米。

如您所见,使用这些扬声器和麦克风无法有效地生成/捕获这些频率的声音。

当您查看Zoom H4's frequency response 时,这一点会更加明显。不幸的是,我找不到 KS40a 的频率响应。

你也可以使用非浏览器工具做类似的事情来检查你是否看到类似的结果。

getByteFrequencyData 获取时每个元素的单位是什么?

getByteFrequencyData 中每个元素的单位是来自 FFT 的归一化幅度数据,经过缩放以适应 AnalyserNodemaxDeciblesminDecibles 属性的 dBFS 范围。因此,字节值 0 表示 minDecibles(默认为 -100dBFS)或更低,字节值 255 表示maxDecibles(默认为 -30dBFS)或更高。

【讨论】:

  • 我尝试了 Audacity 和 17000Hz 的频率,因为我可以听到它,扬声器能够产生它,但 FFT 结果仍然接近 0。那么是否可以将音频放大到一定的频率使分析仪的数据更大?
  • 是的。所以可能是麦克风无法拾取17000Hz。放大肯定会有所帮助。即使是我们的耳朵,在更高的响度水平下,更极端(低或高)的频率也会更好。 en.wikipedia.org/wiki/Fletcher%E2%80%93Munson_curves
【解决方案2】:

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

【讨论】:

  • True - 但理论上这仍然允许 15 - 20 kHz 范围内的频率,这是 OP 遇到问题的地方。这更有可能是由于换能器在较高频率下的限制。
  • 我认为不太可能,如果是这种情况,那么采样率将是 30 Khz 以重现 @Ovilia 问题的限制......
  • 采样率一半的奈奎斯特频率仅对无限长的信号和无限长的 FFT 有效,或者仅对正确的相位有效。对于较短的 FFT,任意未知相位输入的最大频率低于 Fs/2。
  • 网络音频使用硬件的采样率——通常是 44.1kHz,但并非总是如此。
  • 我尝试从 Audacity 分析 FFT 结果,当频率大于 15000Hz 时的值甚至比从 Web Audio 生成的要弱。这是否意味着使用如此高的频率发送消息是不可行的?
【解决方案3】:

我认为大多数麦克风在音域频率范围内工作得很好,大约在80 Hz to 1100 Hz 左右

那么您可能有硬件限制问题,请尝试与制造商联系或手动检查设备的频率输入响应!

【讨论】:

  • 您正在查看语音 - 消费级麦克风和扬声器的频率响应通常为 50 Hz - 15 kHz 的数量级,这对于中等保真度的语音和音乐来说已经足够了。
  • Thaks @PaulR 有意义 :-)
【解决方案4】:

可能有一个抗混叠低通滤波器(在麦克风和 ADC 之间),它的截止频率低于 Fs/2,以确保一切都被该频率滚降(给定一个有限的滤波器过渡宽度)。

房间的声学效果也可能是零。在高于 2 Khz 的频率下,从峰值到麦克风放置的零位可能只有几英寸。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多