FMステレオ復調を実装

やっとFMステレオ復調処理を実装しました。処理としては、 ディジタルFMステレオ・チューナの製作 ―― 雑誌の付属基板でここまでできる(ステレオ復調回路)にある通りです。

今回の実装について以下に説明しますが、勘違いしている可能性もありますので、 ご自分で確認してください。

DDSのIPを置いて、位相を可変とした19kHzのsin, cos信号を生成します。 cos信号とFM復調信号を掛け算し、その結果をLPFに通します。 LPFは、CICでfsを1/20にして(fs=500kHzからfs=25kHzに)、続いてFIRでfc=1kHzのフィルタを掛けました。 そして、この値に応じて、DDSで発振する19kHz信号の位相を進めたり遅らせたりします。

具体的には、パイロット信号をsin 19kHzとすると、三角関数の公式により、 sin x * cos y = 1/2 * {sin(x-y)+sin(x+y)} です。今回は、sin 19kHz * cos 19kHz = 1/2 * {sin(0) + sin(38kHz)} となります。LPFを通すことでsin(38kHz)は0になりますので、sin(0)だけが残ります。 つまり、パイロット信号と同調したcos信号が得られれば、sin(0)=0となります。 ただし、sinが0となるのは、0(x=yのとき)とπ(x=y+πのとき)がありますが、今回は0になるようにします。 それで、sinが正であれば、cosの位相(y)を増やし、sinが負であれば、 cosの位相を減らして、sin(x-y)のx-yが0となるように制御しました。

このようにsinのパイロット信号に対してcosの信号が得られたら、倍角の公式 sin 2x = 2 sin x * cos x により、DDSのsin, cos信号を掛け算することで、パイロット信号に同期した38kHzの信号が得られることになります。

あとは、この38kHzの信号をFM復調信号に掛け算し、LPFを通すことでL-Rの信号が得られます。

この状態で時報信号をキャプチャしたものが次になります。

“FM横浜時報信号”

ちょっと分かりにくいですが、上側のグラフは、左右の音声を別々の色で描画しています。 時報信号だと恐らく左右同じ音声信号になってしまっているので、ほとんど重なってしまい、 分かりにくいです。

実際に聞いてみて、確かにこれまでより奥行きが感じられるようになりました。 ただ、この実装がどれほど正しいかは、上のグラフだけでは分かりません。 本来であれば左だけ、右だけの音声を復調してみて、それが正確に再生されるか確認する必要があります。 ただ、手ごろなFMトランスミッタを持ち合わせていないので、このような確認まではできていません。

平行線を使ってFMアンテナ製作

これまでは、次のようなアンテナでFM放送を受信していました。

“FMロッドアンテナ”

これだと、色々向きを変えたりしても、何とか聞けているかな、といった感度でした。 もう少し何とかしたいと思い、アンテナを製作してみることにしました。

次の情報を参考にしました。

製作に当たり、以下のものを購入しました。

部品代は合計886円(端子台は2個購入)でしたが、送料が486円もかかりました。 ちなみに、メール便だと上記アイテムは送れないということで、ヤマトで送られてきました。

製作したアンテナの全体は次のような感じです(設置前)。

“新しいアンテナ”

平行電線を解いて、水平に設置しました。どれほどの長さを解くか悩みましたが、 ひとまず現状は72cmにしてみました(開いて144cm)。

電線は分かれているところの根本で同軸ケーブルに接続したほうが良いのかと考えましたが、 今のところ電線を解かずに、さらに1.5mくらい伸ばして下記のように端子台に接続しています。

“端子台拡大”

端子台のプラス側に赤線を接続し、マイナス側に黒線を接続します。 また、SMA-P変換アダプタを接続して、LNA基板につながるようにします。

早速、FM放送を受信してFFTしてみました。

“FM FFT”

以前のアンテナは次のような感じでした。

“old FM FFT”

以前のアンテナだと90MHzを超えたあたりから、かなり減衰していたので、 LNA基板のBPF帯域の設定が悪かったかと思っていましたが、 そもそもアンテナで受信できていなかったように思われます。

また、これまでのアンテナでは、Zynqの搭載されている基板の電源インダクタを手で触るだけで、 かなりのノイズが入ってしまいました。一方、今回のアンテナだと、 触ってもそれほど変化ありません。そのときのFFTの様子も示します。

“FM FFT touching inductor”

ノイズフロアはかなり上がっています。

新しいアンテナだと、81.3MHz, 82.5MHz, 84.7MHz, 89.7MHz, 90.5MHz, 91.5MHzあたりが、 それなりに受信できているようです。

これくらい聴けると、ようやくステレオ復調を試みても良いかな、と思えるようになりました。 やはり、無線はアンテナ肝心という、ごく当然のことが確認できました。

最後に、またまたFMヨコハマの時報キャプチャを載せておきます。

“FM Yokohama Time Signal”

時報信号の高調波のようなものも見えています。もう少し拡大したのが次になります。

“FM Yokohama Time Signal”

これまでのアンテナだと、次のような感じでした。

“FM Yokohama Time Signal with Old Antenna”

アンテナを改善したことで、かなり綺麗なサイン波になっていると思いますが、どうでしょう。

FMヨコハマの時報キャプチャ(2)

改版したADC基板にて、 再度FMヨコハマの時報信号をキャプチャしてみました。

“84.7MHz time signal”

