サンプリングの手法

スポンサーリンク

前章で音楽におけるゆらぎの正体とは、周波数と振幅の時間的な変化であるということを述べましたので、ここではそれを数値化する方法について解説していきます。ここから先の説明は自作のソフト「ゆらぎアナライザー」を使って実際に体験できるようになっていますので、合わせてお使いいただければより理解が深まると思います。

どのくらいの時間で区切るか?

前章で音楽のゆらぎを解析するには、ミクロな波形のレベルではなく、人間にとって意味のある時間で区切らなければならないということを述べました。音楽の場合、それはおおよそ音符の長さにほぼ等しいと考えられます。なぜなら一つ一つの音符が音楽を構成する最小単位だからです。

では音符の長さは具体的にどのくらいになるかを考えてみましょう。たとえばテンポが120BPM(やや速いくらいのテンポです)の曲があったとすると、1分間に4分音符が120個ですから、4分音符1個あたりの時間は0.5秒、すなわち500ミリ秒となります。たいていの曲では最小の音符は16分音符、たまに32分音符が使われるくらいですから、仮に32分音符とすると4分音符をさらに8つに分けて、その時間は62.5ミリ秒となります。しかしさらにアップテンポの曲があったり、装飾音符や演奏技法(トリルやビブラートなど)、演奏者による微妙なタイミングのずれ(前ノリや後ノリなど)を考慮すると、その2倍以上の分解能は欲しいところです。したがって30ミリ秒より短い時間で区切れば音楽的な表現はほぼカバーできると考えられます。

先に紹介した文献では、この区切りの時間を25ミリ秒としています。これはおそらく上のような考察から決められたものだと思います。実はもう一つ別の理由もあるのですが、それは後で説明するとして、とりあえず今は25ミリ秒程度の時間に区切ると思ってください。これは長すぎても短すぎてもいけないことが後でわかります。

サンプリング周期とサンプリング周波数

ゆらぎを解析する際に、この区切りの時間が周波数あるいは振幅の変化を表す最小単位となります。このように一定の間隔でデータを抽出することをサンプリングといい、その間隔をサンプリング周期と呼びます。

またサンプリング周期の逆数をサンプリング周波数と呼びます。これは1秒間あたり何回サンプリングしたかということですから、仮にサンプリング周期を25ミリ秒とすると1秒間あたり40回、すなわちサンプリング周波数は40Hzとなります。

ここでデジタル信号処理特有のサンプリング定理というものがあって、「サンプリングされたデータが元の信号を再現できる周波数はサンプリング周波数の1/2以下である」という制約があります。たとえばサンプリング周波数を40Hzとすると、実際に再現可能な周波数は20Hzまでで、それより高い周波数は意味を持たないということです。なおこの20Hzというのはゆらぎの周波数であって、音の周波数のことではありませんので混同しないようにしてください。

周波数のサンプリング

では元の波形をサンプリング周期ごとに区切ってその周波数を求める方法を考えましょう。ところが実は音の波形から周波数を求めるということは大変難しく、現在でも確立された方法がないのが実状なのです。なぜかと言いますと、楽器の音には本来の周波数だけでなく、その1オクターブ上、2オクターブ上・・・の倍音成分がたくさん含まれていますので、どれが本当の周波数なのかを見極めるのが大変困難なのです。さらに和音が鳴っていたり、複数の楽器が同時に演奏している状態では、もはや判別することは不可能と言えます。

波形から周波数を推定する方法には、フーリエ変換による方法、自己相関関数による方法、ゼロクロス法による方法などがありますが、どれも一長一短でこれといった決め手はありません。いずれにせよ、複数の音が同時に鳴っている状態(ほとんどの音楽ではそうです)では正確に周波数を推定することはまず無理と思ってください。ですからこれからの議論は必ずしも「厳密」ではないことを念頭に置いて読んでください。

周波数を厳密に推定することはほぼ不可能だとしても、ある程度の「傾向」くらいは定量化することができるはずです。そのような目的に最も適した簡便な方法として、ゼロクロス法がゆらぎ解析では一般的に用いられてきました。ゆらぎアナライザーでもゼロクロス法を採用しています。ここではゼロクロス法について解説していきましょう。

ゼロクロス法の説明

