10个版本
0.2.12-alpha.0 | 2023年4月7日 |
---|---|
0.2.11-alpha.0 | 2022年12月19日 |
0.2.5-alpha.0 | 2022年6月21日 |
0.2.4-alpha.0 | 2022年3月14日 |
0.1.42-alpha.0 | 2021年10月27日 |
#15 in #非线性
267 每月下载量
用于 surge-synthesizer
430KB
9K SLoC
surgefilter-nlstates
NonlinearStatesFilter是一个Rust模块,实现了一个非线性反馈滤波器,可用于各种音频信号处理应用。该模块提供了使用音频EQ菜谱方法计算滤波器系数的功能,以及不同类型的滤波器级饱和器。滤波器级本身使用直接形式I拓扑结构实现,这是数字滤波器实现中常见的结构。
可以使用clamped_frequency
函数调整滤波器的截止频率,该函数确保频率保持在一定范围内,以防止不稳定的行为。
总的来说,NonlinearStatesFilter提供了在Rust中实现非线性反馈滤波器的灵活且可定制的解决方案,支持不同类型的滤波器和饱和器。
<coeff_make>
NonlinearStatesFilter中的coeff_make
函数使用音频EQ菜谱方法计算滤波器系数。这包括确定滤波器的共振(reso
)和频率(freq
),然后使用以下公式计算不同的系数
q = (reso ^ 3) * 18.0 + 0.1
w0 = 2 * π * freq / sr
sin(w0) = wsin
cos(w0) = wcos
alpha = wsin / (2 * q)
a0 = 1 / (1 + alpha)
a1 = -2 * wcos * a0
a2 = (1 - alpha) * a0
b0 = (1 - cos(w0)) * a0 / 2
b1 = (1 - cos(w0)) * a0
b2 = (1 - cos(w0)) * a0 / 2
结果系数用于直接形式I拓扑结构以实现滤波器。
<clamped_frequency>
在非线性状态滤波器(NonlinearStatesFilter)中,clamped_frequency
函数确保截止频率保持在一定范围内,以防止不稳定行为。该函数接收一个音高值,并使用 TunerHandle 将其转换为频率值。然后将频率限制在 5 Hz 到采样率的 30% 之间,并将其作为输出返回。该函数使用以下公式从音高计算频率:
freq = n2p(pitch + 69) * MIDI_0_FREQ
<process_quad>
在非线性状态滤波器中,process_quad
函数实现了直接形式 I(Direct Form I)拓扑,用于通过非线性反馈滤波器处理输入数据的单个样本。该函数接收一个四阶滤波单元状态和一个输入值,并返回该输入值的滤波器输出。该函数应用不同类型的饱和器,并使用 coeff_make
函数计算每个阶段的滤波器系数。直接形式 I 拓扑使用一组 z-1 状态寄存器和系数寄存器,这些寄存器在滤波器的每个阶段都会更新。
test_process_quad_allpass
函数是 process_quad
的别名,区别在于它针对全通滤波器类型进行了优化。这允许更有效地实现全通滤波器,其系数计算比其他滤波器类型更简单。
test_process_quad_allpass_complex
函数是 process_quad
的别名,区别在于它针对复数全通滤波器类型进行了优化。这允许更有效地实现复数全通滤波器,它使用复数系数。
test_process_quad_bandpass
函数是 process_quad
的别名,区别在于它针对带通滤波器类型进行了优化。
52> 什么是直接形式 I 拓扑?
直接形式 I 是实现数字滤波器的一种常见拓扑。它是一种转置的直接形式滤波器结构,这意味着它是从标准直接形式滤波器结构导出的。
直接形式 I 拓扑表示一个递归滤波器,使用一系列加法和乘法操作。它由一组延迟元件或“z^-1”块组成,代表输入信号的延迟,以及一组“b”和“a”系数块,用于实现滤波器传递函数。
直接形式 I 中数字滤波器的传递函数可以用数学公式表示为:
Y(z) = b0*X(z) + b1*X(z^-1) + b2*X(z^-2) - a1*Y(z^-1) - a2*Y(z^-2)
其中 X(z) 和 Y(z) 分别表示输入和输出信号,b0, b1, b2, a1 和 a2 是滤波器系数。
直接形式 I 拓扑是一种相对简单且高效的递归滤波器实现方法,但它对系数量化误差敏感,并且由于其数值稳定性问题,不适合实现高阶滤波器。
53> 是否有其他相关拓扑?这个拓扑有什么缺点?
是的,有几种其他拓扑可以用于实现数字滤波器。其中最常用的是直接形式 II 和转置直接形式 II。
直接形式 II 与直接形式 I 类似,但操作顺序不同。在直接形式 II 中,输入首先被馈送到一组反馈延迟中,然后反馈系数应用于这些延迟值。反馈部分的输出然后被馈送到一组前馈延迟中,前馈系数应用于这些延迟值以产生最终输出。由于直接形式 II 对于高阶滤波器具有更好的数值稳定性,因此通常比直接形式 I 更受欢迎。
转置直接形式II与直接形式II类似,但操作顺序相反。在转置直接形式II中,前馈和反馈部分交换位置,使得输入首先进入前馈部分,然后进入反馈部分。与直接形式II类似,转置直接形式II对于高阶滤波器可能比直接形式I具有更高的数值稳定性。
直接形式I的一个潜在缺点是,它可能不如其他拓扑结构对于高阶滤波器的数值稳定性。这是因为反馈系数在输入信号延迟之前应用于输入信号,这可能导致大型的中间值,从而引发数值问题。此外,直接形式I所需的延迟时间是直接形式II或转置直接形式II的两倍,这会增加内存需求。然而,对于低阶滤波器,直接形式I可以是一种简单且高效实现数字滤波器的方法。
能否为我列出所列拓扑的优缺点清单?如果还有其他有趣的拓扑,请随意添加更多行。
当然!以下是直接形式I、II和转置直接形式II拓扑优缺点的比较清单
直接形式I
- 优点
- 简单且易于实现
- 计算成本较低
- 缺点
-
数值噪声放大
-
与其他结构相比,需要更多的内存
-
可能表现出溢出和极限循环问题
-
直接形式II
-
优点
-
比直接形式I具有更低的数值噪声放大
-
可以比直接形式I使用更少的内存元素
-
-
缺点
-
比直接形式I需要更多的计算资源
-
可能不如直接形式I稳定
-
直接形式II转置
-
优点
-
与直接形式I和直接形式II相比,噪声地板可能更低
-
三种结构中使用内存最少
-
-
缺点
-
可能比直接形式I和直接形式II更难实现
-
比直接形式I需要更多的计算
-
级联形式
- 优点
- 稳定且稳健
- 比直接形式I和直接形式II具有更低的数值噪声放大
- 缺点
-
计算成本比直接形式I和直接形式II高
-
比其他结构更难实现和优化
-
并行形式
-
优点
- 计算成本较低
- 可以通过多个级联二阶滤波器阶段实现以提高精度
-
缺点
- 数值噪声放大
- 比直接形式I和直接形式II更复杂
56> 谢谢--在使用此工具包时还应考虑哪些事项?它与 surgefilter-nlfeedback 有何不同?
以下是使用 surgefilter-nlstates
时应考虑的一些事项
-
该工具包提供了一种使用直接形式I拓扑的非线性状态变量滤波器(NSLVF)的实现。
-
NSLVF 是一种可以添加反馈回路到基本状态变量滤波器结构以创建非线性失真效果的滤波器类型。
-
滤波器系数使用与
surgefilter-nlfeedback
相同的算法计算,但这两个工具包使用不同的滤波器拓扑。 -
该工具包针对现代处理器的性能进行了优化,并利用 SIMD 指令并行处理多个样本。
-
该滤波器可用于各种不同的应用,包括音频处理、图像处理等。
与提供类似滤波器实现但使用不同拓扑的 surgefilter-nlfeedback
相比,surgefilter-nlstates
既有优点也有缺点。
优点
-
surgefilter-nlstates
中使用的直接形式I拓扑通常比surgefilter-nlfeedback
中使用的直接形式II拓扑更高效。 -
surgefilter-nlstates
针对现代处理器的性能进行了优化,并利用SIMD指令并行处理多个样本。
缺点
-
surgefilter-nlstates
中使用的直接形式I拓扑结构,相比surgefilter-nlfeedback
中使用的直接形式II拓扑结构,更容易出现数值不稳定性。 -
surgefilter-nlstates
提供的滤波器类型范围不如surgefilter-nlfeedback
广泛。例如,surgefilter-nlfeedback
包括梳状滤波器和状态变量滤波器,这些在surgefilter-nlstates
中不可用。
依赖关系
~12-21MB
~299K SLoC