确定 JS AudioContext.analysisrNode 中的频率

2023-12-28

背景

我的目标是创建一个基于 JavaScript 的 Web 应用程序来分析和显示音频源(包括页内源)中的频率信息(<audio>标签)和从客户端麦克风传输的信号。我一切顺利:)

作为一名热心的萨克斯管演奏家,我的目标之一是通过检查高音分音相对于基本音高的分布来比较不同萨克斯管演奏家和乐器的音调固有的信息。简而言之,我想得出为什么不同的乐器演奏家和乐器品牌即使在演奏相同的音高时听起来也不同的原因。此外,我想将同一演奏者/乐器的各种“替代指法”与传统或标准指法的调音和频率分布进行比较。

使用 JS 访问和显示频率信息是一件相当简单的事情AudioContext.analyserNode,我将其与HTML5 Canvas用于创建频率图或与找到的类似的“winamp 样式条形图”的元素“使用 Web 音频 API 进行可视化”@ MDN https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Visualizations_with_Web_Audio_API.

PROBLEM

为了实现我的目标,我需要识别音频源中的一些特定信息,特别是频率in Hertz基音的,用于乐器演奏者/乐器之间的直接比较,以及源的频率范围,以确定我感兴趣的声音的频谱。该信息可以在变量中找到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);
        }());
    }
};

ISSUES

虽然我可以轻松地代表fData作为条形图或折线图等<canvas>API,使得声源的基音和高音部分清晰可见,到目前为止我还无法确定......

  • 频率范围为fData(最小-最大赫兹)
  • 中每个值的频率fData (Hz)

没有这个我就无法开始识别源的主频率(为了比较调音与传统音乐音高名称的变化)和/或突出显示或排除所表示光谱的区域(放大或缩小等)进行更详细的检查。

My intention is to prominently display the dominant frequency by pitch (note name) and frequency (Hz) and to display the frequency of any individual bar in the graph on-mouseover. N.B. I already have a data object in which all the frequencies (Hz) of the chromatic pitches between C0-B8 are stored.

尽管阅读了AudioContext.analysisrNode 规范 https://webaudio.github.io/web-audio-api/#the-analysernode-interface好几次,几乎这个网站和 MDN 上的每个页面都涉及这个主题,我仍然不知道如何完成这部分任务。

基本上,我们如何着手改变Uint8Array() fData转化为每个频率的振幅(以赫兹为单位)的表示,其中fData数组元素反射。

任何意见、建议或鼓励将不胜感激。

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 Hz 可以覆盖整个八度音程)比高音音域(音符之间有数百 Hz)精确。 ”对此我说:是的,是的。这就是 FFT 的工作原理。在上部寄存器中,更容易看到调音差异。

接下来的评论通常是“哇,我需要一个巨大的 fftSize 才能在低音音域中保持精确。”通常,答案是“不,你可能不应该这样做”——在某些时候,自相关比 FFT 更有效,而且更精确。

希望这有助于为您指明正确的方向,如果有后续行动,请添加评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 JS AudioContext.analysisrNode 中的频率 的相关文章

  • jQuery.getJSON:如何避免在每次刷新时请求 json 文件? (缓存)

    在此示例中 您可以看到生成的 HTML 列表 每次刷新时 脚本都会请求数据文件 ajax test json 并再次构建列表 生成的文件 ajax test json 被静态缓存 但是如何避免在每次刷新时请求此文件 source jquer
  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • AngularJS 使用 $apply 而不使用 $scope

    我开始使用 AngularJS 并且接受了用它来编写控制器的约定 而不是用 scope 所以我的控制器看起来像这样 myApp controller SomeController function this myModel id 1 nam
  • JavaScript 对象引用缓存

    我们的代码库中有很多对象 它们的名称空间是为了避免冲突 Example App local view MyView 在我在代码库中看到的大多数地方 我们使用完整路径来获取对对象的引用 并且这在同一函数中重复多次 Example functi
  • 检查 DOM 元素是否为复选框

    如何检查给定的 DOM 元素是否为复选框 设想 我有一组文本框和复选框 其中的值是动态分配的 我没有办法识别 DOM 元素是复选框还是文本框 只使用普通的 javascript 你就可以做到 if el type el type check
  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • Bing.com 如何创建放大的缩略图?

    当我使用 Bing com 搜索图像时 我发现它们的图像经过精心裁剪和排序 当您将鼠标放在图像上时 会弹出另一个窗口 其中显示放大的图像 我想在我的程序中做同样的事情 我检查了他们页面的源代码 他们正在使用 javascript 但我仍然不
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • setInterval 内的返回值

    我想在 setInterval 内返回一个值 我只想以一定的时间间隔执行一些操作 这就是我尝试过的 function git limit var i 0 var git setInterval function console log i
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • 常规 JavaScript 可以与 jQuery 混合使用吗?

    例如 我可以采用这个脚本 来自 Mozilla 教程 https developer mozilla org en Canvas tutorial Basic usage
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 错误:创建 React Native 项目版本 0.59.9 时找不到 template.config.js

    当我尝试创建 React Native 项目版本 0 59 9 时 出现以下错误 错误错误 无法在 react native 模板中找到 var folders zc h93bvpb573q24 5ynvgkn1wc0000gn T rnc
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • Spring Batch 事务异常:在 JobRepository 中检测到现有事务

    我正在尝试这个并得到异常 java lang IllegalStateException 在 JobRepository 中检测到现有事务 请修复此问题并重试 例如 从客户端删除 Transactional 注释 有没有人遇到过这个问题 T
  • 带有 war 文件的 Spring 应用程序属性配置文件

    我正在尝试将我的项目打包在 war用于 tomcat 服务器部署 我需要有能力使用我的application properties OR application dev properties OR appliation qa propert
  • Jenkins Git fatal:无法访问“https://URL.git”:SSL 证书 p‌r‌o‌b‌l‌e‌m:自签名证书

    我们新安装了 Jenkins 和 Bitbucket 服务器 它们使用本机自签名证书运行 When I try to clone the repository with windows command prompt it is gettin
  • Ajax 就绪状态 3(Chrome / IE)

    我正在和一些人玩comet and mxhr技术 事实证明 Chrome 5 实际上会发射一个readystate 3 但是responseText总是empty there 直到今天我还以为只是InternetExplorers 我这里错
  • 高性能缓存

    以下代码应该缓存上次读取的内容 这LastValueCache是一个可以被许多线程访问的缓存 这就是我使用共享内存的原因 对我来说 有竞争条件是可以的 但我希望其他线程能够看到更改LastValueCache class Repositor
  • Java日历日期错误

    谁能帮我理解为什么我得到不同的月份值 SimpleDateFormat dateFormat new SimpleDateFormat dd MM yyyy System out println dateFormat format cal
  • 如何加快从mysql到neo4j的插入速度?

    我在 mysql 中有一个包含 60000 个项目的数据集 我正在尝试将其插入 Neo4j 中 插入正在进行 但需要很长时间 大约每 3 秒 10 15 次 有什么办法可以加快速度吗 还有什么方法可以让我在 Neo4j 中提供诸如唯一键之类
  • 在 postgresql 中删除停用词而不进行词干化

    我想从数据中删除停用词 但我不想阻止这些词 因为确切的词对我很重要 我用了这个查询 SELECT to tsvector english colName from tblName order by lower asc 有什么方法可以在不阻止
  • 实体框架 6:将子对象添加到父对象的列表与将子对象的导航属性设置为父对象

    我有一个包含两个表的现有数据库MailServers and MailDomains in it MailDomains有外键列MailServerId指向Id主键列在MailServers 所以我们这里有一对多的关系 我跟着本文 http
  • Python:使用 setproctitle 更改进程名称

    我有一个 python 脚本 它启动许多 C 程序 每个程序都会传递一个命令行参数 如下所示 process path test process name test num process 10 for p in range 1 num p
  • Sequelize:如何在使用左外连接的连接表上执行 WHERE 条件

    我的数据库模型如下 员工驾驶一辆或零辆车辆一辆车可以由一名或多名员工驾驶车辆有一个模型类型 可以告诉我们它的燃料类型以及其他信息 我想要续集为我找到所有不开车的员工 或者如果他们开车 那么车辆不是柴油车 因此 其中 VehicleID 为
  • 带有 SharePoint 参数的 VB.Net 命令行(控制台)程序

    我想在 VB net 中创建一个允许参数的控制台程序 我想要做的是在下面的代码中添加参数 以便可以从 运行 菜单创建 Web 部件页面 例如C MyProgram exe Design 这将创建 Design Webpart 页面 我尝试在
  • 删除图中的文本

    我正在使用绘图功能sizetree from library plotrix 版本 3 8 1 这个函数有一个showcount允许括号中的一些计数显示在绘图上的参数 见下图 但我想知道为什么当我使用showcount FALSE 它们周围
  • Python 游戏网络

    我目前在寻找网络游戏编程资源时遇到困难 特别是Python 我不知道任何其他语言 我在 Python 中发现了很多关于通用网络的东西 但我不确定这就是我需要的 因为我相信游戏网络还涉及一些其他因素 我正在尝试创建一个在不同计算机上玩的 2
  • Python。如何使用libxml2获取属性值

    我使用的是 MINIDOM 但它不提供 xpath 方法 我现在尝试使用 libxml2 但在检索属性值时遇到问题 我的 xml 摘录如下
  • jersey 2.3.1 和 spring 集成兼容性问题

    我正在尝试创建将使用球衣和弹簧的宁静服务项目设置 我最初下载了 jersey1 8 依赖的 jar 我还得到了 jersey spring 1 8 并且我使用 com sun jersey spi spring container serv
  • 如何使用一对 FrameLabels 制作绘图网格?

    创建行 列 网格图 整个网格具有单个 FrameLabel 的最简单方法是什么 我需要类似的东西 p ListPlot RandomInteger 10 5 Joined gt True Axes gt False Frame gt Tru
  • Google 地图 API 3 搜索框

    我不知道如何在我的谷歌地图中实现搜索框 我有它 用户可以从表单中选择一些内容 然后在地图上加载标记 现在我想添加他们可以使用谷歌搜索框输入城市和州的位置 例如在maps google com上 这可以通过 API v 3 来完成吗 Goog
  • Eclipse:选择不包含任何可以在服务器上运行的资源

    我无法将 Maven Java Web 应用程序项目运行到 Eclipse IDE 中配置的 Tomcat 最初 我可以右键单击该项目并在 tomcat 服务器上运行它 但自从我将项目共享到存储库后 我无法执行此操作 我从存储库中断开了项目
  • 确定 JS AudioContext.analysisrNode 中的频率

    背景 我的目标是创建一个基于 JavaScript 的 Web 应用程序来分析和显示音频源 包括页内源 中的频率信息