前回「三上先生ツール」のおかげでSDRのAM受信機の動作は復調までバッチリ、と思ったらいつもの早合点でした。そのままDAしたらスピーカがならせると思うなよ、という感じです。CICフィルタのせいで減衰している高域を持ち上げ、信号に載っている直流成分を除去し、受信強度による音量の変動をAGCすることが必要だと。先は長い。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※教科書として読ませていただいておりますのは、以下の三上先生の御本です。
CQ出版社『Armマイコンでつくるダイレクト・サンプリングSDR』
元記事はCQ出版社トラ技誌の2021年連載です。上記はそれをまとめたPDF版のダウンロードサイトへのリンクです。
Scilabのインストールのやり直し
本シリーズではフィルタの特性などを「味わう」ために、時折、Scilabまたは、Octave(Matlabを買うお金がないデス)を使わせていただいております。今回もScilab使って伝達関数からゲインプロットを描きたいと思っておりますが、前回から今回の間で、使用パソコンをWindows10機からWindows11機に更新しとります。
以下のScilab様のサイトから、ダウンロード、インストールを行いました。
上記のページを拝見するに、対応はWindows Vista、7、8、10と書かれており若干の不安がありました。でも今のところWindows11上でフツーに動いている感じです。大丈夫か?
I、Q信号から復調後にやらねばならないこと
先ほど書きましたとおりI,Q信号から復調後にやらねばならないことがいくつかあります。その第1が前回の三上先生ツールのグラフの「復調信号」のところに小さく書いてありました。
復調信号(直流分を含む)
です。IとQをそれぞれ二乗して足してルートをとると、ほれ以下のように、振幅AにDC成分が足されておるのでした。
よって、Vdcを求めて、差っ引いてAを求めるという工程が必要だったんであります。
それだけではありません。第2の問題はCICフィルタで「ロウパス」しているときに、本来元気よく通過してほしかった音声周波数の「高いところ」まで余計に落としてしまっていることみたいです。ここを補償してやらないとなんだかな~という音声になってしまうと。
そして第3は、放送電波の受信強度の変動に起因する音量の変動に対抗するため音量のAGC(Automatic Gain Control)をせにゃならんと。
メンドイな~とぶー垂れていたら、なんと第1と第2はまったく同じブロックダイアグラム(冒頭のアイキャッチ画像)、ということは同じ伝達関数のフィルタでできてしまうと。狐(三上先生)に化かされている?
ミソは、Vdcを求める(差っ引く前段階)ためには、1に近いaを使い、高域成分を補償する場合は マイナスで大き目のaを使うというところ。
高域補償フィルタの特性
Scilabで高域補償フィルタのゲイン特性を計算するためのプログラムが以下に。
// High Band Emphasis Filter // H(z) = (1-a)/(1-a*z^-1) clc; clear(); clf(); a=-0.525 Hz = syslin('d', (1-a)/(1-a*%z^(-1))) gainplot(Hz, 0.05, 0.5) xtitle("High Band Emphasis Filter 正規化周波数 Gain Plot")
上記を使って描いた振幅特性が以下に。
本当は、何回か前に計算しているCICフィルタのロウパス特性と合わせてちゃんと「だいたいフラット」になるかどうか計算すべきなのですが、PC取り替えていろいろメンドイのを理由にパス。
DC抽出フィルタの特性
DC成分を除去するために、まずはDC成分を抽出するためのフィルタが以下に。これで抽出した成分を元の信号から差っ引いてやれば「除去」ということです。
ここでよくわからない事態が勃発。本来a=0.9995で、もう少しDC(周波数0Hz)に近いところまで計算したかったのですが、gainplotが受け付けてくれませぬ。なんでだ?今のところ理由わからず。
しかたがないので、aの値を少し大きくしてDC付近で0dBとなるところまで描きました。
// DC extract Filter // H(z) = (1-a)/(1-a*z^-1) clc; clear(); clf(); a0=0.95 a1=0.995 a2=0.9995 a3=0.99995 Hz0 = syslin('d', (1-a0)/(1-a0*%z^(-1))) Hz1 = syslin('d', (1-a1)/(1-a1*%z^(-1))) Hz2 = syslin('d', (1-a2)/(1-a2*%z^(-1))) Hz3 = syslin('d', (1-a3)/(1-a3*%z^(-1))) gainplot([Hz0; Hz1; Hz2; Hz3], 1e-4, 0.5) hl=legend(['0.95', '0.995','0.9995','0.99995'],3) xtitle("DC Extract Filter 正規化周波数 Gain Plot")
正規化ゲインプロットが以下に。まあ、DC付近は通すけれどもちょいと周波数が高くなると通らないことはわかりますな。ほんとか?
ぐだぐだな結果だけれども(いつものことだし)まあいいか。はやくPCがフル稼働できるように環境整えないと。PC取り替えるのも楽でないな。