J-LinkにはRTTというJTAGを介したメッセージ出力機能が用意されており、わたしはいつもデバックメッセージの出力に使っています。RTTでは、複数の論理的なチャネルを作ることができ、デバックメッセージ以外にもログデータを別のチャネルに出力することができます。今回の記事では、Bluetoothから受信した音声通話データをJScopeを使って表示、保存するという使い方を紹介しましょう。
まずはマイコン側のソフトの準備です。SEGGERが提供しているコードをプロジェクトに取り込めばいいのですが、ディフォルトでは2チャネル分のRTT Control Blockが用意されているものの、実際にバッファが割り当てられているのはメッセージ出力に使う最初の0チャネル目だけです。そこで、ログデータ出力に使う1チャネル目用にバッファを割り当てるとともに、JScopeで使うための名前をつけておきます。
SEGGER_RTT_ConfigUpBuffer(1, "JScope_i2", &JS_UpBUffer[0], sizeof(JS_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP);
JScopeは JScope_で始まる名前のバッファを探して、その中のデータを表示してくれます。i2は2バイト整数型のデータであることを示します。複数のデータを並べて送る場合には、それぞれの変数の型を示す名前をつけてやります。今回は 16bitの符号付きPCM音声データを送るだけなので、型指定もひとつだけです。
Bluetoothからの音声PCMデータは、DMAで80サンプルずつ受信しています。JScopeには、これを一度に送ってやればオーケーです。
マイコン側の準備は、以上。続いて、J-LinkをPCとつなげて、音声データを読んでみましょう。残念ながらJ-ScopeはWindows環境でしかサポートされていないので、WindowsからJScopeを起動。
ターゲットマイコンの品番と、サンプリング方式としてRTTを選択したらOKボタンを押します。スコープのウィンドウが開いたら、赤いサンプリング開始ボタンを押してデータ収集開始。Bluetooth側を通話状態にしてやると、受信したデータが画面に現れます。
通話音声は16kHzなのですが、取りこぼしもなく綺麗に拾って表示してくれます。受信 /表示したデータは、FileメニューからExportすることができます。普通の ExportでCSV形式、Export Rawで生データをバイナリ形式で保存してくれます。Export Rawしてから、ファイルの内容を hexdump してみると....
ファイルの先頭部の無音部分です。PCMデータはすべてゼロなのですが、タイムスタンプも100刻みで記録されていることがわかります。記録時には何もタイムスタンプデータは出していないので、これはJScopeがテキトーに振ってくれているようです。
と、いうわけでで RTTを使って通話音声の記録ができることが確認できました。JScopeはとりあえずの確認には手ごろなツールですが、PCM音声データにするにはデータ内容を変換してやる必要があります。タイムスタンプのつかない、生のPCMファイルを作るにはRTT loggerを使った方が良さそうですが、この件については次の記事で書くことにします。
まずはマイコン側のソフトの準備です。SEGGERが提供しているコードをプロジェクトに取り込めばいいのですが、ディフォルトでは2チャネル分のRTT Control Blockが用意されているものの、実際にバッファが割り当てられているのはメッセージ出力に使う最初の0チャネル目だけです。そこで、ログデータ出力に使う1チャネル目用にバッファを割り当てるとともに、JScopeで使うための名前をつけておきます。
SEGGER_RTT_ConfigUpBuffer(1, "JScope_i2", &JS_UpBUffer[0], sizeof(JS_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP);
JScopeは JScope_で始まる名前のバッファを探して、その中のデータを表示してくれます。i2は2バイト整数型のデータであることを示します。複数のデータを並べて送る場合には、それぞれの変数の型を示す名前をつけてやります。今回は 16bitの符号付きPCM音声データを送るだけなので、型指定もひとつだけです。
Bluetoothからの音声PCMデータは、DMAで80サンプルずつ受信しています。JScopeには、これを一度に送ってやればオーケーです。
SEGGER_RTT_Write(1, pcm_rxbuffer, sizeof(uint16_t)*80);
マイコン側の準備は、以上。続いて、J-LinkをPCとつなげて、音声データを読んでみましょう。残念ながらJ-ScopeはWindows環境でしかサポートされていないので、WindowsからJScopeを起動。
ターゲットマイコンの品番と、サンプリング方式としてRTTを選択したらOKボタンを押します。スコープのウィンドウが開いたら、赤いサンプリング開始ボタンを押してデータ収集開始。Bluetooth側を通話状態にしてやると、受信したデータが画面に現れます。
通話音声は16kHzなのですが、取りこぼしもなく綺麗に拾って表示してくれます。受信 /表示したデータは、FileメニューからExportすることができます。普通の ExportでCSV形式、Export Rawで生データをバイナリ形式で保存してくれます。Export Rawしてから、ファイルの内容を hexdump してみると....
ファイルの先頭部の無音部分です。PCMデータはすべてゼロなのですが、タイムスタンプも100刻みで記録されていることがわかります。記録時には何もタイムスタンプデータは出していないので、これはJScopeがテキトーに振ってくれているようです。
と、いうわけでで RTTを使って通話音声の記録ができることが確認できました。JScopeはとりあえずの確認には手ごろなツールですが、PCM音声データにするにはデータ内容を変換してやる必要があります。タイムスタンプのつかない、生のPCMファイルを作るにはRTT loggerを使った方が良さそうですが、この件については次の記事で書くことにします。