- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
背景
我的目标是创建一个基于 JavaScript 的网络应用程序来分析和显示音频源中的频率信息,包括页面内源(<audio>
标记)和从客户端麦克风流出的信号。我正在路上:)
作为一名敏锐的萨克斯管演奏者,我的目标之一是通过检查高音分音相对于基本音高的分布,比较不同萨克斯管演奏者和乐器的音调中固有的信息。简而言之,我想推导出为什么不同的乐器演奏家和乐器品牌即使在演奏相同的音高时听起来也不同。此外,我想将各种“替代指法”的调音和频率分布与同一演奏者/乐器的传统或标准指法进行比较。
使用 JS AudioContext.analyserNode
访问和显示频率信息是一件相当微不足道的事情,我将其与 HTML5 Canvas
结合使用元素创建频率图或“winamp 风格的条形图”,类似于找到的 'Visualizations with Web Audio API' @ MDN .
问题
为了实现我的目标,我需要识别音频源中的一些特定信息,特别是基音的以赫兹为单位的频率,用于乐器演奏者/乐器之间的直接比较,以及频率范围的来源,以识别我感兴趣的声音的频谱。该信息可在变量 fData
中找到。下面...
// example...
var APP = function() {
// ...select source and initialise etc..
var aCTX = new AudioContext(),
ANAL = aCTX.createAnalyser(),
rANF = requestAnimationFrame,
ucID = null;
ANAL.fftSize = 2048;
function audioSourceStream(stream) {
var source = aCTX.createMediaStreamSource(stream);
source.connect(ANAL);
var fData = new Uint8Array(ANAL.frequencyBinCount);
(function updateCanvas() {
ANAL.getByteFrequencyData(fData);
// using 'fData' to paint HTML5 Canvas
ucID = rANF(updateCanvas);
}());
}
};
问题
虽然我可以很容易地表示fData
通过 <canvas>
作为条形图或折线图等API,这样一个声源的基础和上部部分清晰可见,到目前为止我还不能确定...
fData
的频率范围(最小-最大赫兹)fData
中每个值的频率(赫兹)如果没有这个,我就无法开始识别源的主频率(以便将调音的变化与传统音乐音调名称进行比较)和/或突出显示或排除所代表的区域谱(放大或缩小等)以进行更详细的检查。
我的意图是通过音高(音符名称)和频率 (Hz) 突出显示主频率,并在鼠标悬停时显示图表中任何单个条的频率。 注意我已经有一个数据对象,其中存储了 C0-B8 之间半音音高的所有频率 (Hz)。
尽管阅读了 AudioContext.analyserNode specification好几次,几乎这个网站和 MDN 上的每个页面都与这个主题有关,但我仍然对如何完成这部分任务没有明确的想法。
基本上,如何转换 Uint8Array() 中的值 fData
以赫兹为单位表示每个频率的振幅,其中 fData
数组元素反射(reflect)。
如有任何建议、建议或鼓励,我们将不胜感激。
BP
最佳答案
因此,首先要了解 FFT 的输出将为您提供一系列频率范围的相对强度,而不是精确的频率。
这些范围分布在频谱 [0,奈奎斯特频率] 中。奈奎斯特频率是采样率的二分之一。因此,如果您的 AudioContext.sampleRate 是 48000(赫兹),您的频率区间将跨越 [0,24000](也以赫兹为单位)。
如果您在 AnalyserNode 中为 fftSize 使用默认值 2048,则 frequencyBinCount 将为 1024(它始终是 FFT 大小的一半)。这意味着每个频率仓将代表 (24000/1024 = 23.4) 大约 23.4Hz 的范围 - 因此频率仓看起来像这样(即兴的,此处可能会出现舍入误差):
fData[0] is the strength of frequencies from 0 to 23.4Hz.
fData[1] is the strength of frequencies from 23.4Hz to 46.8Hz.
fData[2] is the strength of frequencies from 46.8Hz to 70.2Hz.
fData[3] is the strength of frequencies from 70.2Hz to 93.6Hz.
...
fData[511] is the strength of frequencies from 11976.6Hz to 12000Hz.
fData[512] is the strength of frequencies from 12000Hz to 12023.4Hz.
...
fData[1023] is the strength of frequencies from 23976.6Hz to 24000Hz.
到目前为止有意义吗?
通常出现的下一个评论是“等一下 - 从音乐上讲,低音音域(23.4 赫兹可以覆盖整个 Octave )比高音音域(之间有数百赫兹)更不精确笔记)。”对此我说:是的,是的。这就是 FFT 的工作原理。在较高的寄存器中,更容易看出调音差异。
NEXT 下一条评论通常是“哇,我需要一个 MASSIVE fftSize 才能在低音寄存器中保持精确。”通常,答案是“不,你可能不应该那样做”——在某些时候,自相关比 FFT 更有效,而且更精确。
希望这可以帮助您指明正确的方向,如果有跟进,请添加评论。
关于javascript - 在 JS AudioContext.analyserNode 中确定频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44502536/
我想捕捉一个小时间窗口(即 ~1 秒)的傅里叶变换。 let audioCtx = new AudioContext(); let analyser = audioCtx.createAnalyser
WebAudio的AnalyserNode有一个FFT来获取声音信号的频域数据。我不明白 FFT 的窗口函数是如何定义的。是否可以更改窗口大小甚至窗口函数(即 Hanning 或 Blackman)?
我正在尝试使用 Web Audio API 编写自相关算法。自相关仅依赖于时域中的数据,而不依赖于频域中的数据,因此我仅使用 getByteTimeDomainData()。我很难找到有关 Analy
我正在使用 Web Audio API 来显示正在播放的音频的可视化效果。我有一个 控制播放的元素,然后我通过创建 MediaElementSource 将它连接到 Web Audio API来自
代码应该流式传输任何 url 并提供音频的可视化。不幸的是,可视化工具无法正常工作。可视化依赖于来自 AnalyzerNode 的数据,它总是返回空数据。为什么这段代码中的 AnalyserNode
我想我可能对使用 AnalyserNode 有点困惑。我目前将我的 userAudio 流“输入”连接到 AnalyserNode。然后我使用 getByteFrequencyData() 填充一个
在Web Audio API中,AnalyserNode的getFloatFrequencyData()和 getByteFrequencyData()方法为我们提供FFT分析数据,其域是频率,余域是
我正在使用 Web Audio API,但有些行为我无法理解。 var audio = document.querySelector('audio'); var context = new Audio
我无法在移动设备中使用 AudioContext.createMediaElementSource 使 AnalayserNode 工作。它不适用于 iOS 上的 Safari,也不适用于 Andro
背景 我的目标是创建一个基于 JavaScript 的网络应用程序来分析和显示音频源中的频率信息,包括页面内源( 标记)和从客户端麦克风流出的信号。我正在路上:) 作为一名敏锐的萨克斯管演奏者,我的目
所以我想我明白 getFloatFrequencyData很不错。如 getFloatFrequencyData返回一个包含 1024 个值的数组,每个值代表一个频率区间/范围的音量。在采样率为 44
实现 Peak Meter 的正确方法是什么?就像 Logic Pro 中的那些使用网络音频 API AnalyserNode ? 我知道AnalyserNode.getFloatFrequencyD
我正在尝试使用 Web-Audio 的分析器节点并不断从中得到奇怪的结果。 代码: var self = this; var bufferSize = 512; var spectrum = new
这似乎是一个常见问题 - Javascript Web Audio API AnalyserNode Not Working - 但我不确定我是否在我的实现中找到了边缘案例。 我使用 createMe
我一整天都被这个问题困扰了。尝试从 getUserMedia 中分离源并分别可视化左 channel 和右 channel 。无论我做什么,每个可视化工具都停留在单声道状态。我使用的源是立体声(如果我
网络浏览器中的音频分析可以通过 AnalyserNode of Web Audio API 轻松执行。 Node.js 有类似的东西吗? 最佳答案 您可能对 https://www.npmjs.com
我是一名优秀的程序员,十分优秀!