Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >利用AnalyserNode创建峰值仪表的Web

利用AnalyserNode创建峰值仪表的Web
EN

Stack Overflow用户
提问于 2017-06-04 16:48:17
回答 2查看 4.9K关注 0票数 4

使用Web 峰值计实现类似于逻辑Pro中的AnalyserNode的正确方法是什么

我知道AnalyserNode.getFloatFrequencyData()返回分贝值,但是如何组合这些值以获得表中显示的分贝值?您是否只取以下代码示例中的最大值( analyserData来自getFloatFrequencyData() )?

代码语言:javascript
运行
AI代码解释
复制
let peak = -Infinity;
for (let i = 0; i < analyserData.length; i++) {
  const x = analyserData[i];
  if (x > peak) {
    peak = x;
  }
}

检查一些输出只是取最大值,这看起来是不正确的方法。我说错了吗?

或者,用ScriptProcessorNode代替是否是更好的主意?这种做法有何不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-04 18:01:22

如果在一个帧中取getFloatFrequencyData()结果的最大值,那么您正在测量的是单个频率的音频功率(无论哪个频率最大)。实际上要测量的是任何频率上的峰值--换句话说,您不想使用频率数据,但是未处理的样本没有分离到频率箱中。

问题是,你必须自己计算分贝的功率。这是一个相当简单的算法:获取一些样本(一个或多个),对它们进行平方,并对它们进行平均值。请注意,即使是一个“峰值”表,可能是平均-只是在一个更短的时间尺度。

下面是一个完整的例子。(警告:发出声音。)

代码语言:javascript
运行
AI代码解释
复制
document.getElementById('start').addEventListener('click', () => {
  const context = new(window.AudioContext || window.webkitAudioContext)();

  const oscillator = context.createOscillator();
  oscillator.type = 'square';
  oscillator.frequency.value = 440;
  oscillator.start();

  const gain1 = context.createGain();

  const analyser = context.createAnalyser();

  // Reduce output level to not hurt your ears.
  const gain2 = context.createGain();
  gain2.gain.value = 0.01;

  oscillator.connect(gain1);
  gain1.connect(analyser);
  analyser.connect(gain2);
  gain2.connect(context.destination);

  function displayNumber(id, value) {
    const meter = document.getElementById(id + '-level');
    const text = document.getElementById(id + '-level-text');
    text.textContent = value.toFixed(2);
    meter.value = isFinite(value) ? value : meter.min;
  }

  // Time domain samples are always provided with the count of
  // fftSize even though there is no FFT involved.
  // (Note that fftSize can only have particular values, not an
  // arbitrary integer.)
  analyser.fftSize = 2048;
  const sampleBuffer = new Float32Array(analyser.fftSize);

  function loop() {
    // Vary power of input to analyser. Linear in amplitude, so
    // nonlinear in dB power.
    gain1.gain.value = 0.5 * (1 + Math.sin(Date.now() / 4e2));

    analyser.getFloatTimeDomainData(sampleBuffer);

    // Compute average power over the interval.
    let sumOfSquares = 0;
    for (let i = 0; i < sampleBuffer.length; i++) {
      sumOfSquares += sampleBuffer[i] ** 2;
    }
    const avgPowerDecibels = 10 * Math.log10(sumOfSquares / sampleBuffer.length);

    // Compute peak instantaneous power over the interval.
    let peakInstantaneousPower = 0;
    for (let i = 0; i < sampleBuffer.length; i++) {
      const power = sampleBuffer[i] ** 2;
      peakInstantaneousPower = Math.max(power, peakInstantaneousPower);
    }
    const peakInstantaneousPowerDecibels = 10 * Math.log10(peakInstantaneousPower);

    // Note that you should then add or subtract as appropriate to
    // get the _reference level_ suitable for your application.

    // Display value.
    displayNumber('avg', avgPowerDecibels);
    displayNumber('inst', peakInstantaneousPowerDecibels);

    requestAnimationFrame(loop);
  }
  loop();
});
代码语言:javascript
运行
AI代码解释
复制
<button id="start">Start</button>

<p>
  Short average
  <meter id="avg-level" min="-100" max="10" value="-100"></meter>
  <span id="avg-level-text"></span> dB
</p>

<p>
  Instantaneous
  <meter id="inst-level" min="-100" max="10" value="-100"></meter>
  <span id="inst-level-text"></span> dB
</p>

票数 14
EN

Stack Overflow用户

发布于 2017-06-04 17:43:36

你只是取最大值

对于峰值计,是的。对于VU计量器,在测量功率时有各种各样的考虑,以及模拟仪表的弹道。还有RMS的电能计量。

在数字土地上,你会发现一个峰值表对许多任务都是最有用的,而且到目前为止计算起来也是最容易的。

任何给定样本集的峰值是集合中的最高绝对值。但是,首先,您需要一组样本。如果你打电话给getFloatFrequencyData(),你得到的不是样本值,而是光谱。相反,您需要的是getFloatTimeDomainData()。此数据是样本的低分辨率表示。也就是说,您可能在您的窗口中有4096个样本,但是您的分析器可能配置有256个桶.因此,这4096个样本将被重新放大到256个样本。对于计量任务来说,这通常是可以接受的。

