#信号处理 # #合成器 #处理器 #参数 #结构体 #延迟

nightly surge-lag

surge合成器 —— 用于平滑变化的延迟结构体

29次发布

0.2.12-alpha.02023年4月7日
0.2.11-alpha.02022年12月19日
0.2.5-alpha.02022年6月21日
0.2.4-alpha.02022年3月14日
0.1.42-alpha.02021年10月27日

#91 in #合成器

Download history 103/week @ 2024-03-30 50/week @ 2024-04-06 82/week @ 2024-04-13 74/week @ 2024-04-20 59/week @ 2024-04-27 67/week @ 2024-05-04 66/week @ 2024-05-11 66/week @ 2024-05-18 80/week @ 2024-05-25 39/week @ 2024-06-01 265/week @ 2024-06-08 50/week @ 2024-06-15 75/week @ 2024-06-22 15/week @ 2024-06-29 12/week @ 2024-07-06 92/week @ 2024-07-13

每月 200 次下载
25 crates (13 直接) 中使用

GPL-3.0 许可证

145KB
2.5K SLoC

Surge-lag

描述

surge-lag 包是lag处理器的Rust实现。lag处理器的目的是在信号处理链中平滑地过渡到不同的参数值。

Lag 结构体表示lag处理器,它有实例化、设置变化速率、设置起始值和处理输入值的方法。VLag 结构体是Lag的一个变体,它使用VDouble值。

Lag 处理器可以用来创建合成器中不同参数值之间的平滑过渡,例如滤波器的截止频率或振荡器的频率。它也可以用来创建信号渐入渐出的渐变。

实现基于以下方程

y[n] = y[n-1] + rate * (x[n] - y[n-1])

其中 x 是输入信号,y 是输出信号,rate 是变化速率。

令牌

  • Lag:表示lag处理器的结构体。

  • VLag:表示使用VDouble值的lag处理器的结构体。

  • default:创建默认Lag实例的方法。

  • instantize:使用特定起始值初始化Lag实例的方法。

  • set_rate:设置Lag实例变化速率的方法。

  • start_value:设置Lag实例起始值的方法。

  • process:通过Lag实例处理输入值的方法。

  • VDouble:表示使用SIMD操作的双值的结构体。

  • init_x87:使用x87指令初始化具有特定起始值的VLag实例的方法。

  • test_vlag_init_x87:使用x87指令验证VLag实例初始化的测试。

  • test_vlag_instantize:用于验证使用特定起始值初始化VLag实例的测试。

  • test_vlag_process:用于验证通过VLag实例处理输入值的测试。

  • test_vlag_start_value:用于验证设置VLag实例起始值的测试。

  • smoke:用于验证Lag实例基本功能的测试。

  • test_default:用于验证创建默认Lag实例的测试。

  • test_instantize:用于验证使用特定起始值初始化Lag实例的测试。

  • test_process:用于验证通过Lag实例处理输入值的测试。

  • test_set_rate:用于验证设置Lag实例变化率的测试。

  • test_start_value:用于验证设置Lag实例起始值的测试。

107> 这就像是一种具有可变速率的线性插值器,为什么我们使用正弦和余弦函数来实现它呢?

VLag结构体实现中使用正弦和余弦函数与相位概念有关。在本实现中,使用正弦和余弦波的相位来确定延迟时间的分数部分。然后,根据延迟时间的分数部分,在两个连续样本之间使用线性插值来计算延迟时间。

以这种方式使用正弦和余弦函数实际上是在数字信号处理中常见的技术,称为“相位累积”。通过随时间积累相位值,我们可以创建一个连续变化且平滑的变量延迟。这在各种音频处理应用中可能很有用,例如混响、合唱和镶边效果。

108> 能更详细地描述相位累积吗?你能给我展示如何推导延迟时间计算吗?

当然可以!相位累积是许多数字信号处理应用中使用的技术,用于生成或处理具有特定频率的信号。基本思想是跟踪一个随时间增加的相位变量,然后使用这个相位变量来计算每个样本的输出信号的幅度。

在surge-lag crate的上下文中,相位累积用于实现变量延迟线。相位变量与延迟时间成正比,因此通过控制相位积累的速率,我们可以控制延迟时间。

为了推导延迟时间计算,让我们从相位变量φ的定义开始

phi(n) = 2 * pi * f * n * T

其中n是样本索引,T是样本周期,f是我们想要生成的频率。为了得到延迟时间,我们需要用延迟时间d来求解n

