5.デジタルフィルタ係数の検討
今回作成したプリエンファシスの私の設計方針としては、理想プリエンファシス曲線からの偏差を0.5dB以内にすることと1kHzで入出力関係を1:1、すなわち利得を0dBにするというものです。このフィルタで、1kHzの通過利得はかなり小さくなってしまうので、通過利得を0dBとするために調整(下図G)する必要があります。
作成したプリエンファシスのブロック図
このブロック図の係数k、b、Gの3つを導出するため理想プリエンファシス特性との偏差のグラフを作成し、それらが最小になるよう3つの係数をカットアンドトライで決定しました。とはいえ、3つのパラメータのうち周波数特性そのものに影響するのは2つしかないうえ、理想値との偏差をエクセルのmaxやmin関数で表示させながら作業したのでそれほど難しくありませんでした。
グラフ作成には、エクセルを使います。たとえば、10Hzから100kHzまでを任意の間隔で振幅を計算します。振幅は、対数を取ってdB表記にすると見やすいです。
理想値との偏差は、kを1に近づけるほど小さくなる傾向のようですが、そうすると1kHzでの減衰量が増える傾向になります。FPGAでは24ビットの固定小数点演算を想定しており音声データのビット落ちが心配でしたが適当なところで妥当な特性が得られたのでそれ以上は深追いしませんでした。
今回の設計値(fs=152ksps)
k 0.75
b 0.04541
G 20.875
理想プリエンファシス特性との偏差
10Hz~15kHzで約±0.3dB(1kHz基準)
6.FPGAへの実装 ステートマシンを組んで、フィルタのブロック図通りレジスタへの足し算引き算を繰り返すだけですが、そのまま実現するには、k, 1-k, 1+b, Gの4つの乗算操作が必要になります。これを左右2チャンネル分なら都合8組の乗算が必要でハードウエアのコストが増えてしまいます。
しかし、今回の製作ではプリエンファシス処理のサンプルレートは192kHz、システムクロックは38.912MHzと1サンプルの処理に256クロックもの時間があります。さらに係数そのものは一定なので乗算する2進数の係数をビット毎に分解して、そのビットとの乗算に相当するビットシフトと加算を繰り返しり乗算と等価な演算を行いました。
先ほどの係数を例にとり、2進数に変換すると・・・
k 0.75 → 0.11
b 0.04541 → 0.00001011101
G 20.875 → 10100.111
ここで0.11との乗算は、2進数で1ビット右シフトと2ビット右シフトの和と同じですので、乗算器を使わずとも2回の加算で同じ結果が得られます。
2009年7月3日金曜日
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