颤音(Vibrato)是音乐表现力的灵魂——它是音高的周期性微小波动,让声音更加生动和富有表情。本课实现LFO调制频率的颤音效果,理解FM(频率调制)的基础原理。
颤音是音高的周期性波动,通常速率约5-7Hz(每秒5-7次波动),幅度约±半音。它模拟了弦乐演奏者手指在弦上揉动的效果。
容易混淆的两个概念:
| 效果 | 调制对象 | 参数 | 听感 |
|---|---|---|---|
| 颤音(Vibrato) | 音高/频率 | 速率5-7Hz,深度±半音 | 声音"颤抖",更有表情 |
| 震音(Tremolo) | 音量/振幅 | 速率3-10Hz,深度可变 | 声音"摇摆",像旋转扬声器 |
关键区别:颤音调制频率,震音调制振幅。两者的硬件实现结构相似,但调制目标不同。
颤音的核心是LFO(Low Frequency Oscillator)——一个频率很低的振荡器,用于调制主信号参数。
颤音是最简单的频率调制(FM):
f_out(t) = f_base + depth × lfo(t)
其中lfo(t)是LFO输出,范围-1到+1。当depth适当小时,这产生悦耳的颤音;depth增大时变成FM合成的音色变化效果。
| 速率 | 深度 | 效果 | 音乐风格 |
|---|---|---|---|
| 5-6Hz | ±10cents | 自然颤音 | 古典弦乐 |
| 5-6Hz | ±半音 | 明显颤音 | 流行唱法 |
| 3Hz | ±全音 | 深度颤音 | 蓝调吉他 |
| 6-8Hz | ±2半音 | 快速颤音 | 民间音乐 |
| 0.5Hz | ±5半音 | 缓慢滑音 | 电子音乐 |
NES 2A03没有专门的颤音功能,但作曲家通过以下技巧实现:
模块由LFO和调制器两部分组成:
表情大师 — 掌握LFO调制原理,实现颤音效果,理解频率调制的基础,区分颤音与震音!
// vibrato.v - 颤音效果模块
// 用LFO调制频率产生颤音效果
module vibrato #(
parameter PHASE_BITS = 32,
parameter MOD_DEPTH_BITS = 12,
parameter CLK_FREQ = 50000000
)(
input wire clk,
input wire rst_n,
input wire [PHASE_BITS-1:0] base_freq, // 基础频率调谐字
input wire [PHASE_BITS-1:0] lfo_freq, // LFO频率调谐字
input wire [MOD_DEPTH_BITS-1:0] depth, // 调制深度
input wire enable,
output wire [PHASE_BITS-1:0] modulated_freq // 调制后频率
);
// LFO(低频振荡器)产生调制信号
reg [PHASE_BITS-1:0] lfo_phase;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
lfo_phase <= {PHASE_BITS{1'b0}};
else if (enable)
lfo_phase <= lfo_phase + lfo_freq;
end
// 从LFO相位提取调制信号(正弦近似用三角波代替)
// 取LFO相位高位作为调制幅度
wire [11:0] lfo_raw = lfo_phase[31:20];
// 将0-4095映射为-2048到+2047(有符号)
wire signed [MOD_DEPTH_BITS-1:0] lfo_signed;
assign lfo_signed = $signed({1'b0, lfo_raw}) - $signed({1'b0, 12'd2048});
// 应用调制深度
wire signed [MOD_DEPTH_BITS+1:0] mod_signal;
assign mod_signal = lfo_signed * $signed({1'b0, depth});
// 频率调制:base_freq + mod_signal
// 需要确保结果为正数
wire signed [PHASE_BITS:0] freq_signed;
assign freq_signed = $signed({1'b0, base_freq}) + mod_signal;
assign modulated_freq = (enable && freq_signed[PHASE_BITS-1:0] > 0) ?
freq_signed[PHASE_BITS-1:0] : base_freq;
endmodule
✅ Verilator验证通过
LFO波形不仅影响颤音的"手感",还影响调制产生的边带频谱:
| LFO波形 | 调制特征 | 边带频谱 | 听感 |
|---|---|---|---|
| 正弦波 | 平滑周期调制 | 规则边带 | 自然、温暖 |
| 三角波 | 线性调制 | 稍有不同 | 较硬、有棱角 |
| 锯齿波 | 单方向调制 | 不对称边带 | 特殊、滑行感 |
| 方波 | 两值切换 | 两个频率交替 | Trill颤音 |
| S&H | 随机阶梯 | 随机频移 | 科幻、不稳定 |
弦乐演奏者在开始一个音后通常不会立即使用颤音——而是先稳定地演奏一小段时间,然后逐渐加入颤音。这叫延迟颤音:
// 延迟颤音实现
reg [15:0] vib_delay_counter;
reg vibrato_active;
always @(posedge clk) begin
if (note_trigger) begin
vib_delay_counter <= VIB_DELAY; // 约500ms
vibrato_active <= 1'b0;
end else if (vib_delay_counter > 0) begin
vib_delay_counter <= vib_delay_counter - 1;
end else begin
vibrato_active <= 1'b1;
end
end
// 颤音深度渐入
wire [11:0] effective_depth = vibrato_active ? depth : 12'd0;
// 更平滑的版本:用渐变代替突然开启
颤音和FM合成本质上是同一种操作——频率调制。区别只是参数范围:
| 参数 | 颤音 | FM合成 |
|---|---|---|
| 调制频率 | 5-7Hz | 20Hz-5kHz |
| 调制深度 | ±半音 | ±几个八度 |
| 目的 | 表现力 | 音色设计 |
| 边带 | 不可闻 | 丰富可闻 |
理解这种统一性很重要——当你增大颤音的深度和速率时,它逐渐"变成"FM合成!这是从音调控制到音色设计的连续光谱。
LFO可以与节拍时钟同步,使效果与音乐节奏对齐:
// 自由运行LFO
lfo_phase <= lfo_phase + lfo_freq; // 独立频率
// 同步LFO(与节拍对齐)
// 每个新音符重置LFO相位
if (note_trigger)
lfo_phase <= 0; // 从头开始
else
lfo_phase <= lfo_phase + lfo_freq;
// 节拍同步LFO
// LFO频率 = BPM的分数或倍数
lfo_freq_for_1_bar = freq_per_beat / 4; // 1小节1个LFO周期
lfo_freq_for_half_beat = freq_per_beat * 2; // 半拍1个周期
LFO可以调制多个参数,形成调制矩阵:
| LFO→目标 | 效果名称 | 速率 | 深度 |
|---|---|---|---|
| LFO→频率 | 颤音(Vibrato) | 5-7Hz | ±半音 |
| LFO→音量 | 震音(Tremolo) | 3-10Hz | ±6dB |
| LFO→滤波截止 | 哇音(Wah) | 1-5Hz | ±2倍频 |
| LFO→占空比 | 脉宽调制(PWM) | 0.5-5Hz | ±25% |
| LFO→FM调制指数 | 动态FM | 0.1-2Hz | ±50% |
不同乐器风格需要不同的颤音参数:
| 乐器风格 | 速率(Hz) | 深度(半音) | 延迟(ms) | 波形 |
|---|---|---|---|---|
| 古典弦乐 | 5.5 | ±0.3 | 300 | 正弦 |
| 流行唱法 | 6.0 | ±0.5 | 200 | 正弦 |
| 民间音乐 | 7.0 | ±1.0 | 100 | 正弦 |
| 电子领奏 | 5.0 | ±0.5 | 0 | 三角 |
| 芯片方波 | 4.0 | ±0.3 | 0 | 方波(trill) |
| 科幻效果 | 0.5 | ±3.0 | 0 | S&H |
芯片音乐的颤音通常比真实乐器更快、更深,因为8位音色本身就不需要"自然"——夸张一点反而更有风格。
逐步调整颤音参数,找到最佳设置:
// 实验步骤:
// 1. 设置基础频率(A4=440Hz)
// 2. 开启颤音,速率=0Hz(I=0) → 纯正弦波
// 3. 逐步增加速率:1Hz→3Hz→5Hz→7Hz→10Hz
// 4. 在5Hz时,逐步增加深度:0→±0.5半音→±1半音→±2半音
// 5. 记录每种设置的主观听感
// 预期结果:
// I=0: 纯音,无颤音
// I=1,5Hz: 微弱波动,自然
// I=3,5Hz: 明显颤音,温暖
// I=5,5Hz: 强烈颤音,戏剧性
// I=10,5Hz: 极端颤音,警笛效果
// I=5,10Hz: 快速颤音,紧张