上図に示すように、ゼロクロス法では元の波形をサンプリング周期ごとに区切り、その区間内で振幅が0の軸と波形が交差する回数をカウントします。交差する回数が多いほど周波数が高いことは明らかですね。純粋な正弦波であれば1周期の間に必ず2回交差しますから、交差した回数を2で割ったものがその区間内にある波の数と「ほぼ」一致します。実際の周波数はそれにサンプリング周波数を掛けたものになります。これをその区間における「平均的な」周波数としてサンプリングします。たとえばサンプリング周期を25ミリ秒とすれば、その間に2回交差すると平均周波数は40Hzとなり、1回だけ交差すると平均周波数は20Hzとなります。つまりこれは人間の耳に聞こえる周波数の下限とされている20Hzと一致します。これが検出可能な最低周波数となりますから、サンプリング周期を25ミリ秒とした根拠はおそらくここにあるのだろうと推測します。

ただし楽器の音は倍音成分を含んでいますから、ギザギザになった複雑な波形では本来の周波数より多く交差する可能性が当然ながらあり得ます。しかしそれはそれで良いのです。少し乱暴なようですが、倍音成分(もちろん和音も)も含めて「平均的な」周波数とみなしてしまうのです。この方法によると、たとえ同じ高さの音であっても演奏する楽器が変わったり、奏法が変わると倍音成分が変化して一種の「ゆらぎ」として捉えることになります。ですから「ゆらぎ」の解析という観点からはむしろ合理的と言えます。もちろんこのようにしてサンプリングした周波数を「再生」してみても、元の音楽のようには聞こえないでしょう。当然ながら楽譜そのものとはまったく違ったものになるはずです。しかしそれは演奏表現までをも含めた実際の音楽の「概略」であると考えれば、あながち間違いではないと言えるのではないでしょうか。

振幅のサンプリング

周波数のサンプリングに比べると振幅のサンプリングは単純です。それは決まったやり方があって、機械的に計算するだけでできるからです。ある区間における平均的な振幅(音量)を求めるには、実効値(RMS)を求めるのが一般的です。

実効値の説明

音の波形を見てみると、その振幅は時間ともに常に変化しているため、ある瞬間の振幅を取り出しても意味がありません。そこである区間を平均してならしたものを求めたいわけです。しかし音の波形は0を中心として正負に均等に振れていますから、普通に平均をとるとほとんど0になってしまいます。これでは不都合なので、振幅を2乗してから平均を求めるという方法がとられます。具体的には元の波形の各サンプル点ごとに振幅を2乗して、サンプリング周期の区間内で総和を求めます。当然これは必ず正の値になります。それを全サンプル数で割り、さらに平方根をとったものを実効値とします。これは上図の薄い黄色で示したように、サンプリング周期の区間内で波形を平均化してならしたものに相当します。これは人間が感じる音の大きさ(音量)と一致しています。なおここで言う「サンプル点」とは元の波形のサンプリング周期に対応する時間のことで、普通のCDでは1/44100秒に相当します。ゆらぎ解析のサンプリング周期と混同しないようにしてください。

再びサンプリング周期の問題

初めに音楽的な考察からサンプリング周期は25ミリ秒くらいが適当であると述べましたが、物理的な側面からももう一つの理由があります。では具体的にサンプリング周期を長くしたり短くしたりすればどのようになるかをゆらぎアナライザーを使って実験してみましょう。

周波数サンプリングの場合

低周波数でサンプリングしたデータ

上図はある曲の周波数をサンプリング周期50ミリ秒でサンプリングしたものです。この場合、検出可能な最低周波数は10Hzとなります。

高周波数でサンプリングしたデータ

上図は同じ曲の周波数をサンプリング周期10ミリ秒でサンプリングしたものです。この場合、検出可能な最低周波数は50Hzとなります。

同じ曲をサンプリングしてもサンプリング周期によってかなり違っているのがわかります。サンプリング周期を短くすると、長い場合に比べて振れ幅、すなわちバラツキが大きくなっていることがわかりますね。なぜこのようになるのかを具体的な例を挙げて説明しましょう。

手首に指を当てて脈拍を測るときのことを考えてください。普通、脈拍とは1分間の心拍数のことを言いますね。でも病院などで測るときはそんな悠長なことはやってられないので15秒で測って4倍したりします。まあ普通はそれで十分ですね。しかし、こういう場合はどうでしょう? 仮に安静時の脈拍が毎分60回だったとして、それがあるときは59回になったり、61回になったり、ゆらいでいるとします。これを1分間きっちり測れば間違いなく検出できます。しかし測定時間をぐっと縮めて5秒で測ったとします。するとあるときは4回になったり、6回になったりするでしょう。これを12倍すれば48回から72回の間にバラツキが広がってしまいます。さらに測定時間を縮めて1秒にしたらどうなるでしょう? 今度は1回か2回、または0回かのいずれかになるでしょう。それを60倍すると何と0回から120回の間にバラツキが拡大してしまうのです。

