
概要 📖 – チャンネル波形のスムージングとノイズ除去
Filter CHOPは、入力チャンネルに畳み込みフィルタを適用してノイズ除去・平滑化・エッジ検出を行う CHOPです。Type を切り替えるだけで Gaussian・Box・Edge Detect・De-spike・One Euro 等 9 種類のフィルタ特性を選べ、Filter Width と Effect で平滑度と適用量を独立に調整できます。
主な用途 🎯
- センサー入力やトラッキングデータのジッタ除去・平滑化
- Gaussian / Box フィルタによるローパス(高周波ノイズの低減)
- Edge Detect / Sharpen による波形の急変検出と強調
- De-spike による外れ値(スパイク)の選別除去
- One Euro / Ramp Preserve による応答性とラグのバランス調整
データフロー 🔄
入力: チャンネル波形
↓
フィルタ関数(Type)の選択
↓
Filter Width / Effect / Number of Passes による畳み込み強度の制御
↓
出力: 平滑化または特徴抽出された波形
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Filter Page 📋
Type .type 🎛️
チャンネルに適用するフィルタ関数を選択するメニュー(9 種類)
| 項目 | 内部名 | 説明 |
|---|---|---|
| Gaussian | .gauss |
釣鐘型(正規分布)の重みでチャンネルを平滑化するローパスフィルタ。Filter Width が大きいほどカットオフ周波数が下がり滑らかになる |
| Left Half Gaussian | .halfgauss |
Gaussian の片側(過去サンプルのみ)を使用し時系列データに対して未来予測を行わないラグ付き平滑化 |
| Box | .box |
周辺サンプルを等しい重みで畳み込む箱型フィルタ。Gaussian と同様のローパスだが端部で段差が出やすい |
| Left Half Box | .halfbox |
Box の片側(過去サンプルのみ)を使用するラグ付きローパス |
| Edge Detect | .edge |
入力チャンネルの急激な変化(エッジ)を検出するハイパスフィルタ。Filter Width を増やすと低周波成分も追加される |
| Sharpen | .sharpen |
Edge Detect の結果と元データを加算し高周波成分を強調するシャープ化フィルタ |
| De-spike | .despike |
Spike Tolerance を超える外れ値(スパイク)を除去。Filter Width が広いほど長いスパイクも除去できる |
| Ramp Preserve | .ramp |
Ramp Rate で指定した増加率のランプを維持。入力との差が Ramp Tolerance を超えるとランプが入力値にリセット |
| One Euro | .oneeuro |
ノイズ除去と高い応答性を両立するアダプティブフィルタ。低速時は強く、高速時は弱くフィルタする |
※ 注意: De-spike / Ramp Preserve / One Euro はそれぞれ専用パラメータ(Spike Tolerance / Ramp Tolerance / Ramp Rate / Cutoff Frequency / Speed Coefficient / Slope Cutoff Frequency 等)を併用する必要があります。
畳み込み強度パラメータ 📐
Effect .effect 🎚️
– フィルタがチャンネルに与える効果の度合い(0 = 無効, 1 = 最大)
– 元波形とフィルタ後波形のクロスフェード値として機能
Filter Width .width 📏
– 現在サンプルの計算に用いる周辺サンプルの量(Filter Width Unit で指定)
– 大きいほど平滑度が上がるが応答が鈍くなる
Filter Width Unit .widthunit 📐
– Filter Width の単位を Samples / Frames / Seconds から選択
Number of Passes .passes 🔁
– 同じフィルタを繰り返し適用する回数
– 回数を増やすと畳み込み効果が累積し、より強い平滑化が得られる
Filter per Sample .filterpersample 🎯
– チャンネル全体ではなくサンプル単位でフィルタを適用
– マルチサンプルチャンネルを扱うときに有効
De-spike / Ramp Preserve 専用 🔍
Spike Tolerance .spike ⚠️
– De-spike フィルタ専用
– 隣接サンプルからこの値を超えて外れたサンプルをスパイクとみなす閾値
Ramp Tolerance .ramptolerance 📊
– Ramp Preserve フィルタ専用
– 入力値が現在の出力ランプ値からこの値を超えて外れた場合、ランプは新しい入力値にリセットされる
Ramp Rate .ramprate 📈
– Ramp Preserve フィルタ専用
– 出力ランプが増加していくレート
– 入力値が Ramp Tolerance を超えて外れない限り、このレートで出力が上昇し続ける
One Euro 専用 ⚡
Cutoff Frequency (Hz) .cutoff 🎚️
– One Euro フィルタの基準カットオフ周波数(Hz)
– 低速時のジッタが気になる場合に値を下げる
Speed Coefficient .speedcoeff 🏃
– One Euro の速度に応じた追従強度
– 高速移動時のラグが気になる場合に値を上げる
Slope Cutoff Frequency (Hz) .slopecutoff 📉
– 微分(傾き)成分用のカットオフ周波数(Hz)
– ジッタによる導関数の急上昇を抑制する
Slope Reset 制御 ↕️
Slope Down Reset .slopedownreset ⬇️
– オン時、下降スロープが Slope Down Max を超えるとフィルタ効果をバイパスしリセット
Slope Down Max .slopedownmax 🔽
– Slope Down Reset がオンのときにリセットを発火させる下降スロープの最大値
Slope Up Reset .slopeupreset ⬆️
– オン時、上昇スロープが Slope Up Max を超えるとフィルタ効果をバイパスしリセット
Slope Up Max .slopeupmax 🔼
– Slope Up Reset がオンのときにリセットを発火させる上昇スロープの最大値
リセット 🔄
Reset .reset 🔁
– オン時、フィルタ効果をバイパスして入力をそのまま出力
Reset Pulse .resetpulse ⚡
– パルスでフィルタ効果を即座にリセット
Common Page 🔧
Time Slice .timeslice ⏱️
Time Slice モードの強制設定:
- オン: チャンネルを「タイムスライス」モードに強制
- タイムスライス: 前回のクックフレームから現在のクックフレームまでの時間
Scope .scope 🎯
影響を受けるチャンネルの絞り込み:
- Scope 文字列: 影響を受けるチャンネルを指定する文字列
- パターンマッチング:
*や[1-10]等のパターンが使用可能
Sample Rate Match .srselect ⚡
複数の入力 CHOP のサンプルレートが異なる場合の処理方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Resample At First Input’s Rate | .first |
最初の入力のレートで他をリサンプル |
| Resample At Maximum Rate | .max |
最高サンプルレートでリサンプル |
| Resample At Minimum Rate | .min |
最低サンプルレートでリサンプル |
| Error If Rates Differ | .err |
レート不一致でエラー |
Export Method .exportmethod 📤
CHOP チャンネルをパラメータに接続する方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| DAT Table by Index | .datindex |
DAT テーブルのインデックスでチャンネルとパラメータを対応付け |
| DAT Table by Name | .datname |
DAT テーブルの行名でチャンネルとパラメータを対応付け |
| Channel Name is Path:Parameter | .autoname |
チャンネル名を `path:parameter` 形式で記述し直接対応付け |
Export Root .autoexportroot 🌳
Channel Name is Path:Parameter モード時のパス基点:
- Export Root パス:
autonameモードでチャンネル名のパス部分を相対化する基点 OP のパス
Export Table .exporttable 📋
DAT Table エクスポート方式での参照 DAT:
- Export Table DAT:
datindex/datnameモード時に参照する DAT のパス
Rename from .commonrenamefrom 🔤
リネーム対象チャンネルのパターン:
- Rename from パターン: リネーム対象とするチャンネル名のパターンマッチング文字列
Rename to .commonrenameto 🔁
リネーム後の置換パターン:
- Rename to パターン: Rename from にマッチしたチャンネルの新しい名前パターン (デフォルトはリネームなし)
実践アイデア 💡
Example 1: マウス座標のジッタ除去 🖱️
Mouse In CHOP → Filter CHOP (Gaussian, Width=0.1s) → Geometry COMP の Translate
- Mouse In CHOP でマウス座標を取得(手の微小な震えやドライバノイズが乗る)
- Filter CHOP の Type を「Gaussian」、Filter Width Unit を「Seconds」、Filter Width を 0.1 に設定
- Effect を 1.0 にして完全に平滑化、出力をジオメトリの Translate に Export
- オブジェクトがマウスにスムーズに追従し、ジッタが目立たなくなる
Example 2: センサー値のスパイク除去 📡
Serial DAT → CHOP Execute → Filter CHOP (De-spike) → Logic CHOP
- シリアル経由で取得したアナログセンサー値をチャンネル化
- Filter CHOP の Type を「De-spike」、Spike Tolerance を想定ノイズ幅の 2〜3 倍に設定
- 突発的な外れ値(電源ノイズ・通信エラー)が除去される
- 後段の Logic CHOP で安定したしきい値判定が可能になる
Example 3: 波形のエッジ検出によるトリガ生成 🔔
Audio Spectrum CHOP → Filter CHOP (Edge Detect) → Trigger CHOP
- オーディオスペクトラムのエネルギー値を入力に取る
- Filter CHOP の Type を「Edge Detect」、Filter Width で検出したい変化の時間幅を調整
- 急激なレベル変化(ビート・打撃音)の瞬間にスパイクが現れる
- Trigger CHOP で閾値判定し ADSR エンベロープを起動
Example 4: トラッキングの応答性とラグの両立(One Euro) 🎯
Kinect CHOP → Filter CHOP (One Euro) → Geometry COMP
- Kinect / OSC In CHOP 等で取得した骨格・物体位置を入力に取る
- Filter CHOP の Type を「One Euro」、Cutoff Frequency を低めに設定して静止時のジッタを抑制
- Speed Coefficient を上げて高速移動時の追従性を確保
- 静止時は滑らか・移動時は俊敏というインタラクティブ用途に適した出力が得られる
関連オペレータ 🔗
類似機能OP 🔍
- Lag CHOP — イージング指定で慣性付き追従させる
- Resample CHOP — サンプルレート変換と補間を行う(平滑化目的にも転用可能)
- Trail CHOP — 時間履歴を保持し可視化する用途
組み合わせ推奨OP 🔄
- Math CHOP — フィルタ前後で値域を正規化・スケーリング
- Logic CHOP — 平滑化済み信号に対して安定したしきい値判定
- Trigger CHOP — Edge Detect 出力をエンベロープ起動に活用
- Analyze CHOP — 平滑化後の波形からピーク・統計値を抽出
- Audio Spectrum CHOP — 周波数領域の値を Filter で時間方向に平滑化
- CHOP to TOP — 平滑化済みの値を GPU シェーダ uniform に渡す
前処理・後処理CHOP 🎯
- 前処理: Resample CHOP、Math CHOP、Select CHOP、Delete CHOP
- 後処理: Math CHOP、Analyze CHOP、Logic CHOP、Limit CHOP、Hold CHOP
Info CHOP情報 📊
Filter CHOP は Info CHOP による詳細情報取得に対応しています。
CHOP固有情報 🎚️
start: CHOPインターバルの開始(サンプル単位)length: CHOPのサンプル数sample_rate: フレーム毎秒のサンプルレートnum_channels: CHOPのチャンネル数time_slice: タイムスライス有効時は1、無効時は0export_sernum: Export接続の更新回数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間(ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 平滑化が弱い/効果が見えない
✅ Solution:
- Effect が 0 になっていないか確認(0 だと素通し)
- Filter Width を Filter Width Unit と合わせて十分大きく設定(例: Seconds 単位で 0.1〜0.5)
- Number of Passes を 2 以上に増やして畳み込みを累積
- Type が用途に合っているか確認(時系列データなら Gaussian / Left Half Gaussian / One Euro が定番)
❌ Problem: 出力にラグが大きく出る
✅ Solution:
- Left Half 系(Half Gaussian / Half Box)は過去サンプルのみを使うため構造的にラグが発生する。リアルタイム性が必要なら One Euro を試す
- Filter Width を小さくする(平滑度とラグはトレードオフ)
- 後段のMath CHOPで時間オフセットを補正
❌ Problem: De-spike でスパイクが取れない/取りすぎる
✅ Solution:
- Spike Tolerance を実データのノイズ幅の 2〜3 倍に調整(小さすぎると正常な変化も除去)
- Filter Width を広げて長時間続くスパイクにも対応
- 前段でResample CHOPでサンプルレートを揃える
❌ Problem: One Euro の挙動が想定と違う
✅ Solution:
- Cutoff Frequency を下げると静止時のジッタが減るが、移動時の追従が鈍くなる
- Speed Coefficient を上げると高速時の応答性が改善するが、ジッタも通しやすくなる
- Slope Cutoff Frequency で導関数側のノイズも独立に制御する
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

