A. 我已经阅读过技术1号非常占用处理器资源,不太可行。这对于像iPad上的ARM处理器是否成立?
这使得一个简单的问题变得复杂(双关语)。Accelerate.framework提供了这些函数的优化变体(fwiw),但它仍然会使一个简单的问题变得复杂。一般来说:设备上的浮点计算速度很慢。浮点实现可能会显著损害您的程序。这可能会导致功能、多声部或质量方面的妥协。如果不知道需求,很难说您是否可以使用浮点计算。
B. 无论我最终选择哪种技术,通过将低通滤波器连接到振荡器的输出端口可以简单地解决混叠问题吗?
这对于在时间域中生成的信号是行不通的,除非您进行过采样。
C. 如何实现这样的振荡器还有其他建议吗?
请参见下文
D. 建议使用哪个C++工具包?我一直在看CCRMA的STK,但我不知道是否有其他更合适的库。
STK更像是一个教学工具而不是为嵌入式合成器设计的工具包。存在更适合的实现。
选项1:编写一个函数,它接受旋钮位置并计算实际信号的频谱(一组振幅和频率数组),然后使用一堆正弦函数和求和块来实现输出信号。
选项2:与选项1类似,但应用反向傅里叶变换而不是正弦和求和(此时我不确定它们实际上是否相同)。
在桌面上相对较慢。
选项4:从两个锯齿波开始(它们都包含偶次和奇次谐波),反转一个并将它们相加,使用旋钮控制每个波的幅度。 波形不会
您可以通过BLIT非冲突生成来相当高效地完成这项工作。 但是,BLIT仅限于少数波形(您可以将其用于Saw和Square)。 您可以回顾历史并问:“2000年左右的硬件和软件合成器是如何解决这个问题的?” 这是其中一种解决方案,另一种解决方案是:
选项3。为每个可能的旋钮位置生成波形表,并使用波表合成技术生成输出信号。
考虑到设备的能力,我建议使用int实现此操作或BLIT。
该表易于理解和实现,并提供良好的声音和CPU结果。它还可以高度配置以进行CPU /内存/质量权衡。
如果您想要无混叠(或接近无混叠),请选择BLIT(或其相关产品)。原因是您需要大量的内存和足够的过采样才能最小化或不产生可听的混叠。
实施:
有许多在线BLIT(和家族)实现。
这里是一个关于表格的餐巾纸草图:
enum { WF_Sine, WF_Saw, WF_Square, WF_COUNT };
enum { TableSize = SomePowerOfTwo };
struct sc_waveform {
uint32_t at[TableSize];
};
enum { NPitches = Something };
sc_waveform oscs[WF_COUNT][NPitches];
在初始化时,使用加性合成来填充oscs
。
在播放过程中,可以使用以下任一方法:
- 插值和过采样从表格中读取
- 或者对信号进行大量过采样,然后进行下采样(这样CPU效率更高)。
作为参考:我估计在不进行可听的高频分段并且以44.1kHz渲染的情况下,消耗不负责任数量内存的线性插值表格应将您的混叠频率保持在-40 dB或以下。这是一种朴素的蛮力方法!通过稍微努力,您可以做得更好。
最后,如果搜索“矢量合成”,您还应该找到相关信息--您所描述的是其原始形式。