从这里,得到绝对值的最大值就是Math.max(-Math.min(samples), Math.max(samples))

假设你想要一个更高分辨率的峰值计。为此,你需要所有你能得到的原始样本。这就是ScriptProcessorNode派上用场的地方。您可以访问实际的示例数据。

基本上,对于这个任务,AnalyserNode要快得多,但分辨率要低一些。ScriptProcessorNode要慢得多,但分辨率要稍高一些。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44360301

复制
相关文章
OpenAI老板推特说相声:嘲笑创投圈「募6轮资还没到A轮」
创业公司募资化缘一轮接一轮、同时迟迟不出货没进展的恶劣风气,现在已是妇孺皆知。虽然初创公司过去一般在筹集 A、B、C 等轮次之前先进行种子轮融资,但现在许多公司选择在其间进行额外的轮次。
新智元
2022/02/24
4480
OpenAI老板推特说相声:嘲笑创投圈「募6轮资还没到A轮」
MeshCloud 脉时云获 1 亿元 A+ 轮融资
2021年11月23日,出海融合云服务商MeshCloud脉时云(www.mesh.com.cn)宣布完成1亿元A+轮融资。 MeshCloud脉时云公司名为北京云联万维技术有限公司,成立于2017年,基于MeshCloud融合云SaaS平台、出海音视频/游戏/电商等行业垂直解决方案、高效的服务体系、海外公有云厂商的深度合作,以及自建海外云基础设施为中企出海提供高质量、低成本、敏捷部署的一站式产品和服务。 此轮融资由贵州省创新赋能大数据投资基金领投,老股东跟投。募集资金将投入到云架构师及产品研发团队扩充和
云头条
2022/03/18
4300
嘲笑资本退潮后的共享单车,或在嘲笑资本大潮下我们
ofo一出错,人们就发笑。或许是厌倦了共享单车造成的城市管理乱象,或许是出于对这个声称共享经济的厌倦,ofo只要出现一点负面消息便会引发人们的口诛笔伐。这正是当下的共享单车市场尴尬的地方,一旦资本输血停止,公司便会出现问题,用户便会纷纷倒戈。世态炎凉,或许只有真正参与其中的人们才会知道。回想共享单车大战刚刚兴起的时候,那种尔要战便战的豪气依然历历在目,对于共享单车也没有今天这么多的质疑声音。
孟永辉
2018/12/19
4120
嘲笑资本退潮后的共享单车,或在嘲笑资本大潮下我们
Hive补充之窗口函数
窗口函数 1、hive窗口函数语法 hive中的窗口函数over() ,over()窗口函数的语法结构
Maynor
2021/04/09
1.1K0
非公医院的“心病”与冠脉 AI 的“良药”
“医生提供的服务跟其他的服务业完全不一样,我们面对的是一个个鲜活的生命。如果我把一位患者治好了,挽回的不仅仅是一条生命,更可能是整个家庭的希望。”
AI掘金志
2019/09/26
4690
非公医院的“心病”与冠脉 AI 的“良药”
SQL之窗口函数
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。 绝大多数情况,sql语句处理数据是行为基本单位,一行一行的对数据操作。窗口函数则是可以对行数据进行分组,将多行数据分成一组,然后进行组间操作或者组内操作。
cultureSun
2023/05/18
3850
SQL之窗口函数
WinForm之窗体应用程序
WinForm之窗体应用程序 基本简单数据库操作(增删改查) 1 using System; 2 using System.Collections.Generic; 3 using System.Windows.Forms; 4 5 namespace DataBaseOperation 6 { 7 static class Program 8 { 9 /// <summary> 10 /// 应用程序的主入口点。 11 /
用户1112962
2018/07/04
1.3K0
tkinter学习系列(二)之窗口的设置
目录 (一)窗体的最小框架 1.说明: 2.源代码: 3.实现效果: (二)窗体的基本设置 1.说明: 2.完整代码: 3.实现效果: (三)窗体的外形设置 1.说明: 2.完整代码: 3.实现效果: (四)窗体的三个方法: 1.获取屏幕的大小 2.获取窗体的大小 3.获取窗体的位置 目录: 1.窗体的最小框架 2.窗体的基本设置 3.窗体的外形设置 (一)窗体的最小框架 1.说明: 需要导入标准库: import tkinter 2.源代码: # 导入模块,并取别名 impor
py3study
2020/01/17
1.1K0
MFC学习之窗口基础
                          WinMain函数  1、句柄(HANDLE):{ 1. 定义:资源的标识 2. 句柄的作用: 操作系统通过句柄来找到对应的资源,从而对这些资源进行管理和操作。 3句柄的分类:(按资源){ 1.图标句柄(HICON) , 2.光标句柄(HCURSOR) ,             3. 窗口句柄(HWND) ,            4.应用程序实列句柄(HINSTANCE). } } 2、Windows应用程序,操作系统,计算机硬件之间的相互关系
Gxjun
2018/03/22
7380
MFC学习之窗口基础
快来,看看spring有多烂-来自jfinaL的嘲笑
脱离任何使用场景的比较,都是傻x行为。但我还是要当一回傻x,就当给新版本jfinal献礼了。
xjjdog
2019/07/10
1.6K1
快来,看看spring有多烂-来自jfinaL的嘲笑
BOM核心——window对象之窗口
浏览器对象模型BOM(Browser,Object,Model)是以window对象为基础的,这个对象代表了浏览器窗口,页面可视区域,它还被复用为Es的全局对象Global,所有的原生类型的构造函数和函数都从一开始就存在于这个对象之上。
大熊G
2022/11/14
9090
企业安全管理的“六脉神剑”
点击标题下「大数据文摘」可快捷关注 当考虑确定计算系统、数据和网络的可用性和完整性控制时,与可考虑潜在机会授权的管理员相比,普通用户拥有更少的特权。系统管理员、执行备份的操作人员、数据库管理员、维修技师甚至帮助台支持人员的运营商,都纷纷在网络中提升权限。为了确保你系统的安全性,还必须考虑可以防止管理员滥用特权的控制。用于管理日常事务以及组织内的数据访问的自动化控制不能保证自己的完整性和可用性,避免过度管理任务的控制。如果控制管理使用权限的控件也不强,那么任何其他的控件也会被削弱。下面一起来看企业安全管理的“
大数据文摘
2018/05/23
8020
5 脉神剑,杀无赦!
分享一个数据,我在 CSDN 上有 19 万多的读者关注了,这个数量应该能排到所有博主里面的 TOP 3(乐观点,自信点),就算是保守估计的话,至少应该是 TOP 10 吧!
沉默王二
2021/04/25
4190
5 脉神剑,杀无赦!
多级时间轮定时器_时间轮与哈希表定时
顾名思义,时间轮就像一个轮子,在转动的时候外界会指向轮子不同的区域,该区域就可以被使用。因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽(即时间轮划分的区域)之中,就可以实现在运转到某个槽时,进行判断该定时器是否已经到达运行时间(需要判断是由于有的定时器并非在这一圈就需要运行,可能需要后面几圈才会运行。
全栈程序员站长
2022/11/10
1.2K0
多级时间轮定时器_时间轮与哈希表定时
Lucene 高阶查询的六脉神剑 —— QueryParser
上篇我们介绍了 Lucene 多样的查询模式,每一种都是相互独立的用来解决特定查询目标的 Query 对象。本节我们要将这些查询模式使用 QueryParser 组合起来进行合并查询 —— 用一个文本字符串表达式来表示所有的查询模式。
老钱
2019/09/17
2.6K1
Lucene 高阶查询的六脉神剑 —— QueryParser
flink时间系统系列之窗口函数中的应用分析
在flink中窗口划分可以基于时间、基于数量,我们这里所涉及到的窗口是针对时间类型窗口:processing-time window与event-time window,时间系统在时间窗口应用主要用来注册窗口触发时间点,来决定窗口什么时候开始执行窗口函数。接下来从源码的角度分析窗口是如何使用时间系统的。
Flink实战剖析
2022/04/18
6810
flink时间系统系列之窗口函数中的应用分析
秘籍:微服务设计的六脉神剑
介绍 “微服务”是一种新的软件开发模式,它来源于提高软件开发和管理效率的一系列工程实践。敏捷方法、DevOps文化、PaaS、应用容器、CI/CD文化和技术的广泛采用,使得构建真正的模块化、大规模服务系统成为可能。 什么是微服务? 微服务是一种架构方法,强调将应用拆分成由跨职能团队管理的单目标、松散耦合的多个服务,以满足如今数字时代对软件系统交付和维护速率与质量的要求。 微服务与编程语言、平台、操作系统无关。它将庞大的应用拆分成更小更简单的应用,这些庞大的应用一般都是打成一个软件包。每个应用只需要做好一件
DevOps时代
2018/02/02
8710
秘籍:微服务设计的六脉神剑
打通Python学习的任督二脉
Python的基础知识已经在上周全部更新完成,今天对之前的文章做一个汇总方便大家的查看【多图!加了好多思维导图】同时对有遗漏的知识点也已经做了补充,当然这一部分直接将自己的学习笔记给贴上了,文末加了四篇实战练习和一篇BAT面试题分享。今天更新的次条对LeetCode的1--20题做了汇总,发起了大家一起刷题的活动,后续刷题将不按顺序而是按照具体的知识点。
PM小王
2019/07/02
6850
打通Python学习的任督二脉
【干货】教你打通Git的任督二脉
分布式版本控制系统( Distributed Version Control System,简称 DVCS )。
狼王编程
2021/06/01
4310
【干货】教你打通Git的任督二脉
点击加载更多

相似问题

反应钩形与脉轮

14

如何转换/动画与脉轮-UI?

23

脉轮UI图标

144

脉轮UI,如何使组件与左边对齐?

37

脉轮用户界面图标作为变量

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档