Tweet

超てきとーなディジタルフィルタ設計

octave を使って超てきとーにディジタルフィルタを設計してみました.

仕様

こんな感じのディジタルフィルタを設計してみる.

種類
ローパスフィルタ
ディジタルフィルタ形式
FIRフィルタ
タップ数
32
カットオフ周波数
サンプリング周波数の 1/4

理想の周波数特性を書く

欲しい周波数特性を入力します. エイリアジング成分も忘れないように.

octave:1> y = [ ones(1,8) zeros(1,17) ones(1,7) ];
octave:2> plot ( y );
spectrum_design.png

逆 FFT にかける

逆 FFT にかけます.

octave:3> h = ifft(y);
octave:4> plot(h);
iffted.png

前半分と後ろ半分を入れ替える

逆 FFT の結果の前半分と後ろ半分を入れ替えると,インパルス応答の形になります.

octave:5> h = [ h(17:32) h(1:16) ];
octave:6> plot(h);
sinc.png

Blackman 窓をかける

このまま使うと,遮断域で,最初に指定したポイント以外の周波数で減衰が少なくなるので,窓関数をかけます. 今回は窓関数に Blackman 窓を使ってみます.

octave:7> hb = h .* blackman (columns(h))';
octave:8> plot(hb);
sinc_blackman.png

タップ係数としてはこれで完成です.

設計したフィルタの周波数特性を見る

理想特性を逆 FFT しただけのフィルタの場合,指定していない周波数では十分な減衰が得られないことがあります. また,今回は窓関数を使用したので,窓関数の影響で最初に描いた特性から外れることが考えられます. というわけで,得られたタップ係数の周波数特性を詳細に見てみます.

まず,タップ係数 = インパルス応答の末尾に 0 を水増ししてやります. インパルス応答としては,末尾に 0 が付いても意味は一緒ですね.

octave:9> hb2 = [ hb zeros(1,1000) ];
octave:10> plot (hb2);
sinc_blackman_zeros.png

FFT にかけます.

octave:11> y2 = fft(hb2); octave:12> plot(log(abs(y2)/max(abs(y2))));

spectrum_designed.png

最終的にはこんな感じの周波数特性になりました.

超てきとーな IIR ディジタルフィルタ,の評価

octave を使って,「超てきとーな IIR ディジタルフィルタ」の評価をしてみます. てきとーなのはフィルタの方で,評価じゃないよ. とはいっても,かっちりした評価でもないけれど.

てきとーな IIR ディジタルフィルタ

iir.png

こんな感じの構成の IIR フィルタを考えます. a0 = 0.9 とします.

インパルス応答を計算する

シミュレーションするまでもなく,インパルス応答は

h(n) = a0^(n+1)

ですね.

ということで,結果を直接代入します.

octave:1> h = power(0.9,1:1024);
octave:2> plot(h)
iir_impulse_resp.png

FFT にかけます.

octave:3> y = fft(h);

プロットしてみます.

octave:5> plot ( 20*log10(abs(y)/max(abs(y))))
iir_freq_resp.png

このグラフは横軸がリニアなので妙な形になってますが,対数軸にしてやれば見慣れた -6dB/oct の 1 次の LPF になってるはず.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-03 (月) 17:40:01 (3550d)