先週はLCDへの表示を考えてセンサをつなげていたのですが、通話音声の波形を表示してみることを思いついて試しにコード書いて実験してみました。そこそこ見れる結果が得られたので、動画にしてみました。
Nokia 5110は84X48ドットですが、縦方向は8bitが6つ並んだ構成になっていることは以前の記事でも書きました。そこで、下部の縦方向32ドットを波形表示領域として使うことにしました。画面表示内容はマイコン側のフレームメモリに保持しているわけですが、波形表示領域は最後の84X4バイト分に相当することになります。画面の左スクロールは、このメモリ領域の内容を1バイトずらして、LCDにDMA転送することで再描画してやるだけでいいので、CPUにさほど負荷をかけずに実現できます。
波形はRTPの送信処理の中で描画することにし、1パケット分(すなわち20ms)の音声を横1ドットで表現することにしました。従い、画面上には20 X 84 = 1.68秒分の波形が表示できます。サンプリングは8000Hzですので、20ms分は160サンプルあるのですが、それを1ドット幅の振幅で表現することになります。具体的には、
波形としてはプラス/マイナス両方向があった方が、いかにもそれらしく見えるような気がしたので、今回は両方向に線を引いていますが、上記のように同じ振幅にしているだけです。表示領域が狭いので、今回は相手側からの音声だけを表示しています。波形表示をプラス方向だけにしてしまえば、自分側の波形も表示できますね。
ホントはPC側のX-Liteの操作とLCD画面の両方を並べた動画が撮れればいいのですが、そこまでやる気力も技量もありません。
Nokia 5110は84X48ドットですが、縦方向は8bitが6つ並んだ構成になっていることは以前の記事でも書きました。そこで、下部の縦方向32ドットを波形表示領域として使うことにしました。画面表示内容はマイコン側のフレームメモリに保持しているわけですが、波形表示領域は最後の84X4バイト分に相当することになります。画面の左スクロールは、このメモリ領域の内容を1バイトずらして、LCDにDMA転送することで再描画してやるだけでいいので、CPUにさほど負荷をかけずに実現できます。
波形はRTPの送信処理の中で描画することにし、1パケット分(すなわち20ms)の音声を横1ドットで表現することにしました。従い、画面上には20 X 84 = 1.68秒分の波形が表示できます。サンプリングは8000Hzですので、20ms分は160サンプルあるのですが、それを1ドット幅の振幅で表現することになります。具体的には、
- 160サンプルをu-Law形式から16bitリニア形式に変換する
- 160サンプルのうちの最大値と最小値を見つける
- 最大/最小値を振幅とする縦線を引く
- 音声の振幅なので、プラス方向とマイナス方向はほぼ同じでしょう。マイナス方向にだけ着目することにし、最小値しか求めない。
- 比較処理はu-Law形式の段階でおこない、求めた最小値だけをリニア形式に変換する
- 最大値は最小値の符号をかえるだけとし、求めた振幅の線を引く
波形としてはプラス/マイナス両方向があった方が、いかにもそれらしく見えるような気がしたので、今回は両方向に線を引いていますが、上記のように同じ振幅にしているだけです。表示領域が狭いので、今回は相手側からの音声だけを表示しています。波形表示をプラス方向だけにしてしまえば、自分側の波形も表示できますね。
ホントはPC側のX-Liteの操作とLCD画面の両方を並べた動画が撮れればいいのですが、そこまでやる気力も技量もありません。