如何生成波形 table 以实现更快的实时音频合成
How to generate a waveform table for quicker realtime audio synthesis
几个月前我为 iOS 设备开发了一个应用程序,可以生成实时谐波丰富的无人机。它在较新的设备上运行良好,但在较慢的设备上 运行 进入缓冲区不足。我需要优化这个东西,需要一些精神上的帮助。这是我目前正在做的事情的超级基本概述:
- 创建一个包含 X 次谐波的 "Oscillator Bank"(根据给定的基频简单计算。这里没有什么特别的。)
- 在我的 DAC 函数中,将样本输出到 iOS 音频缓冲区,我调用了一个 "GetNextSample()" 函数,该函数通过正弦振荡器组,计算每个样本并将它们相加向上。一些简单的加法合成。
- 欣赏无人机之美
再一次,它工作得很好,直到它不工作。我想优化这个东西,所以我不使用实时计算的正弦波的粗暴加法合成。如果我将谐波数 ("banks") 限制为 2,它将适用于旧设备。不酷。在较新的设备上,它低于大约 50 个谐波。还不错。但是如果我想同时播放多个无人机来创建一些和弦,那处理能力就太大了....所以...
- 我应该生成波形 tables 只是循环而不是不断计算吗? (我想是的...)
- 我应该将我对双精度浮点的使用转换为基于整数的计算吗? (我想是的...)
还有我的大算法问题(非常非数学):
- 如果我使用波形 table,如何准确确定 wave/table 应该有多长?根据我开发此应用程序的经验,如果我刚到一个周期 (2*PI) 的末尾并重新开始,将相位重置回 0,我会得到一个声音伪像,因为我强行抵消了相位。换句话说,我不能保证一期能给我正确的结果...
也许我把事情复杂化了......对多个添加的正弦进行快速、处理器友好的实时合成的标准方法是什么?
在此期间我会继续四处寻找。
谢谢!
我在服务器端用 golang 编写了这样一个野兽......对于初学者来说是使用单精度浮点
为了解决 table 人口问题,我会通过合成方波来确保您的实施是可靠的。可视化每个 运行 的输出,因为你给它每个额外的频率(及其相应的振幅和相移参数)......根据定义,只要你正确使用足够的周期来覆盖,一个周期就足够了一个样本的时间段
重要的是要利用以下知识:从输入的一组正弦波(每个都有频率、振幅、相移)生成输出曲线有助于进行反向操作……即对该输出曲线执行 FFT让 api 为您提供基础正弦波的版本(同样每个都有频率、振幅和相位)...这将确认您的系统是准确的
您正在实施的过程的名称是:逆傅里叶变换并且有用于此的库但是我也更喜欢滚动我的拥有
您(或者您可以,不是 iOS 人)增加缓冲区大小吗?可能会给你足够的开销,你不需要这个。否则 yes wave-table synthesis 是一个可行的方法。仅当参数发生变化时,您才能根据所有谐波的总和计算出新的波表。
几个月前我为 iOS 设备开发了一个应用程序,可以生成实时谐波丰富的无人机。它在较新的设备上运行良好,但在较慢的设备上 运行 进入缓冲区不足。我需要优化这个东西,需要一些精神上的帮助。这是我目前正在做的事情的超级基本概述:
- 创建一个包含 X 次谐波的 "Oscillator Bank"(根据给定的基频简单计算。这里没有什么特别的。)
- 在我的 DAC 函数中,将样本输出到 iOS 音频缓冲区,我调用了一个 "GetNextSample()" 函数,该函数通过正弦振荡器组,计算每个样本并将它们相加向上。一些简单的加法合成。
- 欣赏无人机之美
再一次,它工作得很好,直到它不工作。我想优化这个东西,所以我不使用实时计算的正弦波的粗暴加法合成。如果我将谐波数 ("banks") 限制为 2,它将适用于旧设备。不酷。在较新的设备上,它低于大约 50 个谐波。还不错。但是如果我想同时播放多个无人机来创建一些和弦,那处理能力就太大了....所以...
- 我应该生成波形 tables 只是循环而不是不断计算吗? (我想是的...)
- 我应该将我对双精度浮点的使用转换为基于整数的计算吗? (我想是的...)
还有我的大算法问题(非常非数学):
- 如果我使用波形 table,如何准确确定 wave/table 应该有多长?根据我开发此应用程序的经验,如果我刚到一个周期 (2*PI) 的末尾并重新开始,将相位重置回 0,我会得到一个声音伪像,因为我强行抵消了相位。换句话说,我不能保证一期能给我正确的结果...
也许我把事情复杂化了......对多个添加的正弦进行快速、处理器友好的实时合成的标准方法是什么?
在此期间我会继续四处寻找。
谢谢!
我在服务器端用 golang 编写了这样一个野兽......对于初学者来说是使用单精度浮点
为了解决 table 人口问题,我会通过合成方波来确保您的实施是可靠的。可视化每个 运行 的输出,因为你给它每个额外的频率(及其相应的振幅和相移参数)......根据定义,只要你正确使用足够的周期来覆盖,一个周期就足够了一个样本的时间段
重要的是要利用以下知识:从输入的一组正弦波(每个都有频率、振幅、相移)生成输出曲线有助于进行反向操作……即对该输出曲线执行 FFT让 api 为您提供基础正弦波的版本(同样每个都有频率、振幅和相位)...这将确认您的系统是准确的
您正在实施的过程的名称是:逆傅里叶变换并且有用于此的库但是我也更喜欢滚动我的拥有
您(或者您可以,不是 iOS 人)增加缓冲区大小吗?可能会给你足够的开销,你不需要这个。否则 yes wave-table synthesis 是一个可行的方法。仅当参数发生变化时,您才能根据所有谐波的总和计算出新的波表。