【问题标题】:createPeriodicWave from an array of sample values从样本值数组中创建PeriodicWave
【发布时间】:2016-09-27 10:45:10
【问题描述】:

我有一条曲线——比如说,一条正弦曲线——它以均匀的间隔被采样到一个 Float32Array 中,称为 samples。曲线按采样。如果将 samples(带有一些舍入)放在屏幕上,我们会得到如下内容:

 1.0 |    x           x
 0.5 |  x   x       x   x
 0.0 | x     x     x     x     x
-0.5 |        x   x       x   x
-1.0 |          x           x

samples 数组的内容与这些数字类似:

0, 0.5, 1, 0.5, 0, -0.5, -1, -0.5, 0, ...

如您所见,曲线由每个给定样本的曲线表示。我想从这些样本值中创建一个PeriodicWave,这可以通过使用AudioContext.createPeriodicWave()来完成。

但是,此方法接受以下参数而不是采样值:

  • real:余弦项数组(传统上是 A 项)。
  • imag:一组正弦项(传统上是 B 项)。

我不太确定这些值对于一组采样值意味着什么。 如何将采样值转换为余弦项和正弦项?

编辑:被采样的曲线不一定是正弦波或余弦波。它可以采用任意形状。

【问题讨论】:

    标签: javascript audio web-audio-api


    【解决方案1】:

    如果您真的只想获取波形,那么只需使用 AudioBufferSource 并将其循环(作为 AudioBuffer)。

    PeriodicWaves 有所不同 - 它们是一种通过改变每个谐波的相对系数来谐波控制振荡器波形的方法。如果您在“imag”数组的第二个槽中创建了一个只有值“1”的 PeriodicWave,您将得到一个正弦波。同样,您可以通过控制高次谐波来创建方波、三角波或锯齿波 - 请参阅https://en.wikipedia.org/wiki/Non-sinusoidal_waveform。这些浪潮最终可能会变得非常丰富 -

    如果您想将其转换为 PeriodicWave,您需要使用 FFT 算法将其转换为 PeriodicWave 使用的一组相对谐波强度(https://en.wikipedia.org/wiki/Discrete_Fourier_transform 是一个不错的介绍)。网上有一些库可以做到这一点,比如 DSP.js (https://github.com/corbanbrook/dsp.js/)。

    (以前叫Wavetable,但也很混乱,应该改名为HarmonicWaveTable?)

    【讨论】:

    • 我现在明白了,所以它是一组简单波的定义数组,随后每个波都比前一个高一个或多个八度音阶(具有两倍或更多的频率)。
    【解决方案2】:

    如果您确定您拥有的时域波形是周期性的,那么您只需对波形进行傅立叶变换即可获得傅立叶系数。变换的实部和虚部可以作为realimag 参数传递给createPeriodicWave

    但如果您已经拥有波形,只需将其保存在AudioBuffer 中,将其分配给AudioBufferSourceNode,将loop 设置为true,然后将其用作音频源而不是OscillatorNode使用自定义PeriodicWave

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2015-08-21
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多