83821


Spresense-Arduino のスケッチ例
pcm_captureを参考にマイクからモノラルで50サンプルデータを取り出し、最終的にはRMS値で標記したいと思っています。

スケッチ例
pcm_captureの中にある以下のコードがキャプチャした音声データの中身を表示していることはわかるのですが、具体的にどのような構造で音声データが格納されているかがわかりません。

AS_CHANNEL_MONOで取り出した場合、s_buffer(a1,a2,a3,a4)とするとa2とa4に00又はffが表示されます。本来、データがa2,a3,a4に存在しない場合は00と標記されると思うのですが、原因がわかりません。

1chで音声データを取り出し、RMS値標記するにはどうすればよいでしょうか。

よろしくお願いいたします。

[code]

    printf("Size %d [%02x %02x %02x %02x %02x %02x %02x %02x ...]\n",
         size,
         s_buffer[0],
         s_buffer[1],
         s_buffer[2],
         s_buffer[3],
         s_buffer[4],
         s_buffer[5],
         s_buffer[6],
         s_buffer[7]);
    
[/code]


CC BY-SA 4.0
2021-11-26T03:58:43.040
83809
2021-11-27T00:38:38.413
49229
question
spresense データ構造 audio
Spresense-Arduinoのスケッチ例PCM_captureをモノラル録音（AS_CHANNEL_MONO）の際のデータ構造がわかりません。


類似の質問を見つけました。  
[https://ja.stackoverflow.com/questions/55107/spresense-arduino-のスケッチ例-pcm-
captureの音声データ構造について](https://ja.stackoverflow.com/questions/55107/spresense-
arduino-%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%83%E3%83%81%E4%BE%8B-pcm-
capture%E3%81%AE%E9%9F%B3%E5%A3%B0%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)  
ここの回答に載っている16bit音声データの型を`uint16_t`\-->`int16_t`にして、データ構造は符号付き16bitで並んでいるだけなので、

モノラル1chのRMS値は、こんな感じで求められると思います。

[code]

      struct channel_bit16 {
       int16_t micA;
      };
    
      struct channel_bit16 *mic_data = (struct channel_bit16 *)s_buffer;
      int sum = 0;
      for (int i = 0; i < 50; i++) {
        sum += mic_data[i].micA * mic_data[i].micA;
      }
      double rms = sqrt((double)sum/50);
      printf("%.3lf\n", rms);
    
[/code]


CC BY-SA 4.0
2021-11-26T13:33:58.053
83821
2021-11-27T00:38:38.413
2021-11-27T00:38:38.413
31378
31378
83809
answer