Tweet


[[下書き]]
* サンプリングレート変換 その4 [#g69007eb]

いままで「高い周波数成分を除去」と書いてきました.
そのような働きをする回路は「フィルタ」と呼ばれています.
エアコンやコーヒーのフィルタと同じように必要なものは通し,不要なものは通さない働きをします.

** トランスバーサルフィルタ [#r79b1bfa]

「トランスバーサルフィルタ」のブロック図を下に示します.

#ref(transversal.png,center)

ざっくり説明すると
- x(nT) が入力サンプル列
- [T] というのは「遅延素子」.入力に対し1サンプル前の値を出力します.
-- 時刻が経過するごとの遅延素子列の出力値を図の下に書いておきました.動作を追ってみてください.
- △は乗算器.入力に対し△の中に書いてある値を掛け算した値を出力します.
- 「○に+」は加算器.全ての入力を足し合わせて出力します.
- y(nT) がフィルタの出力

です.

** プログラムで書くと [#c7907aed]

ブロック図ではピンと来ない人のためにプログラムで書くとこうなります.
perl です.

 #!/usr/bin/perl
 # 
 # transversal.pl: トランスバーサルフィルタ
 # 2008 (c) by Kunihiko IMAI
 #
 # You can use, modify, re-distribute or re-license this program freely.
 #
 
 # タップ係数
 @a = ( 1, 1, 0, 0, 0 );
 
 # 遅延素子列
 @x = ( 0, 0, 0, 0, 0 );
 
 while ( <> ) {
     unshift @x, $_;		# 遅延素子列の左にに入力を追加
     pop @x; 			# 遅延素子列の右からはみ出たサンプルを削除
 
     # 出力値を計算
     $y = 0;
     for ( $i = 0; $i <= $#a; ++$i ) {
 	$y += $a[$i] * $x[$i];	# 乗算器の出力を足し合わせる
     }
     print "$y\n";
 }
 exit 0;

ありゃ,説明用のつもりがちゃんと動くプログラムができてしまった (^^;
というわけで,つかいかた.

入力となるサンプリング列をファイルにします.
書式は
 0
 1
 2
 1
 0

と,1行1サンプルです.

これをこのプログラムに通すと,トランスバーサルフィルタの出力が得られます.

 $ ./transversal.pl input.txt

** 余談: 積和演算 [#j0a3fe7d]
上のプログラムの while {} ループ, for {} ループの一番内側には
 $y += $a[$i] * $x[$i];
という処理があります.
この処理を特に「積和演算」と呼ぶことがあります.

SoC の宣伝文句で「積和演算命令を追加しマルチメディア処理を強化」とか謳っているのはまさにこれです.
ループのもっとも内側にある処理を最適化することで処理を速くしよう,という考えですね.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS