前回はCICフィルタを使ったダウンサンプラでした。しかしこれ一発でダウンサンプリングが終わるわけではなかったです。もう一回ダウンサンプリングやってようやく目標のサンプリング周波数まで落ちるんだと。2段目のダウンサンプラではFIRフィルタを使っているのですが、この特性が前段のCICと「補完的」なんだとか。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※教科書として読ませていただいておりますのは、以下の三上先生の御本です。
CQ出版社『Armマイコンでつくるダイレクト・サンプリングSDR』
元記事はCQ出版社トラ技誌の2021年連載です。上記はそれをまとめたPDF版のダウンロードサイトへのリンクです。
前回のCICフィルタの特性
前回はCICフィルタの処理の順番を変えて積分器と櫛型フィルタの中間にダウンサンプラを組み込むことで処理を簡単にする技に感激。
冒頭のアイキャッチ画像のような構成。9:1でダウンサンプルするのでここの通過によりFsは100kHzまで下がります。しかし、CICフィルタの特性をみるとなかなかダラダラしてます。前回、Scilabで計算したCICのローパスフィルタの振幅特性を再掲すると以下のようでした(今回使用はL=3なので黄緑色の線。)
ただし特徴があって、周期的にゲインが急に落ちる穴だか谷だかがあることです。
後段のFIRフィルタの特性
後段のFIRフィルタは、三上先生のPC上のフィルタツールにより係数が計算されてます。三上先生ツールを実際に使い、同等の設定を行って計算してみたものがこちら。
先ほどのCICフィルタと比べると急峻な特性なのですが、ここには現れない部分が存在します。サンプリング周波数100kHzの整数倍のところに上記のエイリアスが「現れる」ってこってす。ここで三上先生のお教えは、
FIRフィルタのエイリアスが現れる周波数はCICフィルタの穴だか谷だかの周波数のところなので相殺しあって消える
んだそうな。これまた黒魔術か?
CIC+FIRの総合特性求めたい
三上先生の教科書の図10には、CICフィルタの特性とFIRフィルタの特性を並べてグラフにした後、2つを重ねた総合特性を3つめのグラフにしたものが掲げられとります。これを自前で計算できたら、黒魔術もシミジミ納得いくってもんでないでしょうか。
CICフィルタ側の特性は曲がりなりにもScilabで計算できている感じっす。FIRフィルタ側の特性を計算し、掛け合わすことができればできるんじゃね、と思い至りました。
FIRフィルタの特性を求めるために書いたコードが以下に。
coef = [ 1.414112E-03 1.777859E-03 1.955856E-03 1.163382E-03 -8.047561E-04 -3.639701E-03 -6.438639E-03 -7.901061E-03 -6.803443E-03 -2.615442E-03 3.991907E-03 1.102213E-02 1.558870E-02 1.488489E-02 7.415483E-03 -5.952321E-03 -2.159831E-02 -3.371720E-02 -3.583729E-02 -2.289379E-02 6.796584E-03 5.037598E-02 1.006114E-01 1.474710E-01 1.807161E-01 1.927341E-01 1.807161E-01 1.474710E-01 1.006114E-01 5.037598E-02 6.796584E-03 -2.289379E-02 -3.583729E-02 -3.371720E-02 -2.159831E-02 -5.952321E-03 7.415483E-03 1.488489E-02 1.558870E-02 1.102213E-02 3.991907E-03 -2.615442E-03 -6.803443E-03 -7.901061E-03 -6.438639E-03 -3.639701E-03 -8.047561E-04 1.163382E-03 1.955856E-03 1.777859E-03 1.414112E-03]; [hzm, fr] = frmag(coef, 256); plot2d('nl', fr, hzm);
なんのことはありません。先ほどの三上先生ツールで吐き出されたFIRフィルタの係数をリストにして与え、それを振幅特性を計算するfrmag()関数で処理して対数グラフとしただけです。
出力結果はこんな感じ。軸の設定が三上先生ツールとは異なりますが「同じ」グラフが描けたみたい。
しかし、Scilab素人はここで行き詰まりました。
確かに振幅特性を計算してくれる関数はあるのですが、上限はナイキスト周波数(Fs/2)までです。わざわざエイリアスを上の方まで何倍も計算してくれるようなオプションは見当たりませぬ。
また、三上先生のFIRフィルタの設計ツール自体、周波数表示範囲の上限は帯域2の上限までに限られます。
どうも、サンプリング周波数の何倍もの周波数のところまで計算してそこで重ね合わせたい、というのは標準的に用意されている関数どもには無理筋みたいっす。知らんけど。
いや~自前で何とかしないと駄目そうね。残念ですが断念しました。まあねえ、どうせエイリアスだから同じ形が折り返されて出てくるだけだし。わざわざ計算しても労力多いだけだし。酸っぱいブドウ。イマイチ納得いかねえけど。