ArmマイコンUSB経由でサウンドデータをPCへ送る
図(クリックで拡大)はNECLEO STM32F446RE評価ボードからのデジタルIQデータをSDRStudy(改)で再生の様子。
2025.2.2
はじめに
今回は、STM32F446のUARTとUSB-シリアル変換モジュールを使いPCへサウンドデータを送り、音切れなく再生出来るかTRYです。
SDR3号機までは、PCへのI/Qデータはアナログ出力でしたが、SDR#4号機ではUSB I/Fによるデジタル出力としています。
I/QデータのUSB I/F例については、Web上でも見かけませんが、参考になれば幸いです。
プログラムについては、主要部のみの表示で、変数の定義などの詳細は、含まれていません。全体が完成した段階でまとめていきます。
テストプログラムの概要
SDR#4号機トランシーバー用、基本動作確認用プログラムとして以下の内容でテストしています。
-1.STM側て、40kHzでサンプリングしたオーディオ信号の波形データを作成、データに0x1A(EOF)が含まれていないかチェックして、
4096byteずつPCへ送る。
EOFの処理については前回のページを参照ください。
-2.STMとPC間には、USB-シリアル変換モジュール(FTDI)を挟んで、USB 2MbpsでPC間と通信。
-3.PC側はデータ再生用としてSDRStudy(RFWorld#22)にシリアル通信入力対応の追加改造したソフトを使用。
PC側では、
-1.STM側からのデータ受信バイト数4096バイト毎にシリアルポートの受信イベント(割り込み)が発生。
-2.4096バイトを1ブロックとしてバッファに格納していく。
-3.16ブロック分データがそろったら、最初の1ブロックからデータ処理をスタートする。
-4.処理はブロックのデータを一旦別のバッファにコピーして、8bitデータを16bitデータに変換して、16bit 1024のIQデータにする。
-5.IQ SoundデータをオリジナルのSDRStudyの処理へデータを渡しています。
SDRStudy側の追加プログラム
オリジナルのSDRStudyはIQ入力がアナログ信号入力なので、Form画面にシリアルポートを追加します。
 |
ポーレートは、2Mbps 受信バイトスレッシは4096バイトで、その他の設定は左図(クリックで拡大)のプロパティ―をサンショウください。
COMポート番号は使用PCによって変わるので、デバィスマネージャーで確認し、作成されたCOMポート番号に合わせます。
|
受信イベントの追加
雷マークをクリックしてイベントを追加し、左記のコード(クリックで拡大)を追加します。
受信バイト4096バイト毎にイベントが発生し、受信データをrcv_bufにoffset分シフトしながら格納していく。rcv_EventCountはByte型
にして、0〜255ブロックのリング状Buffとなる。
受信データがそろうとフラグをたて、信号処理スレットにしらせる。
信号処理スレッドにシリアル入力の追加
以前にSDRStudyの改造でForm画面にシリアル入力を追加しましたが、処理内容を変更します。
-1.シリアル入力が初めて選択されると、STM側にAD Startコマンド"2"を送り、STM側はADデータ送信スタート、
-2.データ受信し、処理スタートフラグがtrueになるまで待機
-3.フラグがtrueになったら待機を抜けて、rcv_bufから4096バイト分をSoundBuffに読み込む
-5.シリアルデータは8bit単位なので、下位8bitと上位8bitをつなげて16bitデータにし、オリジナルのSoundCardにデータを渡します。
-6.後はオリジナルの信号処理と同じフローになります。
STM側のプログラム、波形データの作成
 |
波形データ作成はプログラムスタート時、最初に一度だけ実行されるので、とくにスピードは問題にせず、通常のmathライブラリーの
sin()、cos()を使ってきましたが、今回は「ARMマイコンで作るダイレクトサンプリングSDR」(CQ出版)の記事による方法で作成してみました。
SIN、COSの各波形データ―1024ポイント作成時間を比較すると従来のmathライブラリー使用では、約42msかかっていましたが、{ARM〜」方式では
約1msで処理できました。
オリジナルはC++で作成されていますが、Cで書き換え、引数は事前に以下の内容で計算しておき、Generate()関数に渡します。
a1=2.0f * cosf(PI2 * f0 * TS)
b1s=A0 * sinf(PI2 * f0 * TS)
b1c=-A0 * cosf(PI2 * f0 * TS)
PI2は6.283185f、f0は400.0f、TSとA0は今回それぞれ25.0E-6fと512にしています。変数名は出来るだけオリジナルに合わせています。
|
動作確認
SDRStudyのスペクトラム画面上に片側のみのスペクトラムが安定して表示されるようになりました。sin波やcos波のみの場合は0Hzを挟んで両サイド
にスペクトラムが表示されますが、今回はIQデータを処理しているので片方のサイドバンドまみ表示、音切れやプチプチ音も無く安定に再生出来ました。
今後の進め方
今回の検討で、「IQ信号をデジタルデータでPCへ送り、音切れなく再生できること」の解決目処がついたので、今後はAD、NCO、CIC、FIR、UAET
処理をまとめて全体ソースの作成、アナログフロントエンドのハード製作と、まだまだ楽しみは続きます。
ArmマイコンUSB バーチャルコムポート(VCP)にはまる
Top Menu