关于 dsp
DSP 是面向 C/C++ 实时音频处理开发的参考技能,汇集滤波、效果、合成、分析和性能优化资料。适用于实现音频算法与处理循环的开发者,内容按领域拆分为可按需查阅的参考文档。
主要功能
- 01涵盖滤波器与参数平滑
- 02提供延迟、混响和压缩器参考
- 03介绍振荡器与波形合成
- 04涵盖 FFT、检测与音频分析
- 05说明实时线程安全与性能优化
适用场景
- 01在 C/C++ 中实现音频滤波器
- 02开发混响、压缩器或失真效果
- 03构建合成器与波形发生器
- 04优化实时音频处理代码
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ shortwavlabs/ agent-skills --skill dsp安装后在 Claude Code 中输入/dsp确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/analysis.mdeffects.mdfilters.mdsynthesis.mdutilities.md详细介绍
DSP — 音频数字信号处理
这是一份全面的参考资料,介绍如何用 C/C++ 实现实时音频 DSP 算法。内容源自 musicdsp.org 社区档案,涵盖了从业者二十年来积累的知识。
何时使用此技能
- 使用 C/C++ 实现音频滤波器、效果器、合成器或分析器
- 编写
processBlock()、process()或逐样本 DSP 循环 - 设计双二阶滤波器系数、Moog 梯形滤波器或状态变量滤波器
- 构建延迟线、混响器、压缩器、波形整形器或立体声处理器
- 生成带限波形、噪声或包络
- 使用快速数学近似或非正规数防护来优化音频代码
若要精确仿真特定模拟电路(匹配原理图或 SPICE 参考),也请加载 circuit-to-dsp:它会根据测得的误差决定结构、求解器、积分器和采样率;此技能则提供构建模块。
架构
此技能按领域划分为多个参考文件。请阅读与当前任务相关的文件:
| 参考文件 | 涵盖内容 | 阅读时机 |
|---|---|---|
references/filters.md | 双二阶滤波器/RBJ、Moog 梯形滤波器、SVF、FIR、直流阻断、共振峰、参数平滑、分频器 | 实现任何滤波器时 |
references/effects.md | 延迟、混响、压缩器/限制器、移相器/哇音、波形整形/失真、低保真、立体声、卷积 | 实现任何音频效果时 |
references/synthesis.md | 振荡器、带限波形、FM/PM、DSF、噪声、包络、切比雪夫波形整形、LFO | 生成任何声音时 |
references/analysis.md | FFT、DFT、Goertzel、Walsh-Hadamard、包络跟随、节拍检测、LPC、限幅 | 频谱分析、检测 |
references/utilities.md | 快速数学函数(exp、log、sin、sqrt)、插值、裁剪、非正规数、抖动、MIDI 转换、参数映射、基准测试、无锁 FIFO | 性能优化、转换、音频安全 |
实现原则
以下原则适用于所有领域:
采样率无关性
始终根据采样率推导系数。切勿硬编码默认 44.1 kHz 的值。
// Coefficient from frequency and sample rate
float w0 = 2.0f * M_PI * cutoffHz / sampleRate;
防止非正规数
浮点非正规数(接近零的次正规数)会导致 x86 上 CPU 严重停顿。给状态变量加上一个极小的偏移量:
static constexpr float kDenormal = 1e-24f;
// In process loop:
state += kDenormal;
或者,使用清零(flush-to-zero)编译器标志(GCC/Clang 的 -ffast-math),在 CPU 层面处理此问题。
参数平滑
切勿瞬间改变滤波器系数或增益值,否则会产生咔嗒声。使用一阶低通滤波器平滑参数:
// Time-based smoothing coefficient
float a = expf(-2.0f * M_PI / (smoothTimeMs * 0.001f * sampleRate));
// Per sample:
smoothedValue = a * smoothedValue + (1.0f - a) * targetValue;
音频线程安全
处理回调绝不能分配内存、加锁或调用会阻塞的 OS 函数。预先分配所有缓冲区,使用无锁通信更新参数,并避免在热点循环中进行虚函数分派。
双线性变换/预畸变
大多数数字滤波器都通过双线性变换从模拟原型推导而来。其关键映射关系如下:
w0 = 2 * pi * fc / Fs
若要提高高频处的精度,请进行频率预畸变:
wa = 2 * Fs * tan(w0 / 2)
代码约定
此技能中的所有代码示例均使用 C/C++,并遵循以下约定:
- 音频采样使用
float(32 位),系数计算使用double - 使用
sampleRate或sr表示以 Hz 为单位的采样率 - 使用
M_PI表示 pi(为保证可移植性,请定义为#ifndef M_PI ... #endif) - 处理函数接收输入采样并返回输出采样
- 状态变量作为类成员(而非全局变量)
- 除非另有明确说明,所有频率均以 Hz 为单位
评论
支持 Markdown