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 でも、まともな音は出そうにありません。