Spectrum Analysis

音楽ソフトでスペアナはよく見かけるけど、設定を変えても効果がよくわからないというスペアナマニア候補生の方向けのページです。

 

スペアナには主な設定項目として、ブロックサイズ(Block size)と、窓関数(Window)があります。Wavelabではオーバーラッピング(Overlapping)という設定項目もありますが、Wikipediaなどを見ていただくとわかるようにこれらの意味を理解するのは結構時間がかかるので、小難しい数式一切抜きで説明してみます。

ブロックサイズ

ブロックサイズとは計算対象となるサンプリング数のことです。

いわゆる音楽CDのサンプリング周波数である44.1kHzの場合、1秒間に44100回サンプリングしているのですが、そのデータからいくつを計算対象とするか、というのがこのブロックサイズとなります。このブロックサイズを変えることで周波数領域の解像度を上げることができます。

 

計算式は次のようになります。

[周波数解像度] = [サンプリング周波数] ÷ [ブロックサイズ]

[待ち時間] = 1 ÷ [周波数解像度]

 

サンプリング周波数が44.1kHzの場合の周波数解像度と待ち時間(レイテンシー)をまとめると次のようになります。

ブロックサイズ

Block size

周波数解像度

Resolution

待ち時間

Latency

2048 21.5Hz 46ms
4096 10.8Hz 93ms
8192 5.4Hz 186ms
16384 2.7Hz 372ms

 

よく見かける設定としては4096/8192あたりでしょうか。ブロックサイズを大きくすると細かい周波数成分まで確認できますが、より多くのサンプリングデータが必要となるため、時間領域の解像度(画面表示の更新頻度)が下がります。低い周波数を細かく見る場合はブロックサイズを大きくした方が有利となりますが、レイテンシーが大きくなるため、時間の解像度をあげたい場合はブロックサイズを小さくするなどソースに合わせて調整する必要があります。

 

ややこしいことはさておき、このブロックサイズを変えた場合の表示結果は次のとおりです(色が複数ある理由は後述します)。

 

ブロックサイズ: 16384

 

ブロックサイズ: 8192

 

ブロックサイズ: 4096

 

ブロックサイズ: 2048

 

窓関数

ブロックサイズの図でいくつかの色の違いがありますが、これは使用している窓関数の違いを示しており、ここでは次のように色付けしています。

窓関数
None / Rrectangular
Hanning
Hamming
Gaussian (α=5)
Blackman
Blackman-Harris 7th
Flat Topped

 

時間領域のデータを周波数領域に変換するのによくFFT(高速フーリエ変換)が利用されますが、このフーリエ変換というのは無限に繰り返される信号(ここでは音)があると仮定して計算されます。ただ、事実上現実世界にそのような「音」はないため、ブロックサイズの大きさで切り取ったデータ(音)を対象にして、それを無限に繰り返しつなげたものを計算することとなります。これがまた厄介で、音の最初と最後をつなげた時に綺麗につながればよいのですが、そうはうまいこといきません。そこでブロックの端を「0」など同じ値にすることで無理やり綺麗につながるように調整するわけです。その調整する方法として窓関数が一般的に利用されています。

 

利用する窓関数が異なると結果的に出力される周波数領域のデータにも違いが出てくるのですが、特に窓関数を使用しない場合(None / Rectangular) と使用する場合では大きく異なるのでこの点だけは少し注意が必要です。もっとも、音楽制作の場合最終的には自分の耳で確認するため、これらは参考資料としての価値しかありません。このためアプリケーションのデフォルトの窓関数を使用したので実際には問題ないと思われます。

 

もう一つ窓関数による違いがわかる例として220Hzのサイン波のスクリーンショットを取ってみました。

窓関数を使用しない場合はダイナミックレンジが狭いことがよくわかりますが、Hamming窓も思っていたよりもいまいちの結果でした。他の窓関数はほぼ同じ結果となりました。というわけで、Wavelabを使用する場合はデフォルトのHanning窓を使用しておけばとりあえずOKのようです。

オーバーラッピング

日本語に置き換えると重畳になるのでしょうか(適当)。さておき、この設定項目はより時間領域の解像度を上げるためにどの程度ブロックを重複して計算するかという設定です。高い値ほど前後のブロックをかぶせて計算するため時間解像度が高くなりますが、その分計算量が増えるため、オーバーラップしない場合に対して、50%オーバーラップさせると計算量が単純計算で2倍になります。といっても、昨今のCPUではほとんど影響ない程度です。

 

これらの情報からちょこっと計算してみたところ、次の計算式でそれぞれの値を求められました。

[時間解像度] = [ブロックサイズ] ÷[サンプリング周波数] ×( 1 - [オーバーラッピング] )

[CPU負荷] = 1 ÷ ( 1 - [オーバーラッピング] )

 

サンプリング周波数が44.1kHzの場合の周波数解像度と待ち時間(レイテンシー)をまとめると次のようになります。

ブロックサイズ

Block size

オーバーラッピング

Overlapping

時間解像度

Time Resolution

CPU負荷

CPU Load

8192 0% 186ms x 1
8192 50% 93ms x 2
8192 99% 1.858ms x 100
16384 0% 372ms -
16384 50% 186ms -
16384 99% 3.715ms -

 

オーバーラッピングは時間領域の分解度を大きくするためのものなので、連続して音の変化をみる場合は有意義かもしれませんが、スナップショットをとる目的だけでしたらあまり意味がないかもしれません。

 

と、こういった感じで音を視覚で確認する方法は、新しい音に出会ったときにどうやって作るのか頭で理解できない場合有用なことがあります。ただ、音作りの場合においては耳から入ってくる音がすべてであり、エライ人には耳を鍛えろと言われるのがオチなので、ここら辺でとっとと退散します。