如何生成波形表以加快实时音频合成
Posted
技术标签:
【中文标题】如何生成波形表以加快实时音频合成【英文标题】:How to generate a waveform table for quicker realtime audio synthesis 【发布时间】:2018-03-14 16:12:12 【问题描述】:几个月前,我为 ios 设备开发了一款应用,它可以生成实时谐波丰富的无人机。它在较新的设备上运行良好,但在较慢的设备上遇到缓冲区不足。我需要优化这个东西,需要一些精神上的帮助。这是我目前正在做的事情的超级基本概述:
创建一个包含 X 个谐波的“振荡器组”(简单地根据给定的基频计算。这里没什么特别的。) 在将样本输出到 iOS 音频缓冲区的 DAC 函数中,我调用了一个“GetNextSample()”函数,该函数通过正弦振荡器组,计算每个振荡器的样本并将它们相加。一些简单的加法合成。 享受无人机之美。再次,它工作得很好,直到它没有。我想优化这个东西,所以我不使用实时计算正弦波的粗略加法合成。如果我将谐波(“银行”)的数量限制为 2,它将适用于较旧的设备。不酷。在较新的设备上,它低于大约 50 个谐波。还不错。但是如果我想同时演奏多个无人机来创建一些和弦,那处理能力就太大了......所以......
我应该生成波形表来循环而不是不断计算吗? (我认为是的......) 我应该将我对双精度浮点的使用转换为基于整数的计算吗? (我认为是的......)还有我的大算法问题(非常非数学):
如果我使用波形表,如何准确确定波形/表应该多长?根据我开发此应用程序的经验,如果我只是走到一个周期的末尾 (2*PI) 并重新开始,将相位重置回 0,我会得到一个声音伪影,因为我正在强制偏移相位。换句话说,我不能保证一个时期会给我正确的结果...也许我把事情复杂化了……快速、处理器友好的多个添加正弦的实时合成器的标准方法是什么?
在此期间,我会继续闲逛。
谢谢!
【问题讨论】:
【参考方案1】:您(或者您,不是 iOS 用户)是否增加了缓冲区大小?可能会给你足够的开销,你不需要这个。否则是的wave-table synthesis 是一种可行的方法。只有当参数发生变化时,您才能从所有谐波的总和中计算出新的波表。
【讨论】:
我已经很久没有看到我的这个问题了,但这是我最终选择的路线。一旦我看到 Max/MSP 的 cycle~ 对象使用 512 字节的波表,我就被这个概念所吸引。一旦我实现了它(比我想象的要容易得多),我就完全相信了这个概念。增加缓冲区会有所帮助,但我在平衡较慢的处理器和较长的缓冲区时遇到了麻烦,导致延迟过多。波表解决了这一切:)。谢谢!【参考方案2】:我在服务器端的 golang 中写了这样一个野兽...对于初学者来说,是的,使用单精度浮点
为了解决表格填充问题,我会通过合成方波来确保您的实现是可靠的。可视化每次运行的输出,因为你给它每个额外的频率(及其相应的幅度和相移参数)......根据定义,只要你正确使用足够的周期来覆盖一个周期,一个周期就足够了样本
利用从一组输入正弦波(每个都具有频率、幅度、相移)生成输出曲线的知识很重要,这有助于进行相反的操作……即在该输出曲线上执行 FFT 以获得api 为您提供底层正弦波的版本(同样每个都有频率、幅度和相位)......这将确认您的系统是准确的
您正在实施的过程的名称是:傅里叶逆变换,并且有一些库用于此,但我也更喜欢自己滚动
【讨论】:
以上是关于如何生成波形表以加快实时音频合成的主要内容,如果未能解决你的问题,请参考以下文章