SDR

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ヨコハマの時報キャプチャ(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つの例がデータシートに出ていますが、おおむねこのような分類で周波数を網羅できる理由も理解できました。

ADC基板の改版

ADC基板を改版して、またElecrowに製作を依頼しました。 今回は、基板を分離して、(1) FM BPF基板、(2) ADC基板 という二枚構成にしました。 ADC基板がZ-turn boardに接続され、FM BPF基板には+5Vを供給します。

BPF基板は、トラ技2015/4を参考に、76-95MHzを通過帯域とすることを目指しています。

ADC基板は、前回とは以下の部品を大きく変えました。

  • 発振器:前回はSiTimeのMEMS発信器+-5ppm品を使用しましたが、これは結構高かった(7USD程度)のに加え、 推奨3.3V駆動であり、今回は3.0Vにしたかったので、+-1ppmのTCXO(3.26USD)を使用しました。 このTCXOはクリップ正弦波出力なので、インバータ(On semiconductor: NC7SVU04)と1MΩ抵抗フィードバックで発振させるようにしました。 このタイプの発振器は使ったことがないので、一応推奨の使用方法通りの回路としましたが、しっかり動作するか少し心配です。
  • 差動変換:前回はM/A ComのCenter-tapped transformer (MABAES0060)を使用しましたが、今回はLTC2292の推奨回路に従い、 ETC1-1-13という型番のbalunにしました。
  • SMAコネクタ:前回は基板を貫通する、ライトアングルのコネクタを使用しましたが、 各社の評価基板を見てみると、単純に基板エッジのSMAコネクタは、なんだかカッコ良いです。 真似して、今回はエッジタイプのSMAコネクタにしてみました。

その他としては、今回も音声出力用DAC(NAU8822LYG)を載せましたが、いろいろ調べてみたら、 FPGAで比較的簡単に、 同軸デジタル、あるいはS/PDIFと呼ばれるデジタル音声出力ができそうでした。 もっとも、DACとコネクタ含めても部品代は3USDちょっと程度なので、これを削除してデジタル出力のみにしても、 それほどコストダウンはできません。ただ、DAC部はそれほど注意深く設計していないので、 デジタル出力して、外部のDACで変換して音を聞く、というのは実験する意義があるかと思います。 同軸デジタルであれば、RCAコネクタ、S/PDIFであればTOSLINKコネクタを使用します。

TOSLINKコネクタは1,000円以上するかと思っていましたが、 調べていたら100円くらいとお安い(秋月)ものが存在(aitendo)するようですね。digikeyにもありました。 コネクタが高いなら、RCAで良いかと思っていましたが、光だと絶縁できるというメリットがありますからね。

S/PDIFについてはこちらのページも詳しいですね。

それぞれ2枚ずつ製作を依頼しました。これでトータル264USDでしたが、前回のクーポンが使えて、 256.62USDの支払いでした。既に日本円に換算されて、1USD=111.23JPYあたりとなり、 28544JPYでした(送料込み)。

インダクタはこちらが指定した部品を使用してもらえることになりましたが、キャパシタについては Elecrow側が選んだものを使ってもらうことにしました(お値段が高くなりすぎると言われたので…)。 ちょっと特性については心配しています。

以下はおまけのレイアウトです。

ADC基板 (4層 1.6mm)

“ADC rev 0.2”

FM BPF基板 (2層 0.6mm)

“FM BPF”

FM BPF基板の回路図は次のような感じです。

“FM BPF Schematic”

まだ到着まで2週間くらいかかりそうです。

2017/9/12追記: 基板到着しました。2セット製作したので、 1セットは予備で保管しています。試してみたいという方は、twitterでお知らせください。 ご要望が多ければ、再度製作するかもしれません。

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

現在改版したADC基板が届くのを待っていますが、現在の基板の性能データを残しておきたいと思います。

以下はFMヨコハマの時報信号をキャプチャした時のFFTの様子と生データの様子です。

“84.7MHz time signal”

ちょっと検索した感じでは、周波数は分からなかったのですが、1.056kHz程度の信号でしょうか。

理想的には画面上部の信号が正弦波のように見えれば良いことになりますね。 それにしても現状はすごい歪みですね。図の右側の方は多少それっぽくみえていますが、 全体的にかなりギザギザしています。

ADCデータシートの読み方

ADCの性能をちゃんと把握するには、データシートの意味を理解できないといけません。 そのために自分が調べたことをまとめておきます。SDRに関連する、AC性能の指標だけです。

Understand SINAD, ENOB, SNR, THD, THD+N, and SFDR so You Don’t Get lost in the Noise Floor

上記資料に重要なことが上手くまとまっていました。

FFTの読み方

“8192 point FFT”

これは、LTC2291というADCのデータシートからの抜粋です。25MHzでサンプリングし、30MHzの正弦波を入力したデータに8192ポイントのFFTを掛けたものです。このADCは12bitの解像度ですので、SNRは最大でも6.02*12+1.76=74[dB]になるはずです。 でも図を見てみると、ノイズ部分が100[dB]近辺に表れています。

この理由は、上記資料のFigure2から読み取れます。

“FFT Noise Floor”

FFTのノイズフロアの理論値は、SNRの理論値にFFTのプロセスゲインを加えたものになります。 FFTのプロセスゲインは、Mをポイント数とすると、10log(M/2)で求まります。 つまり8192ポイントのFFTであれば、10log(8192/2)=36[dB]がFFTプロセスゲインになります。 この効果のおかげで、ノイズフロアは70[dB]近辺から100[dB]近辺に見えるようになります。

SFDRについて

SFDRとは、入力信号のRMSと一番大きなスプリアスのRMSとの比のことです。 SFDRは、フルスケール比(単位dBFS)と実際の信号振幅比(単位dBc)で表記されます。 この関係についても、上記資料から図を引用します。

“SFDR”

これを念頭に置いてデータシートのSFDRの図を見てみます。

“SFDR vs Input Level”

横軸が、入力信号のレベルになります。つまり、30MHzの正弦波の振幅を大きくしていったときのSFDRが縦軸にプロットされています。 例えば、-60[dBFS]の入力時のSFDR[dBc]は大体-40です。それで、入力信号以外で最も大きいスプリアスのスペクトルは、-60-40で-100[dB]近辺に現れていることになります(はっきりと明記はされていませんが、これも8192ポイントFFTが前提だと思います)。 この100[dB]という値は、dBFSの線の方で描かれています。

結局のところ、入力信号の振幅が大きくなっても、スプリアスの振幅はほぼ一定に保たれる(つられて大きくならない)ということを示すための図といえます。

次に、SFDRと入力信号周波数との関係を示した図を見てみます。

“SFDR vs Input Frequency”

上図から、入力信号の周波数が増すにつれて、SFDRが低下しています。すなわち、最大スプリアスがどんどん大きくなっていく、 ということが分かります。150MHzを超えたあたりで80[dBFS]を下回っています。

別のADCのデータシートから同じ内容を見てみます。

“SFDR vs Input Frequency AD9629”

FM BPFのシミュレーション(3)

前回に引き続き、トラ技の記事の回路をシミュレーションしてみます。 今回はメインとなる、LNA出力部について行いました。

まずは、1MHzから130MHzのゲインの様子です。

“FM BPF 1-130MHz”

次に、54MHzから126MHzまでを拡大してみてみます。

“FM BPF 54-126MHz”

ADC基板のBPFのシミュレーションで試したBPFと比較してみると、 狭い帯域幅で、しかも急峻なフィルタになっていることが分かります。

実際には、LNAの前段にもBPFが入るので、総合すると、 より強力に減衰するようになっています。

FM RFフロントエンドのためのLNA

現在検討しているFM受信のためのRFフロントエンド部で使用するアンプは、 トラ技にあったPSA4-5043+を使用するつもりです。

他にも手ごろで良さそうなものとして、BGU6102というのも候補になっています。こちらの方が安そうですし、しかもdigikeyで購入できるので、 中国の基板屋に頼んでも入手性に問題はなさそうです。

ただ、検討してみると、BGU6102はちょっと微妙になってしまいました。原因はパッドの大きさです。 BGU6102はパッドが小さくて、基板上はおそらく0.2mm四方のサイズになりそうです。 一方、PSA4-5043+は推奨ランドの長辺は0.95mmです。

今回検討している程度の基板なら、できれば両面2層基板で製作したいところです。わざわざ4層というのは大げさです。

でも、Microstrip Line Calculatorで計算してみるとわかりますが、 εr=4.8, h=1.6[mm], t=35[um]で計算すると、特性インピーダンス50Ωを得るには、W=2.82[mm]にもなってしまいます。 4層基板だと、GND層が近いのでhがもっと小さい(例えば0.2[mm])ため、50Ωの線幅は0.33[mm]程度になります。

ちょっと調べてみると、Fusion PCBでもElecrowでも、両面基板で基板厚0.6[mm]というのができるようです(ただ、Fusion PCBだと、0.6[mm]は料金アップで4層に近いお値段になってしまうようです。Elecrowだと料金アップはなさそうです)。

このパラメタを使って、h=0.6[mm]で計算すると、W=1[mm]となります。つまり、配線幅1[mm]で50Ω近くになりそうです。 この幅で配線すれば、PSA4-5043+の端子まで50Ωを維持できそうです。

逆にBGU6102のサイズだと、50Ωの特性インピーダンスを得るには、4層以上の基板で細い配線を使う必要が出てきます。

もっとも、GHzの高周波を扱うわけでもないので、それほどシビアになる必要は無いのかもしれませんが…