如何生成波形表以实现更快的实时音频合成

时间:2018-03-14 16:12:13

标签: ios audio optimization signal-processing waveform

几个月前,我为iOS设备开发了一款应用程序,可生成实时谐波丰富的无人机。它在较新的设备上运行良好,但它在较慢的设备上运行缓冲区欠载。我需要优化这个东西,需要一些心理帮助。这是我目前正在做的事情的超级基本概述:

  • 创建一个"振荡器银行"它由X个谐波组成(简单地从给定的基频计算出来。这里没什么好看的。)
  • 在我的DAC函数中,将样本吐出到iOS音频缓冲区,我调用了一个" GetNextSample()"通过正弦振荡器组的功能,计算每个振荡器的样本并将它们相加。一些简单的添加剂合成。
  • 享受无人机的美丽。

同样,它很有效,直到它没有。我想优化这个东西,所以我没有使用实时计算的正弦波的粗糙加法合成。如果我将谐波数量(" bank")限制为2,它将在旧设备上运行。不酷。在较新的设备上,它低于50次谐波。还不错。但是,如果我想一次玩多个无人机来创造一些和弦,那就是处理能力太强......所以...

  • 我应该生成波形表来循环而不是常量计算吗? (我假设是的......)
  • 我应该将双精度浮点数的使用转换为基于整数的计算吗? (我假设是的......)

我的大算法问题(非常非数学):

  • 如果我使用波形表,我该如何准确地确定波形/表格的长度?根据我开发这个应用程序的经验,如果我只是一段时间(2 * PI)结束并重新开始,将相位重置为0,我会得到一个声音伪影,因为我强制抵消相位。换句话说,我无法保证一个时期会给我正确的结果......

也许我对复杂的事情感到困惑......什么是快速,处理器友好的多个正弦合成的实时合成的标准方式?

在此期间,我一直在四处寻找。

谢谢!

2 个答案:

答案 0 :(得分:1)

您(或者您可以,而不是iOS用户)是否增加了缓冲区大小?可能会给你足够的开销,你不需要这个。否则是wave-table synthesis是一种可行的方法。只有当参数发生变化时,才可以从所有谐波的总和中计算出新的波表。

答案 1 :(得分:0)

我在服务器端的golang上写过这样的野兽......对于初学者来说是使用单精度浮点

为了解决表格填充问题,我确保通过合成方波确保您的实现是可靠的。可视化每次运行的输出,同时为每个运行提供额外的频率(以及相应的振幅和相移参数)......根据定义,只要您正确使用足够的周期来覆盖时间段,单个周期就足够了。样品

利用从一组正弦波(每个都具有频率,幅度,相移)生成输出曲线的知识非常重要,这有助于进行反向...即在该输出曲线上执行FFT以使其具有api给你它的底层正弦波版本(每个都有频率,幅度和相位)...这将确认你的系统是准确的

您正在实施的流程的名称是: 逆傅里叶变换 并且有这样的库但是我也更喜欢滚动我自己的