
概要 📖 – FFT による音声周波数スペクトル解析
Audio Spectrum CHOPは、時間領域の音声信号を FFT で周波数領域に変換し、振幅スペクトラム(およびオプションで位相)を出力する CHOPです。FFT サイズ・対数スケーリング・高域ブーストを切り替えることで、可視化用途から信号復元用途まで幅広く対応します。
主な用途 🎯
- 音声信号の周波数スペクトル可視化(FFT による振幅スペクトラム生成)
- 低域・中域・高域の帯域別エネルギー抽出(ビート検出・楽器分離の前段)
- オーディオリアクティブ演出のソース信号化(特定周波数の音量で映像パラメータを駆動)
- 音声信号の時間⇔周波数領域変換(Time → Magnitude/Phase / Magnitude/Phase → Time の双方向)
- 対数スケール表示による人間聴覚に近い周波数特性の解析
データフロー 🔄
入力: 時間領域の音声 CHOP(タイムスライス)
↓
FFT サイズ分の最新サンプル抽出(64〜16384)
↓
FFT 変換(周波数領域へ変換)
↓
High Frequency Boost / Logarithmic Scaling / Output Length 調整
↓
出力: 周波数スペクトラム CHOP(Visualization / Magnitude / Phase)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Spectrum Page 📋
Mode .mode 🎛️
Audio Spectrum CHOP の動作モードを選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Visualization | .visual |
可視化用途に最適化されたスペクトラムを出力(高域がブーストされ、低域は横方向に広がる) |
| Time to Magnitude and Phase | .timetoraw |
時間領域の信号を仮定して周波数スペクトラム(振幅と位相)を計算 |
| Magnitude and Phase to Time | .rawtotime |
Time to Magnitude and Phase で得られたスペクトラムから時間領域信号を再構築 |
FFT Size .fftsize 🔢
FFT に使うサンプル数(2 のべき乗)。大きいほど周波数分解能が上がるが、最新音声を反映する応答性は下がる
| 項目 | 内部名 | 説明 |
|---|---|---|
| 64 | .64 |
最小 FFT サイズ(応答性最重視・分解能最低) |
| 128 | .128 |
応答性重視の小さい FFT サイズ |
| 256 | .256 |
応答性と分解能のバランス(小) |
| 512 | .512 |
中程度の分解能(リアルタイム可視化向け) |
| 1024 | .1024 |
標準的な分解能・応答性のバランス |
| 2048 | .2048 |
高い周波数分解能(オーディオ解析向け) |
| 4096 | .4096 |
より高い分解能(音楽分析・楽器分離向け) |
| 8192 | .8192 |
高分解能(応答性は低下) |
| 16384 | .16384 |
最大 FFT サイズ(分解能最高・応答性最低) |
※ 注意: 44100 Hz / 60 fps の場合、1 フレームあたり 735 サンプルしか進まない。FFT サイズを 1024 にすると 289 サンプルが前フレームと重複し、サイズを 8192 にすると複数フレーム間で大幅にサンプルが重なる(= 最新音声の反映が遅れる)。
Frequency / Logarithmic Scaling .frequencylog 📊
Frequency <-> Logarithmic Scaling .frequencylog 🎚️
– 1(対数): オクターブ毎に等しいサンプル数で表示し、人間の聴覚特性に近い周波数バランスを得る
– 0(リニア): 一定 Hz ごとに 1 サンプル。Mode=Visualization と組合せると 1 サンプル = 1 Hz の素直なスペクトラムになる
High Frequency Boost .highfreqboost 📈
High Frequency Boost .highfreqboost 🔝
– 0: レベルは変化しない(生のスペクトラム)
– 1 以上: 主に高域のレベルが持ち上がる。1 を超えてオーバードライブも可能
– 可視化用途で高域の存在感を強める際に多用される
Output Length .outputmenu 📐
出力サンプル数の決定方法を選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Match Length To Frequency | .matchtofrequency |
周波数分解能(FFT サイズ)に応じて出力サンプル数を自動決定 |
| Set Length Manually | .setmanually |
Set Output Length パラメータで出力サンプル数を手動指定 |
Set Output Length .outlength 🔢
Set Output Length .outlength 📏
– 出力に欲しいサンプル数を指定(Output Length が Set Length Manually のときに有効)
– サンプル数を減らすと周波数分解能は下がるが、後段の処理コストが軽くなる
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: 音楽に反応するビジュアライザ 🎵
Audio Device In CHOP → Audio Spectrum CHOP (Visualization) → CHOP to TOP → Geometry / Material
音声入力の周波数スペクトラムをそのままテクスチャ化してシェーダに渡し、低域・中域・高域それぞれの音量で頂点・色・発光をリアルタイム駆動する基本構成です。
- Audio Device In CHOP で音声入力を取得
- Audio Spectrum CHOP の Mode を「Visualization」、High Frequency Boost を 1.5 程度に設定
- 出力を CHOP to TOP で 1D テクスチャ化し、シェーダの uniform に渡す
- 周波数帯ごとの音量で頂点位置・発光・色相を駆動するリアクティブ演出が完成
Example 2: 低域・中域・高域の独立検出 📊
Audio Device In CHOP → Audio Spectrum CHOP → Analyze CHOP (Average × 3) → Logic CHOP
スペクトラムを 3 つの帯域に切り分け、それぞれの平均音量を独立した制御信号として扱う構成です。ビート検出・楽器分離・ジェスチャー連動の起点に使えます。
- Audio Spectrum CHOP の Mode を「Visualization」、Frequency / Logarithmic Scaling を 1(対数)に設定
- 出力スペクトラムを 3 つに分割し、低域 / 中域 / 高域を個別に取り出す
- 各帯域で Analyze CHOP の Average を取り、3 系統の音量信号を取得
- Logic CHOP の閾値判定でビート検出やジェスチャー連動の起点として使う
Example 3: 音声信号の周波数領域編集と再合成 🔁
Audio File In CHOP → Audio Spectrum CHOP (Time to Magnitude and Phase) → Math CHOP → Audio Spectrum CHOP (Magnitude and Phase to Time) → Audio Device Out CHOP
周波数領域に変換した音声をサンプル単位で編集し、再び時間領域へ戻す双方向変換を活用したカスタム EQ・スペクトラム加工の構成です。
- 1 段目の Audio Spectrum CHOP の Mode を「Time to Magnitude and Phase」にして周波数領域へ変換
- Math CHOP で特定帯域のサンプルだけをゲインで強調・抑制
- 2 段目の Audio Spectrum CHOP の Mode を「Magnitude and Phase to Time」にして時間領域へ復元
- 周波数領域での編集結果を音として再生できる(カスタム EQ・スペクトラム加工)
Example 4: FFT サイズ切替えによる応答性チューニング ⚙️
Audio Device In CHOP → Audio Spectrum CHOP (FFT Size 切替) → Trail CHOP
FFT サイズを段階的に変えてスペクトラムの分解能と応答性のトレードオフを実機で確認し、演出に必要なバランスを探る構成です。
- Audio Spectrum CHOP の FFT Size を 512 / 1024 / 2048 / 4096 で順に切替えて比較
- 出力スペクトラムを Trail CHOP で時間履歴として可視化
- サイズが大きいほど周波数分解能は上がるが、最新音声の反映が遅れることを確認
- 演出に求められる応答性と分解能のバランスから最適 FFT サイズを決定
関連オペレータ 🔗
類似機能OP 🔍
- Audio Band EQ CHOP — 16 バンドの帯域ゲイン処理に特化、スペクトラム抽出は不可
- Audio Para EQ CHOP — パラメトリック EQ で任意周波数帯を整形(解析ではなく加工)
- Audio Filter CHOP — ローパス・ハイパス等の時間領域フィルタ処理
組み合わせ推奨OP 🔄
- Audio Device In CHOP — リアルタイム音声入力ソースとして上流に接続
- Analyze CHOP — スペクトラムから帯域別の最大値・平均・ピークを抽出
- Math CHOP — スペクトラムの正規化・対数化・帯域ゲイン調整
- CHOP to TOP — スペクトラムを 1D テクスチャ化して GPU シェーダへ渡す
- Trail CHOP — スペクトラムの時間履歴を可視化(スペクトログラム化)
- Filter CHOP — 後段でスペクトラムをスムージングしてちらつきを抑制
前処理・後処理CHOP 🎯
- 前処理: Audio Device In CHOP、Audio File In CHOP、Audio Filter CHOP、Math CHOP
- 後処理: Analyze CHOP、Filter CHOP、Math CHOP、Logic CHOP、Trail CHOP
Info CHOP情報 📊
Audio Spectrum 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:
- FFT Size を 1024 / 2048 / 4096 と段階的に上げて周波数分解能を確保
- 後段に Filter CHOP を入れて時間方向のスムージングをかける
- Frequency / Logarithmic Scaling を 1(対数)にすると低域の解像感が上がる
❌ Problem: 最新の音声に追従していない
✅ Solution:
- FFT Size を小さくする(1024 → 512 等)と最新サンプルの比率が上がる
- FPS と FFT Size のバランスを確認(44100 Hz / 60 fps では 1 フレーム = 735 サンプル)
- 前段の Audio Device In CHOP のバッファ設定とサンプルレートを確認
❌ Problem: Magnitude and Phase to Time で復元音が歪む
✅ Solution:
- 前段は必ず Mode = Time to Magnitude and Phase で生成したスペクトラムを使う(Visualization からは復元不可)
- 途中の Math CHOP 等で振幅と位相を別系統で扱い、対応関係を崩さないようにする
- FFT Size を時間領域変換と再合成で揃える
❌ Problem: 高域が見えない / 弱い
✅ Solution:
- High Frequency Boost を 1 以上に上げて高域レベルを持ち上げる
- Frequency / Logarithmic Scaling を 1(対数)にしてオクターブ均等表示にする
- 可視化用途では Mode = Visualization を使うと自動で高域が強調される
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

