最近作っているもの紹介第2弾です。LPC-Link2でFM受信機の作成にチャレンジしていたのですが成功しました。MCUのソフトウェアのみの実装によるダイレクトコンバージョンで、FM放送を受信できているのは、もしかしたら世界初かもしれないと思っています(Loとミキサ無しのSDRでという意味です)。
LPC-Link2のMCU LPC4370には80Msps12bitの高速ADCが搭載されています。このスペックを見たら受信機をつくってみたくなるのは道理ではないでしょうか。
作業はかなり前(前の冬頃ww)に始めていたのですが、長い間DMA周辺がうまく動作させられず滞っていました。ようやく音になったのは数ヶ月経過した夏頃でした。しばらく寝かせていたのですが、最近引き続き改善を進めています。いくつか間違いが見つかり音質も改善、ステレオ化にも成功し、現在はHiFiといっても良い音質で再生できています。
実装の詳細については別の機会にきちんとまとめたいと思いますが、簡単にだけ紹介すると、フロントエンドにBPFとRFアンプと載せ直接ADCに入力しています。ADCは80Mspsの能力がありますが、さすがに処理が追いつかないのでもっと低いレートでサブナイキストサンプリングしています。あとはソフトウェアのみで信号処理を行い、復調した音声はI2S Codecを使って出力しています。
最初はブレークアウトボードとブレッドボードで試作しました。I2SコーデックはTLV320AIC3204です。
その後一つにまとめたものを作りました。QFNなコーデックは裏返して実装しています。RFアンプは、ダイレクトサンプリング用のフロントエンドにつくっていたものを流用しています。
先日基板を発注した時に、ラジオらしく操作できるようにI2C LCDとロータリーエンコーダを載せて、LPC-Link2に追加するアドオン基板としました。
FMラジオはスタンドアロンで動作します。消費電流は220mA程度となりました。LPC-Link2が二つあるのは、一方は書き込み用のデバッグプローブです。
ADCで取得したデータはノイズにしか見えないのですが、ちゃんとした音が出てくるのがなんだか不思議な気がします(自分で実装しておいてなんですが)。
動作はまったく余裕が無いのでかつかつです。サイクルは97%程使っています。ベンダから提供されているDSPライブラリは大変参考にはなりましたが、動作の効率が悪くて使うことはできませんでした。なので全部イチから実装しています。悩みながら実装を進める過程でCortex-M4による信号処理については、かなり実践的に鍛えられたと思います。ARM命令セットの効率やSIMD命令の使い方、FPUの活用など知見が得られました。SDRとしてFMラジオが実装できたのなら、他の狭帯域変調方式は全然余裕で実装可能です。今後の道具立てとして使えるのではないかなと思います。
DMAやADCの制御には、LabToolのコードを参考にしました。またFM受信処理の実装例としてChrome Radio Receiver ExtensionのJavascriptによる実装がわかりやくすて大変参考になりました。
動画です。
このFMラジオもMaker Faire Tokyo 2014でブースに置いておきます。会場では電波環境的にうまく受信できるかどうかわかりませんが、よろしければご覧ください。
- LPC-Link2 https://www.nxp-lpc.com/lpc_boards/lpc-link2/
- LabTool https://www.embeddedartists.com/products/app/labtool.php
- Embedded Artist. LPC-Link2の開発元 https://www.embeddedartists.com/products/lpcxpresso/lpclink2.php
- 開発環境LPCXpresso https://www.lpcware.com/lpcxpresso/home
- Chrome Radio Receiver Extension https://chrome.google.com/webstore/detail/radio-receiver/miieomcelenidlleokajkghmifldohpo