2009年12月29日

サンプリングレート変換について

おはようございます。たてべです。
12月はまったく音沙汰なしという状況でしたが、微妙に周りが立て込んでいまして、記事のネタもそれほどあったわけではなかったので、放置していました。ごめんあそばせ。

さて、この間、ちょっとした知り合いとお話をしていまして、ディジタルエフェクトやモデリングアンプなどのA/D変換部の話題になりました。「96 kHzサンプリングでA/D変換しても、ディレイやリバーブなどは緻密なエフェクトを掛けられないのでは?」という意見を聞きました。そこでディジタルエフェクトのA/D変換入力サンプリング周波数と内部処理時のサンプリング周波数は、必ずしも同じではないと説明しました。要するに、大抵のディジタルものは、内部でアップサンプリングしているということなのです。そんあことできるの?じゃあ、どうやってやってるの?ということを簡単に説明します。

この記事は、ディジタル信号処理についての知識がないと、さっぱりわからないかもしれませんので悪しからず。

まず、A/D変換器の出力である離散信号系列をx[n] (n=0, 1, ..., n, ...)とします。ここでnは離散時間を表します。離散時間というのは、サンプリング周波数をfsとしたとき、1/fs×[整数]で表される時間のことです。離散時間について細かく説明すると記事が冗長になるので、ここでは物差しの1 cmの区切りとでも思って下さい。

さて、ディジタルエフェクトの内部では、この離散信号系列x[n]に色々な係数を掛けたり足したり引いたりします。ありがちなリバーブであれば、指数関数expを畳み込んだりするのだと思います。話を戻してアップサンプリングはどうやるのかということを説明します。ここで説明するアップサンプリングは、たてべの知る限り、一番一般的なものです。もっとよい方法があるのかもしれませんので、参考程度に聞いて下さい。


例:48 kHzサンプリングで収録した離散信号系列x[n] (n=0,1, ..., N-1)を96 kHzサンプリングに変換したいとき

とりあえず、実際の処理手順についてだらだら書いてみましょう。

1. x[n]の2倍の長さのデータ長を持つ信号系列y[m] (m=0, 1, ..., 2N-1)を用意する。このとき、y[m]にはすべて0を入れる。3倍オーバーサンプリングしたければ3倍のデータ長を用意する。

2. y[m]にx[n]を放り込む。ただし、2倍にオーバーサンプリングしたければ、1つ飛ばしに代入する。数式で書くと、y[2n]=x[n]となる。つまり、元の信号と信号の間に隙間を用意する。これがアップサンプリングになる。

3. このままでは高調波の歪みが乗ってしまうので、元のサンプリング周波数の1/2未満のカットオフ周波数を持つローパスフィルタで、高調波の歪みを除去する。

4. 以上の操作により、2倍のオーバーサンプリングが達成される。


こんな感じです。実際には2倍なんてせせこましいアップサンプリングはせず、64倍や128倍の変換をしています。聡明な方は、ここで「出力するときはどうするんだ?アップサンプリングしたままなのか?」と思われるでしょう。出力するときは、デシメーションといって、ダウンサンプリングします。デシメーションというのは、簡単にいうと信号の間引きです。2倍のオーバーサンプリングであれば、信号を1つ飛ばしで選んで出力します。

この手のお話に興味があれば、ディジタル信号処理の本を読めば、いくらでも書いてあります。気軽に読めるものではないかもしれませんが、本屋さんで立ち読みしてみて下さい。


何の話でしたっけ?そう、アップサンプリングはこういう風にやっています。ですが、所詮はアップサンプリング、元の信号以上の情報というものは引き出せません。アップサンプリングしたからといって、調波構造が美しくなるとか、振幅のダイナミックレンジが広くなるといったものではありません。あくまで時間分解能が向上するだけですので、悪しからず。

posted by たてべ at 10:41| Comment(0) | TrackBack(0) | Miscellaneous | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/136841589

この記事へのトラックバック