Sipeed MAix Bit with MIC MaixPy で マイクのお試し #2

Sipeed MAix Bit with MIC MaixPy で マイクのお試し #2 です。

前回、Sipeed MAix Bit with MIC MaixPy  で
UART0 から、UART1に替えて、別途 USB-Serial (FT232RL) を付けて試してみました。

※ UART1 に、別途 USB-Serial (FT232RL) を付ける。
Maix-Bit silk  |  k210 IO  |  USB-Serial (FT232RL)
    15  --  IO15 (tx)  -->  Rx
    17  --  IO17 (rx)  -->  Tx
     GND                  -->  GND
注)上記以外は、オープン
  USB-Serial VCC は結線しません。

Serialの速度は、460800 まで上げる事は出来ましたが、PCから出てくる音は、
余り変わりないので、今回は、Bit の I2S で取り込んだRAW データを ASCII に変換する事なく、
バイナリーのまま PCへ送ってみる事にしました。


よりシンプルにを基本に、データ長は固定長なので、簡単なアルゴリズムで改造してみました。

アルゴリズム
送りて(Bit):
  音データ(16bit * Sample Point のバイナリデータ) の後ろに、\r\n の 2バイトを付加する。
  CHUNK*2+2 の固定長データ

受けて(Windows10 PC)
  ・Serial.read() で、受信データ長=CHUNK*2+2 で受信する。
    受信したデータの末尾に、\r\n があれば、 OKデータとします。
  ・OK でなければ、
    Serial.readline() で次の \r\n 迄、受信して、上記処理へ戻ります。
  ・OKデータ であれば、マイクへ末尾の \r\n を除いたデータを出力します。
    最初の処理へ戻ります。

1. 最初は、やはり、Sipeed MAix Bit 側の python script です。

audio = rx.record(sample_points)
で取り込んだデータの前半 16bit 部分だけを、バイナリーのまま、
UART1 で送信します。
1CHUNK( 16bit * Sample Point) + \r\n のバイナリデータとなります。

2. PC 側の python script です。

アルゴリズムは、先に記述したような、簡単な処理です。

1) 取り敢えず、line = ser.read(CHUNK*2+2) で固定長のデータを受信します。
末尾に、 \r\n が正しく付いていれば、
output = stream.write(line[:CHUNK*2])
で、 \r\n を除いて、pyaudio.PyAudio() のStream へ出力します。

2) 末尾に \r\n が付いていなければ、
line = ser.readline() で、次の \r\n 迄読み飛ばします。

結果は、と言えば、
PC から出てくる音は、あまり変わりません。残念です。
但し、Baud Rate=921600*2 でも OK の様です。

注) K210 のドキュメントには、 5M 迄 OK とあった気がしますが。

あと、収穫は、データが固定長であれば、Serial 通信でも簡単に、バイナリーデータが
送受信できる事がわかた点か!!

おんちゃんが現役の、大昔は、Serial 通信が頻繁に使われていたから、当時はこんなプログラムを
もしかしたら C言語 で書いていたのかもわかりません。
もう昔の事なので、忘れてしまったのかも。

順番が丸っきり逆になりましたが、転送帯域幅の計算をしてみます。
Sample Rate 38,640 / 44,100  16bit モノラル + Stopビット
  38,640 * (16 +2) = 695,520 [baud rate]
  44,100 * (16 +2) = 793,800 [baud rate]
上記に、1CHUNK に付き、\r\n の16 + 2 bit が必要なので
  38,640 -> 695,520 + 38,640 / 512 * 18 = 695,520 + 約 1,368 = 約 696,888 
  44,100 -> 793,800 + 44,100 / 512 * 18 = 793,800 + 約 1,566 = 約 795,366 
今の UART1 の Baud Rate
  921,600 * 2 = 1,843,200 [baud rate]

なので、十分足りている計算になります。
と言う事は、プログラムがバグっているか、Python では、オーバーヘッドがあり過ぎなのか?
となります。

PC(受けて)側で、受信データの実測をしてみました。
55,296 [Byte] ~ 53,248 [Byte] になりました。
この速度で、正常に扱える Sample Rate は、
16,000 * 2 = 32,000 [Byte]
なので、 Sample Rate=16,000 にして試してみましたが、
どうやら、 PC 側で頻繁にデータ抜けが生じているみたいです。
これを解決しないと、Sample Rate: 16KHz でも、まともな音は出そうにありません。

このブログ記事について

このページは、おんちゃんが2020年3月15日 00:53に書いたブログ記事です。

ひとつ前のブログ記事は「Sipeed MAix Bit with MIC MaixPy で マイクのお試し」です。

次のブログ記事は「Sipeed MAix Bit with MIC MaixPy で マイクのお試し #3」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