今回もデータはイーサネットで取得していますが、AliExpressからフェライトコアを入手して、 ケーブルをコアに巻いてコモンモードノイズ除去しています。

前回の基板での時報信号と比べてみると、 ノイズフロアがだいぶ下がって、10dBくらい良くなっているようです。

FM ADC基板 rev0.2到着

Elecrowに発注していた基板が先日到着しました。今回は、前回と異なり、発送前に確認用の写真を送ってくれました。 実物を見ると、写真より大分小さく感じます。

“基板2種”

小さいほうの基板が、FM帯域のBPF基板です。+5Vを供給します。左側のSMAにアンテナを接続し、 右側のSMAからフィルタ、増幅された信号を出力します。

BPFとADC基板はSMAケーブルで接続します。

大きいほうの基板がADC基板です。左側のSMAはトランスによる差動変換回路も含むFM用入力です。 下側SMAコネクタはシングルエンドのままADCに入力されます。AM信号などの取り込みが可能です。

ADCコネクタは、これまで同様Z-turn boardに接続しますが、 rev0.1基板とは逆側の80pinに接続するように設計しました。

電源、クロック発振も問題無いことを確認しました。

くみ上げた状態で、生信号(サンプリングレート40MHz)をPCで取り込んでFFTした画面が以下になります。

“0-20MHz FFT”

一方、ADC基板に信号を入力しない場合のキャプチャとFFTは以下になります。

“0-20MHz FFT w/o antenna”

これとrev0.1基板での信号も比較してみると、 rev0.1基板ではアンプによる増幅が必ず行われるので、アンテナ未接続時もそれなりのノイズがみられましたが、 今回はADC基板側にはアンプは載っていないので、+2から-1程度の範囲内で信号が取れています。

実際に動作させてみたら、イーサネットケーブルを接続したときと、JTAGケーブルを接続したときで、 ノイズがかなり混入します。それぞれのノイズの周期は異なる感じで、 イーサネットの方はかなりホワイトノイズのように聞こえますが、JTAGケーブルは数Hz程度でノイズが入ってきます。 なかなかノイズ対策は難しいですね… イーサネットは電源線は無いはずですので、ディファレンシャルノイズではなくて、 コモンモードノイズ(参考1, 参考2)が入ってきてしまうのでしょうか?

それと、今回の基板から、BPFとADCの距離を離せるようになったので、距離を色々変えてみましたが、 当然のことながら、離せば離すほど、ノイズは減少します。

というわけで、デバッグ用のケーブル類は一切接続せずに、単体で動作させると、それなりに良い音が得られています。 でも、できればデバッグしながら音も確認したいですので、ちょっと困りました。 JTAGは接続しないでも動作するようにすれば良いとして、データダンプ用のイーサネットはできれば繋いでおきたいです。

2017/9/12追記:イーサネットの代わりに、ZynqをUSBデバイスとして動作させて、USB経由でデータダンプを行えば良いと気づきました。 元々、USB2.0だと480Mbps止まりだけど、イーサだと1Gbpsまで行けるだろうという目論見で、Linuxを動作させてイーサを使用しましたが、 実際のところ1Gbpsの50%も出ていないようです。40MHzで12bitデータを取り込むとなると、480Mbpsとなり、 しっかりチューニングしないと転送は難しそうでした。そういうわけで、現状は一旦DDRメモリに一定量をためてから転送しています。

したがって、USB経由でデータ転送を行ったとしても、現状と使い勝手はほぼ変わらないと考えられます。それに、 USBガジェットとしての動作であれば、わざわざLinuxを使用しないでも、FreeRTOSで十分です。

ADCのフロントエンドの設計

ADCの分類方法として、アナログ信号の入力部にバッファがあるか、無いかというものがあります。 後者は、スイッチキャパシタ方式と呼ばれています。文字通り、キャパシタにスイッチが付いていて、 クロックのHigh, Lowに合わせてスイッチが開閉することで、電荷を蓄積し、 その電荷をデジタル値に変換するという動作をするようです。

それぞれのタイプには、以下のような利点と欠点があります。

利点 欠点
バッファタイプ アナログ入力部のインピーダンスが一定なので、設計しやすい 消費電力が大きい
スイッチキャパシタタイプ 低消費電力 アナログ信号の周波数に応じて、入力インピーダンスが変化する

スイッチキャパシタタイプを使用する場合には、フロントエンド部の設計にも気を遣う必要があります。 それについて、Analog DevicesのAN-827(日本語)(英語)とAN-742(日本語)(英語)が参考になりました。

キャパシタに電荷をためる段階をtrack-modeと呼び、電荷を保持する段階をhold-modeと呼びますが、 track-modeのインピーダンスマッチングを取ることが必要です。 とりわけ、インピーダンスのうち、キャパシタ由来の虚数成分を、フロントエンドでインダクタを使用して打ち消すことが結構重要のようです。資料には、その定数の求め方の計算例が出ていました。

また、資料中の図から、200MHzあたりを超えるとインピーダンスは実数成分、虚数成分ともにそれほど変化していないようです。 100MHz以下の領域では周波数に依存して大きく変化しています。

現在使用しているADCであるLTC2292も、フロントエンドの推奨として、70-170MHz, 170-300MHz, 300MHz以上という3つの例がデータシートに出ていますが、おおむねこのような分類で周波数を網羅できる理由も理解できました。

« 3/8 »