我一直在研究接近完成的物理建模弦乐(例如吉他/钢琴)合成器。它基于谐振带通的模态阵列,其中每个带通由 Q 和频率设置为给定的谐振模式/部分。
基本架构可以用这个简化图来概括(实际上会有 50-100 多个带通):
总而言之,将激励信号(例如脉冲)馈入谐振带通阵列。它们的输出相加。为了模拟外部阻尼效应,例如来自乐器主体或手使琴弦静音(手掌静音),从每个带通的输入中减去先前样本总和输出的过滤或分级样本,以相应地对其进行阻尼。
从音乐的角度来看,这是可行的。然而,反馈阻尼环路在激进的阻尼设置下将更高频率的带通推向过载。这可以通过增加采样率来解决,但这在计算上是不可行的。
通常,如果从相对于采样率的某个频率以上的输入中减去其先前采样输出的很大一部分,则谐振带通具有我已确定的行为,它们将自振荡或过载。
这可以通过在具有脉冲激励器的类似阻尼反馈回路中设置单个谐振带通来证明。粗略地说,如果我没记错的话,在大约 48 kHz 采样时,如果您从高于 ~8 kHz 的输入中减去其 z_1 输出的 100%,则带通将过载。将采样率提高到 96 kHz 会将过载阈值提高到 ~17 kHz。
我认为这是因为在更高的频率下,一个样本和下一个样本之间的幅度差异变得更加显着,并且在某个点变得如此显着以至于差异本身可以开始驱动带通。
问题是除了将采样率提高到典型的 44.1 kHz 或 48 kHz 的 4 倍或 8 倍之外,我没有看到明显的解决方案,这对于如此复杂的合成器来说变得非常昂贵。
使用单个带通和分段阻尼环路实际上很容易做一个简单的方法来测试在什么频率截止处开始过载。然后您可以限制您允许在该频率减去的分数。例如。在 9 kHz 时,最多可以减去先前样本输入的 80%。在 11 kHz 时,最多可以减去先前样本输入的 30%。您可以像这样构建一个简单的表来保护带通。
问题是因为我在反馈回路中使用了许多带通的总输出,所以行为似乎不太可预测。这取决于阵列中的带通数量和正在播放的音符,因为它们都有听起来不同的参数。此外,当您处理过滤后的反馈回路时,实际上不可能量化在任何给定频率下减去多少(计算在每个频带通减去多少与只是过采样一样多的 CPU 成本) .
据我所知,我基本上坚持将过采样作为我唯一的解决方案。最后一种选择是将其切换到像这样的过滤延迟循环架构(Karplus Strong)(其中延迟为 1/noteFrequency):
这种类型的架构似乎不具备自振荡能力,因为它实际上取决于每个样本输入的先前样本的输出。如果你完全减去它(完全阻尼),它只会杀死循环。无论您多么积极地对其进行阻尼或将其设置为什么频率,它都不会过载。这种架构的问题在于它在你可以获得的合成质量方面存在巨大缺陷。因此,它只是将一组问题(CPU 限制)换成另一个不利的(坏声音)。
所以我认为我基本上坚持以增加采样率作为解决方案。我只是好奇是否有人知道或可以想到这个问题的另一种解决方案。或者,如果我认为这是唯一实用的解决方案是正确的,那么我就不会再浪费时间去想另一个不存在的解决方案了。
谢谢。