dsp について
DSPは、C/C++でリアルタイム音声処理を実装するためのリファレンススキルです。音声アルゴリズムや処理ループを開発する人向けに、フィルター、エフェクト、合成、解析、最適化の資料を分野別に提供します。
主な機能
- 01フィルターとパラメータ平滑化を網羅
- 02ディレイ・リバーブ・コンプレッサーの資料
- 03オシレーターと波形合成の解説
- 04FFT・検出・音声解析を網羅
- 05リアルタイム処理のスレッド安全性と最適化
活用シーン
- 01C/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 アルゴリズムを実装するための包括的なリファレンスです。音楽制作に携わる実践者の知見を 20 年にわたって集めた musicdsp.org のコミュニティアーカイブを基にしています。
このスキルを使う場面
- C/C++ でオーディオフィルター、エフェクト、シンセサイザー、アナライザーを実装する
processBlock()、process()、またはサンプルごとの DSP ループを記述する- バイクアッド係数、Moog ラダーフィルター、状態変数フィルターを設計する
- ディレイライン、リバーブ、コンプレッサー、ウェーブシェイパー、ステレオプロセッサーを構築する
- 帯域制限された波形、ノイズ、エンベロープを生成する
- 高速な数学的近似や非正規化数の抑制によってオーディオコードを最適化する
特定のアナログ回路を回路レベルで正確にエミュレートする場合(回路図または SPICE リファレンスに一致させる場合)は、circuit-to-dsp も読み込んでください。測定誤差から構造、ソルバー、積分器、レートを決定します。このスキルでは基本的な構成要素を提供します。
アーキテクチャ
このスキルは、分野別のリファレンスで構成されています。取り組むタスクに応じて、該当するファイルを読んでください。
| リファレンス | 内容 | 読む場面 |
|---|---|---|
references/filters.md | バイクアッド/RBJ、Moog ラダー、SVF、FIR、DC ブロック、フォルマント、パラメーターの平滑化、クロスオーバー | フィルターの実装全般 |
references/effects.md | ディレイ、リバーブ、コンプレッサー/リミッター、フェイザー/ワウ、ウェーブシェイパー/ディストーション、ローファイ、ステレオ、畳み込み | オーディオエフェクト全般 |
references/synthesis.md | オシレーター、帯域制限された波形、FM/PM、DSF、ノイズ、エンベロープ、チェビシェフ・ウェーブシェイピング、LFO | 音の生成 |
references/analysis.md | FFT、DFT、Goertzel、ウォルシュ・アダマール変換、エンベロープ追従、ビート検出、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;
または、ゼロへのフラッシュを有効にするコンパイラーフラグ(GCC/Clang の -ffast-math)を使うと、CPU レベルで対処できます。
パラメーターの平滑化
フィルター係数やゲイン値を瞬時に変更しないでください。クリックノイズが発生します。1 次ローパスフィルターでパラメーターを平滑化してください。
// Time-based smoothing coefficient
float a = expf(-2.0f * M_PI / (smoothTimeMs * 0.001f * sampleRate));
// Per sample:
smoothedValue = a * smoothedValue + (1.0f - a) * targetValue;
オーディオスレッドの安全性
process コールバックでは、メモリーの確保、ロックの取得、ブロッキングを伴う OS 関数の呼び出しを決して行わないでください。すべてのバッファーを事前に確保し、パラメーター更新にはロックフリーの通信を使い、負荷の高いループ内での仮想関数呼び出しを避けてください。
双一次変換/プリワーピング
多くのデジタルフィルターは、双一次変換によってアナログプロトタイプから導出されます。重要な対応関係は次のとおりです。
w0 = 2 * pi * fc / Fs
高域で精度を高めるには、周波数のプリワーピングを適用してください。
wa = 2 * Fs * tan(w0 / 2)
コード規約
このスキルのコード例では、すべて以下の規約に従って C/C++ を使用します。
- オーディオサンプルには
float(32 ビット)、係数の計算にはdoubleを使用する - Hz 単位のサンプルレートには
sampleRateまたはsrを使用する - π には
M_PIを使用する(移植性のため、#ifndef M_PI ... #endifで定義する) - 処理関数は入力サンプルを受け取り、出力サンプルを返す
- 状態変数はクラスメンバーにする(グローバル変数にはしない)
- 明記されていない限り、すべての周波数は Hz 単位とする