FM復調(モノラル)の実装
前回までに、ADCでキャプチャした生データをパソコン上で処理することで、 AMラジオが視聴できることが確認できました。
加えて今回はFMも復調できるようになりました。
FM復調の流れは、次のようになります。
- ADCデータ(12bit@40MHz)に、チューニングしたい周波数のsin,cosを生成(NCO)してそれぞれ掛け算してI, Qデータを得る
- I, Qデータを4ステージCICフィルタで1/32に落とす(1.25MHz)
- 続いてFIRフィルタで2/5倍(500kHz)に周波数変換する。2/5倍で使用する係数は255タップ、遮断周波数0.08fs(fc=200kHz)とする。
- 500kHzサンプリングのI, Qデータの隣り合ったサンプル同士からarctan(タンジェントの逆関数)をもとめる。 具体的には、Math.Atan2(i[x-1]*q - q[x-1]*i , i[x-1]*i + q[x-1]*q )を求める。 I, Qを複素平面のx,y座標とみなして、C とするとき、arctan(C[x+1]/C )を求めることで、サンプル間の偏角の変化量を求めることになります。
- 上記の偏角の変化量をFIRフィルタで2/5倍(200kHz), 3/5倍(120kHz), 2/5倍(48kHz)に周波数変換する。 係数はすべて255タップ、遮断周波数はそれぞれ0.08fs(fc=80kHz), 0.08fs(fc=48kHz), 0.0625fs(fc=15kHz)とする。0.0625fsとすることで、15kHz以下を通過させるLPFとなります。 19kHzにステレオ放送用のパイロット信号が入っているので、その前の段階で十分に減衰できるようにします。
- 48kHzまでサンプルレートが落とされたデータ系列に対して、デエンファシスをかける。具体的には、 Low-Pass Single-Pole IIRフィルタを通します。 上記ページによれば、減衰量dはd=e^(-2pifc)という関係になるようです。fs=48kHzなので、大体3kHzで-3dBになればよいようなので、 fc=3kHzとし、d=e^(-2pi(3/48))=0.67523…となります。
- デエンファシス後のデータを(適当にゲイン調整を行ってから)WAVファイルに出力する。
上記のように、FMでのステレオ復調は行っていません。これでなんとか音声として聞こえるようになりました。 各フィルタの遮断周波数は、変換後の1/2fsよりもそれなりに小さいところで設定しておかないと、折り返しがもろに入ってしまうと思われます。 そのため、上記のように1/2fsの80%, 62.5%と設定しています。
ここまでで、曲がりなりにも論理的にはAM/FMの復調ができることは確認できました。すぐに思いつく今後の方向性としては
- FPGA化
- ADCの精度確認と改善
があります。後者は機材をそろえたり、受動部品の定数を変更したりしてみないと難しいと思われるので、 ひとまずFPGA化の方を少しずつ進めていこうと思います。また、基板上には音声出力用のICも搭載しているので、 そちらの動作確認もしないといけません。