つまりサンプリング周期を短くするとバラツキが大きくなったのはこういう理由だったのです。先にサンプリング周期が25ミリ秒のとき検出可能な最低周波数は20Hzであると言いましたが、これはちょうど1秒で脈拍を測っている場合に相当し、「かなり怪しい」ということができます。したがってできるだけ正確に周波数を求めるためにはサンプリング周期は長く取った方が有利なのです。

しかしサンプリング周期を長くすると今度は時間的な分解能が低下してしまい、細かい音符の動きを分離できなくなります。ですからサンプリング周期を25ミリ秒としたのは、人間の可聴周波数と音符の細かさの両方を考慮して決められた「落としどころ」だったのかもしれません。

参考までにサンプリング周期を変えてパワースペクトルを求めると結果がどのように異なるかをご紹介しましょう。まず下図はサンプリング周期50ミリ秒でサンプリングした場合です。回帰直線の傾きはやや急で1/fより大きくなっていることがわかります。

低周波数でサンプリングしたパワースペクトル

次に下図は同じ曲をサンプリング周期10ミリ秒でサンプリングした場合です。今度は傾きが緩くなって1/fより小さくなっていることがわかります。

高周波数でサンプリングしたパワースペクトル

なぜこのような差が出るかというと、それはサンプリングしたデータのバラツキが大きくなるほど高周波成分をたくさん含んでいるからなのです。フーリエ変換した結果、高周波領域のスペクトルが強くなり、それに引っ張られて回帰直線の傾きが緩やかになる傾向があります。

したがって1/fゆらぎを評価するにはあらかじめサンプリング周期を決めておかなければ意味がないということがこれでおわかりでしょう。

振幅サンプリングの場合

振幅の場合は周波数と違ってサンプリング周期を短くしても精度が低下することはありません。それは原理から考えるとわかるでしょう。ただしどれだけ短くしてもいいかというと、そうではありません。波形をならして平均化するということは、少なくとも波形の半周期分(つまり1つの山または谷)以上の時間がなければならないということにお気づきでしょうか。それより細かい時間に分けてしまうともはや平均の意味がありません。極端な話、CDのサンプリングレートと同じ周期まで短くしてしまうと音の波形をミクロに見た場合と本質的に等価になります。

この問題は音の周波数が低いほど顕著になります。ですから振幅の場合も音の最低周波数の2倍より低い周波数でサンプリングしなければならないということになります。つまり音の最低周波数を20Hzとすれば、その2倍の40Hzより低い周波数(周期はその逆数の25ミリ秒)でサンプリングしなければならないのです。

サンプリングのまとめ

以上、サンプリングの手法とサンプリング周期の決定について解説してきましたが、ここで紹介したゼロクロス法は周波数を推定する一つの方法に過ぎず、絶対的なものではありません。しかしいろいろ調べてみると、ゼロクロス法というのは音楽のゆらぎに関する最も古い研究で用いられた方法であり、周波数を推定する方法が確立されていない以上、現在でも伝統的に用いられているようです。「1/fゆらぎ音楽」と称して売られているCDもおそらくこの方法にしたがって解析したものと思われます。

またサンプリング周期を25ミリ秒とするのも、さまざまな条件を考慮して最大公約数的に決められたもので、絶対的なものではありません。ゆったりしたテンポの曲では50ミリ秒くらいにした方が精度が上がる可能性もあります。しかしいろいろなジャンルの曲を相対的に比較しようとすれば、サンプリング周期はあらかじめ固定しておかなければならないということは言うまでもありません。

実はもう一つある? 時間軸のゆらぎ

音楽のゆらぎには周波数と振幅のゆらぎの両方があると言いましたが、よく考えてみるとテンポのゆらぎというものも存在するのではないかと思えます。これは別の見方をすれば時間軸そのもののゆらぎとも言えます。特にクラシック音楽ではテンポは常に揺れ動いていますから、非常に重要な要素であると言えます。

実際、テンポのゆらぎについて研究した論文も発表されており、鍵盤などをメトロノームなしで一定間隔で打鍵させ、その間隔を調べたら1/fゆらぎになっていると言うのです。しかしこういう単純なケースでは計測できても、音楽のビート(拍)を検出するのは周波数の推定と同様にかなり困難です。ドラムだけの音楽ならまだ可能かもしれませんが、ビートがはっきりしないクラシック音楽ではまず不可能と思われます。

ところがよく考えてみると、テンポがゆらぐということは、周波数あるいは振幅のパターンが時間的にゆらいでいるということであり、やはり周波数と振幅のゆらぎに帰着されるような気もします。確信はありませんが、シーケンサーを使って人工的にゆらぎを発生させてやれば検証可能ではないかと思っています。