超てきとーなディジタルフィルタ設計 †octave を使って超てきとーにディジタルフィルタを設計してみました. 仕様 †こんな感じのディジタルフィルタを設計してみる.
理想の周波数特性を書く †欲しい周波数特性を入力します. エイリアジング成分も忘れないように. octave:1> y = [ ones(1,8) zeros(1,17) ones(1,7) ]; octave:2> plot ( y ); 逆 FFT にかける †逆 FFT にかけます. octave:3> h = ifft(y); octave:4> plot(h); 前半分と後ろ半分を入れ替える †逆 FFT の結果の前半分と後ろ半分を入れ替えると,インパルス応答の形になります. octave:5> h = [ h(17:32) h(1:16) ]; octave:6> plot(h); Blackman 窓をかける †このまま使うと,遮断域で,最初に指定したポイント以外の周波数で減衰が少なくなるので,窓関数をかけます. 今回は窓関数に Blackman 窓を使ってみます. octave:7> hb = h .* blackman (columns(h))'; octave:8> plot(hb); タップ係数としてはこれで完成です. 設計したフィルタの周波数特性を見る †理想特性を逆 FFT しただけのフィルタの場合,指定していない周波数では十分な減衰が得られないことがあります. また,今回は窓関数を使用したので,窓関数の影響で最初に描いた特性から外れることが考えられます. というわけで,得られたタップ係数の周波数特性を詳細に見てみます. まず,タップ係数 = インパルス応答の末尾に 0 を水増ししてやります. インパルス応答としては,末尾に 0 が付いても意味は一緒ですね. octave:9> hb2 = [ hb zeros(1,1000) ]; octave:10> plot (hb2); FFT にかけます. octave:11> y2 = fft(hb2); octave:12> plot(log(abs(y2)/max(abs(y2)))); 最終的にはこんな感じの周波数特性になりました. 超てきとーな IIR ディジタルフィルタ,の評価 †octave を使って,「超てきとーな IIR ディジタルフィルタ」の評価をしてみます. てきとーなのはフィルタの方で,評価じゃないよ. とはいっても,かっちりした評価でもないけれど. てきとーな IIR ディジタルフィルタ †こんな感じの構成の IIR フィルタを考えます. a0 = 0.9 とします. インパルス応答を計算する †シミュレーションするまでもなく,インパルス応答は h(n) = a0^(n+1) ですね. ということで,結果を直接代入します. octave:1> h = power(0.9,1:1024); octave:2> plot(h) FFT にかけます. octave:3> y = fft(h); プロットしてみます. octave:5> plot ( 20*log10(abs(y)/max(abs(y)))) このグラフは横軸がリニアなので妙な形になってますが,対数軸にしてやれば見慣れた -6dB/oct の 1 次の LPF になってるはず. |