チュートリアル26

pfft‾を使った周波数領域でのシグナルプロセッシング

周波数領域での作業

たいていのディジタルオーディオ処理は時間領域の中で行われます。そのため、他のMSPチュートリアルでは、サンプル(またはサンプルのグループ)の振幅の変更(リングモデュレーション、ウェーブシェイピング、ディストーション)や時間の変更(フィルタ、ディレイ)による、最も一般的なオーディオ処理について示しています。高速フーリエ変換(FFT)では、オーディオデータを時間領域から周波数領域へ変換することができるので、サウンドのスペクトル(スライスされたオーディオの周波数成分)を直接処理することができます。

MSPオブジェクトのfft‾とifft‾では、シグナルを周波数領域に変換したり、逆変換したりすることができます。fft‾オブジェクトはサンプルのグループ(通常フレームと呼ばれます)を、多くの実数と虚数のペアに変換します。これらは、フレームに含まれるサンプル数と同数あり、各々の周波数帯の振幅と位相を表しています。ifft‾オブジェクトは逆変換を行います。これは、周波数領域サンプルのフレームを時間領域のオーディオシグナルに再変換し、実際に聞いたり、別の方法で処理したりすることができるようにします。フレームのサンプル数はFFTサイズ、あるいはFFTポイントサイズと呼ばれます。このサイズは、512や2048等の2の累乗(ベキ数)でなければいけません。

fft‾やifft‾オブジェクトの1つの欠点は、サンプルのフレーム間のオーバーラッピングやクロスフェードを行わずに、連続したフレームを処理する点です。FFT分析では、必ず周波数解像度と時間解像度の間のトレードオフが生じます。例えば、FFTサイズが2048サンプルの場合、FFT分析によって2048の周波数ビン(訳注 2048の周波数成分)を得ることができます(ただし、実際に使用できるのは1024になります。詳しくはチュートリアル25を参照)。しかし、1つのFFTフレーム内の変化は、ひとかたまりにされてしまうため、2048サンプル内での時間解像度は分析によって失われてしまいます。加えて、FFT分析碁のスペクトルデータを加工しIFFT再合成を行う場合。IFFTによる時間領域シグナルが、連続するフレーム上でもはや一致するかどうかの保障ができないという点があります。出力される時間領域ベクタが適合しない場合には、出力シグナルにクリックを生じます。MSPで窓関数を設計することによって(下にしめすように)、連続したフレームがお互いにオーバーラップする構造を作り、この欠点を補うことができます。これは、時間解像度の補償は行いませんが、分析データをオーバーラップすることで、再合成の際にIFFTフレームの端点で生じるクリック音やポンというような音を除去することができます。MSPでの窓関数の設計は、1つ以上のfft‾/ifft‾オブジェクトのペアを用いて、周波数領域への変換、逆変換の際に入力シグナルにエンベロープをかけるようなパッチを使用することで可能になります。このアプローチはうまく動作しますが、周波数領域の中で行われるすべてのオペレーションに対して各々のfft‾/ifft‾ペアを正確に複製しなければならない点がプログラム上いくぶん厄介です。次のサブパッチは、入力されるFFTデータにウィンドウ(窓関数)をかける方法を示しています。

このアプローチがプログラムにあたっての難題であることに加え、複数のFFTサイズの組み合わせやオーバーラップを用いたパッチの一般化が困難であるという点があります。フレームサイズやオーバーラップを定義するfft‾/ifft‾の引数は変更ができないため、異なった状況では、各々のサブパッチの多くのバージョンを作る必要が生じてしまいます。例えば、パーカッシブなサウンドは少なくとも4つのオーバーラップが必要であるのに対し、適度に静的で、ハーモニックな豊かなサウンドは非常に大きいFFTサイズを要求します。

pfft‾オブジェクトはこれらの弱点を補い、周波数領域シグナルを扱うサブパッチを、ウィンドウのオーバーラップやFFTサイズから独立した形で作成することを可能にします。従って、1つのサブパッチで複数のアプリケーションに対応できます。
pfft‾オブジェクトは特別に設計されたサブパッチの名前と、FFTサイズのサンプル数、オーバーラップの係数(2の累乗でなければなりません)を引数として取ります。:

pfft‾の簡単な使用法

上の例で参照されているpfft‾のサブパッチfftbasic‾はこのようなものになるでしょう。

fftbasic‾サブパッチ

fftbasic‾はシグナル入力を受け取り、このシグナルをハニング窓(後述)を使ってFFTします。そして、同じウィンドウを使ってIFFTを行います。pfft‾オブジェクトはインレットとアウトレットに特別なオブジェクトを用いたサブパッチを管理します。fftin‾オブジェクトは時間領域シグナル入力を親パッチから受け取り、FFTを使って周波数領域に変換します。fftout‾オブジェクトは逆の事を行います。fftout‾は、周波数領域シグナルを受け取り、変換によって時間領域シグナルに戻して、親パッチのアウトレットに送ります。どちらのオブジェクトも、引数として数値(インレット、アウトレットのナンバの指定)とびシンボル(使用するウィンドウ関数を指定)を取ります。使用できるウィンドウ関数は、ハニング(指定がない場合のデフォルト)、ハミング、プラックマン、トライアングル(三角窓)、そしてスクエア(方形窓)です。fftin‾,fftout‾にnofftという引数を与えると、コントロールデータの為の一般的なシグナルインレットまたはアウトレットを作ります。これらはFFT/IFFT処理やウィンドウイング(窓掛け)を行われません。その他、buffer‾オブジェクトの名前をシンボルとして与えると、カスタムな窓関数を使用することができます。異なったウィンドウ関数は、個々のチャンネル(ビンー時としてこう呼ばれることもあります)について、異なるバンド幅やストップバンドデプスを持ちます。
FFT分析に対する十分な参照は、分析したり、加工したりしようとするサウンドに基づくウィンドウの選択を助けます。そのために「コンピュータミュージックチュートリアル(Computer Music Tutorial)」-Curtis Roads著(日本語訳、東京電気大学出版局「コンピュータ音楽 -歴史・テクノロジ・アート」)、「コンピュータミュージック(computer music)」-Charles Dodge, Thomas,Jerse著を推薦します。

より複雑なpfft‾サブパッチは次のようなものです。

シンプルなコンボリューション(畳込み)

このサブパッチは2つのシグナル入力(親のpfft‾オブジェクトではインレットとして現れます)を持ち、それらを周波数領域に変換し、互いに掛け合わせた結果をfftout‾オブジェクトから出力します。fftout‾オブジェクトは周波数領域のデータを時間領域のシグナルに変換します。周波数領域での掛け合わせはコンボリューション(畳込み)と呼ばれ、クロスシンセシス(1つのサウンドからもう1つのサウンドへモ−フィングすること)で使われる基本的なシグナル処理方法(プロシージャ)です。このアルゴリズムによる結果、強いか弱いかに関わらず、2つの分析された周波数は大きい方の値によって他方が強化されるのに対し、片方の分析結果からの弱い周波数の値は他方によってキャンセルされます。2つの入力されるシグナルに含まれる周波数のうち、共通に含まれる周波数は強化され、共通しない周波数(片方のシグナルにあって、片方にはないピッチ)はキャンセルされます。

fftin‾オブジェクトは第3のアウトレットを持っています。これは第1,第2アウトレットからデータが出力されているカレントのビンに対応するサンプルのストリームを出力します。これは0からFFTサイズ-1までの値になります。この値にFFTの基本周波数または基音のシグナル(シンクシグナルと呼ばれます)をかけ合わせることで、周波数値に変換することができます。FFTの基音とは、FFTが分析できる最も低い周波数のことで、これはFFTサイズに反比例します。(つまり、大きなFFTサイズでは低い基本周波数を生じます)正確なFFTの基本周波数は,FFTのフレームサイズでサンプリングレートを割ることで得られます。fftinfo‾オブジェクトは、pfft‾サブパッチが存在する時、FFTフレームサイズとFFTハーフフレームサイズ(使用可能なビンの数)、FFTホップサイズ(窓掛けされたフレーム間でオーバーラップされるサンプル数)を出力してくれます。これを、dspstate‾オブジェクト、またはsr(sampling rate)を引数に持つadstatusオブジェクトと一緒に使うことによって、FFTの基本周波数を得ることができます。

現在分析しているビンの周波数を求める

fftinから出力されるビンの周波数がわかってしまえば、周波数に基づいたFFTデータの操作が可能になります。例えば:

簡単なスペクトル交差

上のpfft‾サブパッチは、xover‾と呼ばれています。これは、入力シグナルを分析したデータを、分割周波数に基づいて2つのfftout‾オブジェクトのうちの1つにp送ります。分割周波数はシグナルとして、pfft‾パッチの第2インレットに送られます。(これは、サブパッチ上ではfftin‾ 2 nofftというラベルのオブジェクトになります)カレントビンの周波数−シンクアウトレットとすでに述べたような回路を用いて決定します−は分割周波数と比較されます。この比較の結果によって、FFTデータをを送る右、または左のfftout‾の切り替えを行います。このサブパッチの親となるパッチは次のようなものになるでしょう。

