Tweet


* 超てきとーなディジタルフィルタ設計 [#ba56b7ba]

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

** 仕様 [#md0ab691]

こんな感じのディジタルフィルタを設計してみる.
:種類|ローパスフィルタ
:ディジタルフィルタ形式|FIRフィルタ
:タップ数|32
:カットオフ周波数|サンプリング周波数の 1/4

** 理想の周波数特性を書く [#na6e49a5]

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

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

#ref(spectrum_design.png,center)

** 逆 FFT にかける [#dcf0f5dd]

逆 FFT にかけます.

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

#ref(iffted.png,center);

** 前半分と後ろ半分を入れ替える [#e35a4628]

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

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

#ref(sinc.png,center)

** Blackman 窓をかける [#l8fa7b65]

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

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

#ref(sinc_blackman.png,center)

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

** 設計したフィルタの周波数特性を見る [#y2e871eb]

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

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

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

#ref(sinc_blackman_zeros.png,center)

FFT にかけます.

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

#ref(spectrum_designed.png,center)

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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS