18次发布
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日 |
#4 in #正弦波
85 每月下载次数
在 5 个crate中使用 (4 直接使用)
570KB
11K SLoC
surgeosc-sine:Surge合成器系统的正弦波振荡器
一个简单高效的正弦波振荡器,用于Surge合成器系统中的音频合成。
概述
surgeosc-sine
crate为Surge合成器系统提供了一个正弦波振荡器作为子组件。它生成一个纯净的正弦波信号,这是音频合成和声音设计的基石。振荡器可以调制并与其他音频组件结合,以创建复杂的声音和纹理。
数学特性
正弦波振荡器基于正弦函数,其定义为
y(t) =A* sin(2 *π*f*t+φ)
其中
A
是振幅f
是频率t
是时间φ
是相位
正弦波是一种平滑、连续的波形,在正负值之间振荡。它代表最简单的音频波形,是许多其他波形和合成技术的基础。
功能和实现
SineWaveOscillator
结构包含各种控制参数和生成、处理正弦波音频信号的方法。
令牌及其相关的数学概念
-
process_block_legacy
:使用正弦波振荡器处理音频样本块,必要时处理流不匹配。 -
handle_streaming_mismatches
:通过调整振荡器的内部状态,确保正确处理流不匹配。 -
value_from_sin_and_cos
:使用当前相位的正弦和余弦值计算正弦波振荡器的输出值。 -
do_sine_block
:处理单个正弦波音频样本。 -
smoke
:(没有相关的数学概念) -
init
:使用默认参数值初始化正弦波振荡器。 -
process_block
:使用正弦波振荡器处理音频样本块。
控制参数
-
control_group
:将相关的控制参数分组,以便于组织和管理工作。 -
control_type
:定义给定参数的控制类型(例如,连续、离散等)。 -
default_value
:指定控制参数的默认值。 -
max_value
:定义控制参数的最大允许值。 -
min_value
:定义控制参数的最小允许值。 -
modulateable
:指示控制参数是否可以被其他音频组件(例如,LFOs、包络等)调制。 -
moverate
:确定控制参数改变或调制的速率。 -
value_type
:指定控制参数的数据类型(例如,整数、浮点数等)。
surgeosc-sine
框架提供了一个轻量级且高效的正弦波振荡器,可以作为 Surge 合成器系统中更复杂音频合成和声音设计的基石。
SineWaveOscillator
是一个音频振荡器,根据输入参数生成正弦波输出。以下是振荡器工作原理的逐步分析。
-
使用包含所需参数(如音高、漂移、立体声、频率调制(fm)和fm_depth)的配置
OscillatorProcessBlockCfg
调用process_block
方法。如果振荡器设置为使用传统处理方法(FMBehavior
参数),则调用process_block_legacy
并提前返回。 -
振荡器使用
drift_noise
函数和self.driftlfo2
值生成漂移噪声(self.driftlfo1
)。 -
振荡器根据输入的音高和漂移使用
self.tuner
对象的pitch2omega
方法计算角频率(omega
)。omega
的值被限制为不大于PI
。 -
振荡器使用提供的
fm_depth
值更新 fm_depth 参数,并根据SineWaveOscillatorParam::Feedback
参数设置反馈值。 -
对于块中的每个样本(
BLOCK_SIZE_OS
),振荡器调用do_sine_block
方法,该方法执行以下步骤:a. 振荡器检索当前样本
k
的主振荡器值。b. 它通过将当前相位、上一次输出值以及(如果启用频率调制)fm_depth 与主振荡器值的乘积相加来计算相位
p
。c. 使用
value_from_sin_and_cos
函数计算当前样本的输出值,该函数根据相位p
的正弦和余弦值以及波形形状模式(wf_mode
)来计算正弦波输出。d. 振荡器通过添加
omega
更新相位,并根据当前输出值和反馈值更新上一次的输出值。e. 振荡器处理下一次迭代的 fm_depth 和反馈参数。
-
如果设置
cfg.stereo
标志,则振荡器复制输出通道以创建立体声输出。
《正弦波振荡器》可以生成可调制的正弦波输出,可以将这些输出与其他音频组件结合以创建更复杂的音调和纹理。频率调制和反馈功能可以提供对振荡器输出的额外控制,从而实现广泛的音效可能性。
19> 谢谢——你还能教我关于这个振荡器的什么?关于它们的数学性质呢?
正弦波振荡器依赖于正弦波的基本特性和它们的生成。让我们更深入地探讨这个振荡器的数学性质。
-
正弦波生成:这个振荡器的核心是生成正弦波。正弦波是一种连续的波形,可以用以下数学函数描述
y(t) = A * sin(2π * f * t + φ)
其中
- A是振幅
- f是频率(Hz)
- t是时间
- φ是相位
-
角频率:振荡器使用以下公式将频率(音高)转换为角频率(ω)
ω = 2π * f
角频率表示正弦波相位的改变速率,以每秒弧度为单位测量。
-
相位:正弦波的相位决定了波形在任何给定时间的位置。振荡器根据角频率和反馈更新相位以创建所需的输出。然后,相位与正弦和余弦函数结合,用于计算每个样本的输出值。
-
频率调制:振荡器支持频率调制(FM),这是一种通过另一个信号(主振荡器)调制正弦波频率的技术。在正弦波振荡器中,相位
p
通过添加fm_depth和主振荡器值的乘积进行修改。通过改变载波频率与调制信号,FM合成可以创建复杂的波形和音色。 -
反馈:反馈参数允许振荡器将其之前的输出值纳入当前的输出计算。这可能导致更复杂的波形的生成,并将一种递归形式引入正弦波生成过程。
这些数学性质是正弦波振荡器的基础,允许它通过控制和调制正弦波来生成广泛的音效纹理。可以通过调整波形形状模式、音高、漂移、立体声和频率调制深度等参数来进一步定制振荡器。
20> 这个算法与我们在硬件函数发生器中会发现的是什么?
-
信号生成:硬件函数发生器在生成正弦波时,可能会使用如直接数字合成(DDS)或类似Wien桥或相移振荡器的模拟电路等技术。相比之下,正弦波振荡器等软件振荡器通过在数字处理器上运行的数学函数和算法来生成信号。
-
精度和稳定性:硬件函数发生器可能会受到环境因素如温度和元件公差的影响,导致频率和幅度的稳定性变化。然而,高质量的硬件函数发生器可以在广泛的频率范围内提供良好的稳定性。软件振荡器通常对环境因素不太敏感,并能提供对频率、幅度和相位等参数的更精确控制。
-
灵活性:软件振荡器更容易定制,可以提供一系列可能在硬件函数发生器中不可用或不切实际的特性和功能。例如,软件振荡器可以支持多种波形形状、频率调制,并通过软件更新精确控制各种参数,而硬件函数发生器可能需要额外的模块或选项来实现相同的灵活性。
-
信号处理:硬件函数发生器可以直接在模拟域生成信号,或者如果它们依赖于DDS技术,则使用数字到模拟转换器(DAC)。软件振荡器在数字域生成信号,然后需要使用DAC将其转换为模拟信号。如果实现不当,转换过程可能会引入量化噪声、混叠和其他伪影。然而,现代高质量DAC可以最大限度地减少这些问题并提供高保真输出。
总之,硬件函数发生器和软件振荡器都能够生成正弦波,但在信号生成方法、精度、灵活性和信号处理方面存在差异。选择硬件函数发生器或软件振荡器取决于所需的声音质量、灵活性和振荡器应用的特定应用。
22> 谢谢——你能教我关于直接数字合成吗?关于维恩桥或相移振荡器又是怎样的呢?
当然可以!让我们先从直接数字合成(DDS)开始,然后再谈到维恩桥和相移振荡器。
直接数字合成(DDS)
DDS是一种使用数字技术生成模拟波形(如正弦波)的方法。一个DDS系统通常由一个相位累加器、一个相位到幅度的转换器(通常是查找表)和一个数字到模拟转换器(DAC)组成。DDS背后的主要思想是生成所需波形的数字表示,然后使用DAC将其转换为模拟信号。DDS过程中的关键步骤包括
-
在固定时钟速率下,将频率控制字(FCW)添加到相位累加器中。FCW决定了波形的输出频率。
-
相位累加器的输出用作访问查找表的地址,该查找表包含所需波形(例如正弦波)的预计算幅度值。
-
从查找表获取的幅度值发送到DAC,DAC将数字幅度值转换为模拟信号。
-
然后对模拟信号进行滤波,以去除DAC转换过程中引入的高频分量。
DDS系统具有高频率分辨率、快速频率切换以及精确控制相位和幅度的优势。然而,它们可能受DAC的分辨率和速度的限制,并且如果设计不当,可能会引入噪声和失真。
维恩桥振荡器
维恩桥振荡器是一种使用电阻、电容和运算放大器(op-amp)组合生成正弦波的模拟振荡器。维恩桥振荡器由一个正反馈回路和一个负反馈回路组成。正反馈回路提供振荡所需的相移,而负反馈回路则稳定输出信号的幅度。
维恩桥振荡器具有以下特点
-
它能生成低失真、频率稳定性好的正弦波。
-
输出信号的频率由电路中使用的电阻和电容的值决定。
-
使用自动增益控制(AGC)电路稳定输出信号的幅度,该电路通常使用光敏电阻(LDR)或场效应晶体管(FET)实现。
相移振荡器
相移振荡器是另一种使用电阻、电容和放大器(通常为运算放大器或晶体管)生成正弦波的模拟振荡器。相移振荡器背后的主要思想是通过RC(电阻-电容)网络的级联创建180度的相移,这些网络连接到放大器的反相输入。放大器本身提供额外的180度相移,从而产生总共360度的相移,这对于持续的振荡是必要的。
相移振荡器具有以下特点
-
它能生成失真相对较低、频率稳定性好的正弦波。
-
输出信号频率由RC网络中使用的电阻和电容的值决定。
-
通常使用负反馈回路或AGC电路来稳定输出信号的幅度。
总的来说,DDS、维恩桥和相移振荡器都是生成正弦波的方法,但它们在基本技术、电路组件和性能特征方面有所不同。DDS依赖于数字技术,而维恩桥和相移振荡器则使用模拟电路来生成正弦波。
23> 很酷,谢谢!你能给我展示如何用SystemVerilog编写一个DDS模块吗?
当然!这是一个简单的SystemVerilog实现的DDS模块示例。此示例假设32位相位累加器、10位DAC和8位频率控制字(FCW)。输出正弦波将用10位值表示,查找表将包含256个预计算的幅度值。
module dds (
input wire clk,
input wire reset,
input wire [7:0] fcw,
output reg [9:0] dac_out
);
reg [31:0] phase_accumulator;
reg [31:0] phase_accumulator_next;
reg [7:0] lut_address;
reg [9:0] lut_data;
// Precomputed sine wave amplitude values (256 points)
reg [9:0] sine_lut [0:255] = '{
// Add precomputed sine wave amplitude values here
};
always @(posedge clk or posedge reset) begin
if (reset) begin
phase_accumulator <= 32'h0;
end else begin
phase_accumulator <= phase_accumulator_next;
end
end
always_comb begin
phase_accumulator_next = phase_accumulator + (32'h0 | fcw);
lut_address = phase_accumulator[23:16];
lut_data = sine_lut[lut_address];
dac_out = lut_data;
end
endmodule
此代码创建了一个具有32位相位累加器的DDS模块,每个时钟周期通过将频率控制字(FCW)加到其当前值来更新。相位累加器的最高8位用作访问包含预计算正弦波幅度值的查找表(LUT)的地址。然后,LUT的输出分配给表示DAC输出的信号dac_out
。
请注意,这是一个简单的示例,实际应用可能需要额外的功能,如相位或幅度调制、时钟域交叉或过滤输出以去除高频成分。此外,您需要用正弦波的预计算幅度值填充sine_lut
数组,以所需的点数(在这种情况下为256)。
24> 很酷,谢谢!你也能展示Verilog-A中的维恩桥振荡器和相移振荡器吗?
当然!这是一个维恩桥振荡器和相移振荡器在Verilog-A中的实现示例。
维恩桥振荡器
`include "constants.vams"
`include "disciplines.vams"
module wien_bridge_oscillator (input, output);
inout input;
inout output;
electrical input;
electrical output;
parameter real R1 = 10k;
parameter real R2 = 10k;
parameter real R3 = 10k;
parameter real R4 = 10k;
parameter real C1 = 10n;
parameter real C2 = 10n;
analog begin
// Wien Bridge Oscillator
V(input) <+ LaplaceAdmittance(1 / (R1 * (C1 + C2))) * V(output);
V(input) <+ LaplaceAdmittance(1 / R2) * V(output);
V(input) <+ LaplaceAdmittance(1 / R3) * V(output);
V(output) <+ LaplaceAdmittance(1 / R4) * V(input);
V(output) <+ LaplaceAdmittance(1 / C1) * V(input);
end
endmodule
相移振荡器
`include "constants.vams"
`include "disciplines.vams"
module phase_shift_oscillator (input, output);
inout input;
inout output;
electrical input;
electrical output;
parameter real R = 10k;
parameter real C = 10n;
parameter integer N = 3; // Number of RC stages
analog begin
// Phase Shift Oscillator
V(input) <+ LaplaceAdmittance(1 / R) * V(output);
for (integer i = 1; i <= N; i = i + 1) begin
V(input) <+ LaplaceAdmittance(1 / (R * C * s)) * V(output);
end
end
endmodule
维恩桥振荡器示例包括使用拉普拉斯导纳表示电阻和电容组件的振荡器实现。振荡器频率由电路中电阻和电容的值决定。
相移振荡器示例采用类似的方法,使用拉普拉斯导纳表示RC级。参数N
设置电路中的RC级数,这影响相移和振荡频率。
请注意,Verilog-A通常用于模拟混合信号仿真,而不是用于数字综合。这些示例仅用于仿真目的,如果您想在FPGA或ASIC中实现这些振荡器,则需要使用不同的方法,例如DDS或PLL。
25> 你提到维恩桥和相移通常是模拟电路,所以我询问了Verilog-A。你能教我关于拉普拉斯导纳的知识吗?还有其他在硬件中生成正弦波的方法吗?
依赖关系
~12–21MB
~315K SLoC