首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自Tone.Waveform().getValues()的值代表什么?

来自Tone.Waveform().getValues()的值代表什么?
EN

Stack Overflow用户
提问于 2022-10-19 20:22:07
回答 1查看 47关注 0票数 2

我正在尝试用tone.js绘制我的音频波形

代码语言:javascript
复制
// setup
const wave = new Tone.Waveform()
Tone.Master.connect(wave)

// later
wave.getValue() // returns an array (length 1024) of numbers between -1 and 1

这很好,只是我很难理解这些数字代表的是什么。我假设它们是随着时间的推移波动的振幅,但如果是这样的话,它们到过去有多远呢?

或者我完全误解了一些事情,无论是哪种情况,如果你能给我一些解释,我会很感激!

文档非常简短,可以找到这里,它的内容如下:

获取音频源的波形。将长度大小的波形数据作为Float32Array返回,其值介于-1和1之间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-27 13:37:55

这真的很有趣!由于我对音频API不太熟悉,所以我遵循了Tone.js的源代码来揭示它的含义。

代码中的Tone.Waveform属性是new Tone().Waveform,它包含.getValue()的实现。

代码语言:javascript
复制
// https://github.com/Tonejs/Tone.js/blob/053b5d4397b595ea804b5d6baf6108158c8e0696/Tone/component/analysis/Waveform.ts#L43-L45
// Waveform.ts
class Waveform extends MeterBase {
  // ...
  /**
   * Return the waveform for the current time as a Float32Array where each value in the array
   * represents a sample in the waveform.
   */
  getValue(): Float32Array {
    return this._analyser.getValue() as Float32Array;
  }
}

Waveform._analyser属性来自MeterBase。用分析器实现._analyser属性

代码语言:javascript
复制
// https://github.com/Tonejs/Tone.js/blob/053b5d4397b595ea804b5d6baf6108158c8e0696/Tone/component/analysis/MeterBase.ts
// MeterBase.ts
class MeterBase {
  // ...
  protected _analyser: Analyser;
}

看看Analyser.ts,就会发现getValue()来自analysers[x].getFloatTimeDomainData()。现在我们有了一条线索,getValue()似乎是一些浮点信号的时间序列数据。

代码语言:javascript
复制
// https://github.com/Tonejs/Tone.js/blob/b1526c357854d8017765328bd1278a91d1e14e50/Tone/component/analysis/Analyser.ts#L17-L21
// Analyser.ts
/**
* Wrapper around the native Web Audio's [AnalyserNode](http://webaudio.github.io/web-audio-api/#idl-def-AnalyserNode).
* Extracts FFT or Waveform data from the incoming signal.
* @category Component
*/
class Analyser {
  // ...
  private _analysers: AnalyserNode[] = [];
}

analysers是AnalyserNode数组的包装器,如注释中所述。

链接的W3C官方AnalyserNode文档结果表明,.getFloatTimeDomainData()是分贝(DB)时间序列数据的blackman窗口和傅里叶变换的结果。这份文件有更详细的内容。如果你对它感兴趣,请检查一下。

简单地说,这是一个关于分贝(DB)随时间变化的规范化数据。我相信dB使用1024和-1 ~1的规范化时间框架来节省内存。在本质上,波形有曲线形式,可以用数学表达式优雅地压缩。因此,在理论上,它没有明确的界限,因为一切都可以归一化,但它可能会失去一些质量的归一化率(平滑)。

我个人认为,Tone.js的文档作者在简化getValues()含义方面做得很好。它只是解释了它是什么,它可以是什么在一个简短的句子,而不是做不必要的讲座。对于一些人来说,它可能需要更详细的说明,但我认为任何使用WebAudio的人都可能理解它是什么。

感谢霍夫带来了这么棒的问题。

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

https://stackoverflow.com/questions/74131456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档