xover‾のラッパ−(親パッチ)

最初のfftin‾の2つのアウトレットは、FFT分析の各サンプルに対して、ビンごとに実数と虚数のストリームを出力します。(同様に、fftout‾はこれらの数を予測します。)これらの数は各ビンの振幅と位相ではありませんが、平面上でデカルト座標のx,yのペアに変わるものであると考えられます。ここでは、原点からの距離がビンの振幅に、原点の周りの角度がビンの位相にあたります。

FFTのデカルト座標から極座標への変換

cartopol‾とpoltocar‾というオブジェクトを使うと、実数/虚数のペアと振幅/位相のペアの間の変換を容易に行うことができます。

デカルト座標から極座標への変換

このことを利用して、振幅/位相でーたに基づくシグナル処理ルーティンを作ることができます。スペクトル・ノイズゲートは次の例のようになるでしょう。

スペクトル・ノイズゲート

cartopol‾から出力される振幅とpfft‾の第2インレットに送られるスレッシュホルドシグナルを比較することで、各々のビンは通過するか*‾オブジェクトによって0にされます。このようにして、一定の振幅を上回る周波数ビンだけが再合成の際に保持されます。

コンボリューションやクロス−シンセシスでは、一般に振幅と位相のデータを処理に用います。次のサブパッチでは、1つの入力の振幅の、他の振幅によるコンボリューション(畳込み)が行われています。

振幅だけのコンボリューション

1番目のシグナルの位相特性は複素数ー実数の乗算に影響を与えません。2番目の入力シグナルの位相特性は無視されています。Max/MSP Examplesのstuffフォルダには,pfft‾を使ったクロスシンセシスのより多くの実例があります。

pfft‾によって作られるサブパッチでは、buffer‾のデータにアクセスするようなオブジェクトを含む、MSPのすべてのオブジェクトが利用できます。次の例はスペクトルデータを2チャンネルのbuffer‾に録音し、録音されたフレームごとに、入力されてくるシグナルと再合成することができます。

Pvoc の例

このサブパッチャーはスペクトルデータをbuffer‾ に録音します。framedelta‾オブジェクトは連続したFFTフレームの同じビン同志の位相偏差を計算します。framedelta‾の出力はデータが-πとπの間に収まることを確実にするためにphasewrap‾オブジェクトに送られます。

親パッチからrecord‾オブジェクトに送られるメッセージで、録音をスタート/ストップさせたり、ループをオンにしたり等ができます。第2シグナルインレットは再合成のためのフレームナンバを指定します。この値は近似する整数に丸められ、スペクトルフレームサイズを掛けられて、fftin‾オブジェクトから出力されるランニングシンクを加算されます。これによって、buffer‾の2つのチャンネルのスペクトルデータの再生を摺り合わせます。位相データはframeaccum‾オブジェクトで再変換されますが、このオブジェクトはframedelta‾の逆の処理によってランニングフェイズを計算します。シグナルはpoltocar‾によってデカルト座標に変換され、親パッチに向けて再合成されます。

これは「フェイズボコーダ」として知られるものの簡単な例です。フェイズボコーダでは、シグナルのピッチを、時間領域ではなくFFTデータとして処理することによって、シグナルの時間上の圧縮、伸長を独立に行うことができます。1回のFFTをフィルムの1つのフレームと考えると、1つ1つのフレームが様々な速さで読まれていくことで、起きていることの見かけ上のスピードを変化させることができるということが容易に理解できるでしょう。

pfft‾はウィンドウによるオーバーラップを行うので、buffer‾にストアされるデータ量はpfft‾の設定に依存するという点に注意して下さい。pfft‾パッチャーの中で用いられるbuffer‾オブジェクトはスペクトルフレームの半分(有効なビン)を録音します。そのため、pfft‾で4回のオーバーラップが行われると、buffer‾には、引数で指定された量の半分のスペクトルデータを格納することができます。

このサブパッチの親パッチ(mypvocと呼ばれます)は次のようなものです。

mypvocのラッパ−

第2インレットに連結されたphasor‾を利用して、再合成のためのループ、そのサイズ、オフセットを設定することができます。phasor‾ の周波数は再合成の速さを決定します。

まとめ

pfft‾は周波数領域のデータの分析、シグナルプロセッシング、再合成を処理、管理するためのパワフルなツールです。これによって、様々なFFTサイズやオーバーラップを用いたパッチを設計することができます。pfft‾サブパッチャーでは、クロスシンセシスや時間伸長を行うアプリケーションのために、時間スペクトルと時間領域双方のデータを結合することができます。

<-前の章 次の章->