Filter CHOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

Filter CHOP のチャンネル平滑化機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – チャンネル波形のスムージングとノイズ除去

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 による畳み込み強度の制御

出力: 平滑化または特徴抽出された波形

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

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 等)を併用する必要があります。

引用元: 公式 docs

畳み込み強度パラメータ 📐

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
  1. Mouse In CHOP でマウス座標を取得(手の微小な震えやドライバノイズが乗る)
  2. Filter CHOP の Type を「Gaussian」、Filter Width Unit を「Seconds」、Filter Width を 0.1 に設定
  3. Effect を 1.0 にして完全に平滑化、出力をジオメトリの Translate に Export
  4. オブジェクトがマウスにスムーズに追従し、ジッタが目立たなくなる

Example 2: センサー値のスパイク除去 📡

Serial DAT → CHOP Execute → Filter CHOP (De-spike) → Logic CHOP
  1. シリアル経由で取得したアナログセンサー値をチャンネル化
  2. Filter CHOP の Type を「De-spike」、Spike Tolerance を想定ノイズ幅の 2〜3 倍に設定
  3. 突発的な外れ値(電源ノイズ・通信エラー)が除去される
  4. 後段の Logic CHOP で安定したしきい値判定が可能になる

Example 3: 波形のエッジ検出によるトリガ生成 🔔

Audio Spectrum CHOP → Filter CHOP (Edge Detect) → Trigger CHOP
  1. オーディオスペクトラムのエネルギー値を入力に取る
  2. Filter CHOP の Type を「Edge Detect」、Filter Width で検出したい変化の時間幅を調整
  3. 急激なレベル変化(ビート・打撃音)の瞬間にスパイクが現れる
  4. Trigger CHOP で閾値判定し ADSR エンベロープを起動

Example 4: トラッキングの応答性とラグの両立(One Euro) 🎯

Kinect CHOP → Filter CHOP (One Euro) → Geometry COMP
  1. Kinect / OSC In CHOP 等で取得した骨格・物体位置を入力に取る
  2. Filter CHOP の Type を「One Euro」、Cutoff Frequency を低めに設定して静止時のジッタを抑制
  3. Speed Coefficient を上げて高速移動時の追従性を確保
  4. 静止時は滑らか・移動時は俊敏というインタラクティブ用途に適した出力が得られる

関連オペレータ 🔗

類似機能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 🎯


Info CHOP情報 📊

Filter CHOP は Info CHOP による詳細情報取得に対応しています。

CHOP固有情報 🎚️

  • start: CHOPインターバルの開始(サンプル単位)
  • length: CHOPのサンプル数
  • sample_rate: フレーム毎秒のサンプルレート
  • num_channels: CHOPのチャンネル数
  • time_slice: タイムスライス有効時は1、無効時は0
  • export_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 で導関数側のノイズも独立に制御する

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました