サンプリングレートコンバーター

WAV形式の音楽ファイルのサンプリング周波数を変換する方法は、長い間 自分のなかで謎であった。ネットで検索してみるとその方法についての資料があっ たので、それを参考にしながら、サンプリング定理にできるだけ忠実なサンプリング周波数を変換ソフト (651,264 バイト)を 作ってみた。

 世の中のオーディオ用のLSIに内臓されているサンプリングレートコンバーターの音質も、ピンからキリまであると言われている。PCのサウンドボードの CODEC LSIは、基本はDVD再生用で48KHz固定(例えばSoundBlaster Liveボードの 24.576MHz)で動いていて それ以外のサンプリング周波数の信号がきたときは内臓のSRC(サンプリングレートコン バータ)で変換しているみたいだ。一般的に、サンプリング レートコン バーターを通すと音質が劣化するようだ。今回作ったソフトで、リッピングしたサンプリング周波数44.1KHzのWAV形式の音楽ファイルを 48KHzに変換したものと、音の聞き比べをおこなってみたが、ノイズ感が少し良くなって(fsが上がったせいかも)音がより見えてきたような気がする が、錯覚かもしれない。叉は、サウンドボードのSRCとの差かもしれない。サンプリング周波数を変換した後の信号をスペアナで周波数分析すると高調波ぽい 信号がい くつも発生しているようだ。変換には時間 がかかる。途中で待ちきれずに ソフトを終了 できるように、計算部分のソフトはスレッドを使っている。

 本来の目的ではないが、上記の音の変化(改善?)は、もとの音源に種類によって効果が見られない場合(帯域がナローなもの?)もあるが、サンプリング周 波数を変換しなくても(44100Hzのまま) 帯域に制限する目的で導入した低域通過フィルターを通すだけでも効果があるようである。デフォルトでは 0.9(44100Hzの場合は、(44100/2) * 0.9 =  19845Hz)がカットオフ周波数であるが、これを更にもっと低い値(例えば、0.73で約16KHz)にしても音質が変化するような気がする。帯域制 限幅がより狭く厳しくなるので、見かけ上サンプリングの間隔が短くなり、サンプリングした波形が(アンチエイリアスのアナログのフィルターを通すまえにす でに)もとの形の波形に近づいているからなのかもしれない。 叉、192KHzサンプリングの音源では、デフォルトの0.9のままで効果があるようだ。サンプリング周波数の約半分のフィルターで信号を叩き直すことに意味があるのかもしれない。

余談であるが、この変 換ソフトの名前を src01に変更すると起動時の警告メッセージは表示しなくなる。




理論

離散信号から任意の時間の信号を求めるには、
  ①サンプリング周波数の半分(ナイキスト周波数)以下の帯域に制限した離散信号に、
  ②前後ずらして行ったsinc 関数(標本化関数ともいう)の係数を乗じたものを ひたすら積和計算する。
すれば、任意の周波数から任意の周波数に変換できる ことが分かった。但し、計算量が膨大になる問題がある。

アップサンプリングのため、離散信号の間に零を挿入する0補間の方法がなぜか、学生時代から ずーと 自分では理解(納得)できないので、今回も使ってい ない。波形ひずみの少ない直線位相のFIRファイルターで低域通過フィルターをして帯域を制限したあと、ひたすらSINCを計算して信号の積和計算をした だけものである。計算時間はかなりかかる。ちなみに、SINCの値をプロットしてみると下図のようになる(零のときは値は1になる。下図では前後200ま までプ ロットしてある)。積和計算する前後の数を増していくと 変換後に発生 する高調波成分も だんだんに小さくなって行くようであるが(1KHz SINを変換したときの高調波の発生の様子、NSTEPは積和計算する前後の個数)、反面、計算時間が膨大になる。はじめは前後200個としてい たが、 途中から前後 500個の積和計算に変更した。音の分解能が増す?のは錯覚かな。 また、入力のサンプリング周波数が2倍になった場合、計算に寄与する時間区間を同じにするためには(同じ効果を得るためには)、2倍高い前後1000個になる。




また、帯域制限のための低域通過フィルターの特性は、通過域0.9(=(44.1KHz/2)x0.9=19.845KHzまで)、減衰値100dBとし てみ た。これだけ減衰すれば問題ないだろう(多分)。次数は259の、フィルターには直線位相のFIRフィルターを、また、窓には減衰量にあわせて窓を調整し ていくカイ ザー窓をつかった。


 もし万一、音が分離しそれぞれがとげとげしくなったと感じたならば、低域通過フィルタの減衰量を140(デフォルトの値は100)に変更してみると、 (フィルタのスパンが大きくなり影響を与える時間長がながくなる分)音がよりまざってマイルドな音になるかもしれない。また、24ビット出力のオプションも作ってみたが、16ビットより24ビットの方が音質の劣化が少ない(音がいい)ように感じた。

作ったソースファイル

低域通過の直線位相のフィルターを掛けると、そのインパルス応答の重みで積分加算される。たとえると、細い線に上に何度も線を上書きした線の集まりのよう になって輪郭がはっきりするようなものだ。強調され分 その反面、音の鋭さや音楽のアタック感が失われる。周波数が高い音では、たとえるとリンキング波形 が追加されたようになり、つんと やけに強調された音になる。これを嫌って、アンチエイリアス低域遮断フィルターには最小位相のものを使っているものもあるようだ。直線位相フィルターのプリエコーは自然界にはない不自然な効果?といわれているので、 低域通過のフィルターに擬似的な最小位相のフィルターも選択できるチェックも追加してみた。音の変化はより素直の感じになる。

昔のアナログのフィルターは位相遅れも(デジタルに比べて)小さいし、遮断特性の傾斜もそれほど鋭くない。逆に特性が高精度しすぎると ゆがみ(リンキン グ 又は 位相回り)が大きくなって音に悪影響してしまうようだ。まったく同じにできないが、例えば遮断量は-150dB程度でリンキングを減らすため最 小位相特性 の係数時間変化するLPF処理のような、ほどほどがよいみたいだ。



また、自分が使っているDUAL COREのCPUで計算するため、フィルターを計算する部分を2つのスレッドをもうけて、2個のファイル分を 同時に計算できるようにしたものも作ってみた。
更に、サンプリング周波数fsを4倍の信号に変換する場合(例えば、44.1KHzを176.4KHzにするとき)に限っては、FFTによるオーバーラップアド法によって計算時間を短縮するオプションも選べるようにした 。そのソフトとソース


最後に、フィルターを使わない、FFT法による2倍のアップサンプリングのソフトも作ってみた。もっぱら、44.1KHz16bitのWAVファイルを2倍の88.2KHzに変換してNOS DACで聞いている。変換した後の音はどうしてもいろいろな癖?がついてしまうものだが、作った中では一番?かもしれない。(動作説明はこちら


設計の参考になる資料


そのほか参考になる資料


免責
(1)プログラムやデータの使用により、使用者に損失が生じたとしても、 その責任 を負いません。

(2)プログラムやデータにバグや欠陥があったとしても、修正や改良の義 務を負い ません。