n = d / T

将这个代入phi(n)的表达式中,我们得到

phi(d) = 2 * pi * f * d

这是延迟时间d处的相位公式,以弧度为单位。为了计算输出信号的幅度,我们需要取这个相位值的正弦或余弦

y = A * sin(phi(d))

y = A * cos(phi(d))

其中A是输出信号的幅度。通过改变相位积累的速率,我们可以改变延迟时间,从而改变输出信号的频率。

希望这能帮到您!如果您还有其他问题,请告诉我。

109> 谢谢 —— 这些技术是如何应用于创建数字混响、合唱和镶边效果的?还有其他信号处理器可以从这些功能中受益吗?

surge-lag 插件中使用的技巧,尤其是相位累积和线性插值,通常用于数字信号处理算法中,用于创建各种基于时间的效应,包括数字混响、合唱和镶边。

例如,在数字混响中,通过创建声波的多次反射来模拟声音在物理空间中墙壁和其他表面反弹的效果。每次反射都会延迟一定的时间,然后这些延迟的反射与原始声音相加,以创建混响声音。通常使用某种形式的延迟线来实现延迟,例如 Lag 结构在 surge-lag 插件中。

在合唱和镶边效果中,创建多个略微失真的原始声音副本,并将这些副本与原始信号混合在一起,以创建厚重、旋转的声音。失真通常通过引入小的延迟和略微改变延迟副本的相位来实现。这也可以使用具有可变延迟时间的延迟线来实现。

其他可以从这些功能中受益的信号处理器包括基于时间的效应,如回声、延迟和移相器,以及需要相位一致性的振荡器和滤波器。

110> 让我们更详细地描述一些:回声、延迟、移相器,以及需要相位一致性的振荡器和滤波器

当然,我很乐意更详细地描述这些

  1. 回声:回声效果会在定期间隔内重复输入信号的延迟副本。延迟副本通常会被衰减以模拟声音在表面上反射并返回到听众的效果。这个效果可以使用延迟线来创建,这是一种缓冲区,它存储输入信号的一部分,并在指定延迟时间后输出。然后可以将延迟信号与原始信号结合以创建回声效果。

  2. 延迟:延迟效果与回声效果类似,但延迟时间较短,重复次数较少。延迟效果常用于在混音中创建空间和深度感。延迟可以使用延迟线来实现,就像回声效果一样,但具有较短的延迟时间和较少的重复次数。

  3. 移相器:移相器是一种信号处理器,通过组合输入信号的两次延迟副本来创建扫频滤波器效果。第一次副本通过可变全通滤波器传递,它会改变某些频率分量的相位,而第二次副本通过具有不同相位移的全通滤波器传递。然后将两个信号结合在一起,以在处理信号的频率响应中创建一系列峰值和谷值,从而产生特有的移相器效果。

  4. 振荡器:振荡器是生成周期性波形(如正弦波、方波和锯齿波)的电子电路。这些波形可以用来创建各种声音,从简单的音调到复杂的音色。当使用多个振荡器创建多声部声音(如和弦或多声部)时,相位一致性很重要。如果振荡器的相位不同步,可能会产生不希望的相位消除和频率干扰。

  5. 滤波器:滤波器是一种信号处理电路,可以选择性地衰减或增强信号中某些频率成分。滤波器在音频处理中常用,用于调整信号的频率响应,既可以校正不希望的共振,也可以创建特定的音色。需要相位一致性的滤波器,如梳状滤波器或移相器,必须保持输入和输出信号之间的相位关系,以避免不希望的相位消除或频率干扰。这通常通过使用全通滤波器来实现,它不改变信号的幅度而改变其相位,或者通过使用锁相环,同步输入和输出信号的相位。

111> 谢谢——相干性的数学概念是什么?我们如何知道一个系统会表现出相干性问题?

相位一致性指的是信号处理系统的一个属性,即其输出信号的相对相位相对于输入信号保持不变。换句话说,如果一个系统是相干性的,那么输入信号不同组件之间的相位关系在输出信号中也得到保留。

当信号的不同频率成分之间存在相位差异时,系统可能会表现出相干性问题。这可能在使用不同处理路径对不同频段进行处理或使用反馈回路的系统中发生。如果不正确补偿相位移动,输出信号可能会失真,并失去与输入信号的相干性。这可能导致各种不良影响,包括相位消除、梳状滤波和其他会降低信号质量的伪影。

112> 谢谢——你能提供10个可能受益于使用此crate的项目示例吗?

