连续波形音频合成器
我开始写一个具有独特特性的软合成器:振荡器将有一个“连续波形”旋钮,可以让用户连续选择正弦波,方波和锯齿波。 也就是说,如果旋钮一直到左边,则输出将是正弦波,如果它在中间则是锯齿波,如果一直到右边,它将是方波然后中间位置将输出经典波的“内插”版本的波。 - 波形的旋钮位置和类型可以改变,但需要连续改变波形的方式 -
我想到了几种实现振荡器的方法:
提出一个函数,该函数获取旋钮位置并计算实际信号(幅度和频率数组)的频谱,然后使用一堆正弦函数和一个和块来实现输出信号。
类似于1,但应用反向傅立叶变换而不是正弦和求和(好吧,在这一点上,我不确定它们是否实际上是相同的东西。)
为每个可能的旋钮位置生成波形表,并使用波表合成技术生成输出信号。
从2个锯齿波开始(它们包含偶数和奇数次谐波),反转一个并对它们进行求和,并用旋钮控制每个波形的幅度。 波形将不会
我有几个问题:
答:我已经读过第1号技术是处理器密集型的,并且不可行。 这对ARM处理器(例如iPad上的处理器)是否适用?
B.无论我最终选择何种技术,仅通过将低通滤波器连接到振荡器的输出就可以解决混叠问题?
C.关于如何实现这种振荡器的任何其他建议?
D.任何有关使用C ++工具包的建议? 我一直在看CCRMA的STK,但我不知道是否还有其他更合适的库。
祝我好运! ;)
编辑:昨晚有人指着我喧哗。 贝塞尔曲线是另一个需要考虑的选项。
我不确定你是不是太过复杂了。 如果我理解正确,那么使用连续波形旋钮所做的所有操作都可以将不同数量的3个波形有效地混合在一起。 因此,一直生成所有3个波形,然后根据您所描述的波形混合将它们汇总在一起,获得不同的增益。
对于频带有限的波形合成来避免混叠,你可能会在这里找到你需要的大部分。
希望有所帮助。
这里有一个B的答案(混淆的问题可以简单地通过将低通滤波器连接到输出来解决),它触及其他一些点。
不幸的是,答案是'不'。 混叠是由于奈奎斯特频率以上的谐波频率(即采样率的一半)所引起的。如果这些谐波存在于您的振荡器波形中,则滤波功能无法提供帮助。 (适当的积极过滤会摧毁你产生的波浪的特征。)过采样(另一个答案提到这一点)可以,但它很昂贵。
为了避免这种情况,您必须生成“带限”波形。 也就是说,在某些选定值<奈奎斯特之上没有谐波的波形。 这样做并不重要。 这里的这篇文章值得一读。 有两种建立的,实用的方法来解决这个问题:BLIT(带限脉冲串)和MinBLEPs。 这两种方法都试图通过在波形中的适当点处插入“填充物”来消除谐波产生的不连续性。
考虑到这一点,你的选择开始缩小。 可能是轻松和声音之间的最佳折衷方案是生成一系列乐队有限的波表。 不过,您仍然需要研究某种形式的抗锯齿来处理插值波。
iDevice ARM能够实时完成DSP。 一般建议:编写严格的代码,使用内联函数并避免划分。 你的渲染循环将被称为每秒44,100次,所以,只要你的代码在1/44100秒(0.023ms)内完成,你就没有问题了。 在实践中,您应该可以同时运行多个振荡器,而不会出现任何问题。 应用商店中所有这些音乐应用程序的存在都证明了这一点。
STK是一个很棒的介绍库。 (Perry Cook的书“交互式应用程序的实时音频合成”也是一个很好的基础,值得一读。)虽然STK故意没有进行优化,但我不确定它有多适合生成“连续”波形。 kvraudio.com和musicdsp.org应该在你的阅读清单上。
傅立叶变换是线性的,所以采用例如正方形和锯齿波的FFT并且将每个谐波线性交叉淡入淡出,然后通过iFFT或求和正弦将其带回到时域,应该给出与仅仅交叉淡入锯的完全相同的输出,方形信号直接。 我不确定这是否是你想要做的,但如果不需要做FFT或计算中间表。
在波形之间有许多其他平滑“衰落”的方式 - 例如,可以使用相位失真,例如,由从生成方形的位置移动到生成锯的位置的线性段组成的失真曲线。 这可能非常难以以固有的带宽限制方式实现。
实际上,别名通常可以使用过采样和过滤来解决,或者只是过滤。 使用带宽限制技术会更好,因为混叠总是会造成一些噪音,但是您经常可以将其过滤得足够低以至于无法听到,这对音频合成至关重要。
链接地址: http://www.djcxy.com/p/33833.html