javascript - 如何转换波表以与`OscillatorNode.setPeriodicWave`一起使用?
问题描述
我想使用带有 WebAudio 的自定义波形OscillatorNode
。我是音频合成的新手,但在数学方面仍然很吃力(至少我可以编程)。
波形被定义为函数,所以我有函数本身,并且可以对波形进行采样。但是,该OscillatorNode.createPeriodicWave
方法需要两个数组(real
和imag
)来定义频域中的波形。
AnalyserNode
具有用于在频域中计算数组(字节或浮点数)的 FFT 方法,但它适用于来自另一个节点的信号。
我想不出一种将波表AnalyserNode
正确输入的方法,但如果可以的话,它只返回一个数组,而OscillatorNode.createPeriodicWave
需要两个。
TLDR从周期函数开始,你如何计算对应的参数OscillatorNode.createPeriodicWave
?
解决方案
由于您有一个由函数定义的周期性波形,因此您可以计算该函数的傅里叶级数。如果该系列有无限数量的术语,则需要截断它。
这是一项工作,但这正是预定义振荡器类型的计算方式。例如,请参阅OscillatorNode的方波定义。PeriodicWave
方波的系数正是以这种方式计算的。
如果您知道波形的带宽,则无需进行杂乱的积分,就可以大大简化工作。只需足够快地均匀采样波形,然后使用FFT获得所需的系数PeriodicWave
。采样定理中的其他细节。
或者您可以假设AudioContext
(通常为 44.1 kHz 或 48 kHz)的采样率足够高,只需每 1/44100 或 1/48000 秒采样一次波形并计算结果样本的 FFT。
推荐阅读
- asp.net - 'label1' 未声明 | 它在包含文件中定义
- deployment - 为什么通过 redis-ha 在 k8s 上集群不起作用?
- angular - 在 Angular 6 中使用 ng2-select2
- cassandra - 优化在 WHERE 子句中使用算术运算的查询
- elm - 如何在榆树脚本中将类添加到表的所有列
- tensorflow - 在自定义 keras 训练损失函数中缩减数据
- xamarin - Xamarin 和 identityserver4 身份验证错误
- c# - Windows 窗体窗体关闭事件不适用于打开新窗体
- python - 字符串拆分后获取第一个数字
- c++ - 如何在 C++ 中实现逐级计数/显示节点的函数