当然,以下是10个可能受益于使用surge-lag的项目示例。

  1. 需要基于时间的效果(如回声、延迟、移相器或颤音)的音频插件和数字音频工作站(DAW)。

  2. 需要其振荡器和滤波器具有相位一致性的合成器软件。

  3. 需要精确事件计时或与外部来源(如MIDI或SMPTE时间码)同步的音乐制作软件。

  4. 需要精确计时音效和音乐的游戏音频引擎。

  5. 需要精确空间化声源的虚拟现实和增强现实软件。

  6. 涉及实时音频处理和操作的互动装置和多媒体表演。

  7. 使用音频分析生成视觉效果的音乐可视化软件。

  8. 需要与其他设备精确计时和同步的音频硬件设备。

  9. 需要精确时间处理的数字信号处理、声学和心理声学的研究项目。

  10. 需要精确计时和同步音频信号的音频相关机器学习项目。

113> 谢谢——你能提供另外10个吗?

当然!以下是另外10个可能从使用surge-lag crate中受益的项目示例。

  1. 需要相位对齐信号进行准确测量的音频分析软件。

  2. 需要保留原始录音相位一致性的音频修复软件。

  3. 实现基于时间的效果(如回声、延迟和合唱)的数字信号处理库。

  4. 使用数字信号处理为虚拟乐器和效果提供支持的音制作软件。

  5. 生成具有复杂音色和动态纹理的声音的音频合成软件。

  6. 处理音频数据进行语音识别或音乐分析的机器学习算法。

  7. 需要3D空间化声音的虚拟现实和增强现实应用。

  8. 音频应用的信号处理硬件,例如混音器、放大器和前级放大器。

  9. 数字信号处理和音频工程教学工具

  10. 利用声音作为用户体验核心部分的数字艺术装置。

114> 好的!其中一些有重叠,但这没关系

没问题,很高兴帮忙!

115> 拉格(Lag)和 VLag 之间有什么区别?

根据您提供的令牌,LagVLag 都代表用于创建基于时间的效果(如回声和混响)的延迟线的结构体。

然而,VLag 似乎是 Lag 的更专业版本,专门为延迟线的线性插值设计,而 Lag 可能使用不同的插值方法或根本不进行插值。

没有看到这些特定包的代码或文档,我无法确定确切的区别,但根据您提供的令牌,VLag 似乎是专门为延迟线线性插值设计的 Lag 的更专业版本。

116> /file surge-lag/src/vlag.rs

VLag 结构体类似于 Lag,但它使用双精度浮点数(f64)而不是单精度浮点数(f32)。它还支持 SSE/AVX 向量化,这意味着滤波器的两个双精度浮点值(vtarget_v)对齐在 16 字节边界上,以方便现代 CPU 的有效处理。

VLag 结构体代表一个可变延迟滤波器,用于通过根据目标值(target_v)和固定延迟系数(VLAG_D_LP)更新当前值(v)来平滑数据流随时间的变化。延迟系数及其倒数(VLAG_D_LPINV)是预定义的常量。

VLag 结构体有四个公共方法(new_valueinstantizestart_valueprocess)以及一些预定义的常量(VLAG_MIN_BWVLAG_D_LPVLAG_D_LPINV),用于控制滤波器的行为。

VLag 结构体在数字音频处理中平滑信号很有用,特别是对于低频内容的信号。它可以用于各种应用,例如在吉他信号上实现颤音效果,或在机器人应用中平滑传感器的输出。

117> /file surge-lag/src/lag.rs

Lag 是一个结构体,提供低通滤波器,用于平滑数据流随时间的变化。它通过根据目标值和固定低通滤波器系数更新当前值来实现这一点,该系数决定了滤波器对目标值变化的响应速度。

该结构体是泛型参数 T 的,必须实现 NumFrom<f32>CloneAddAssign 特性。这使得 Lag 可以与各种数值类型一起使用。

Lag 结构体有几个方法,包括 newset_ratenew_valuestart_valueinstantizeprocessget_target_value。这些方法允许用户初始化和操作滤波器,包括设置低通滤波器系数、设置要平滑到的目标值、根据目标值和滤波器系数更新当前值,以及检索当前的目标值。

此外,Lag 有一个常量布尔值 FIRST_RUN_CHECKS,用于确定是否运行首次检查,以及一个结构体字段 first_run,用于跟踪 Lag 结构体是否是第一次使用。

依赖关系

~11-20MB
~296K SLoC