Spresenseで対数計算をするとAttentionが出る


Spresenseで音声を取りつつリアルタイム処理をしています．  
その中で，logの計算をさせ，配列に格納する場面があるのですが，途中で以下のようなエラーが出てきます．  
Spresenseでlogの計算をする際には何か注意点等あるのでしょうか．

[code]

    Attention: module[4][0] attention id[1]/code[6] (objects/media_recorder/audio_recorder_sink.cpp L84)
    Attention!! Level 0x1 Code 0x6
    
[/code]




SDK開発ガイドに Attention Code について記載があります。

<https://developer.sony.com/spresense/development-
guides/sdk_developer_guide_ja.html#_%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%82%B5%E3%83%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6>

この表を見ると、Code 0x6 はFIFOのオーバーフローですね。

ID: 0x06  
Attension Code: AS_ATTENTION_SUB_CODE_SIMPLE_FIFO_OVERFLOW

おそらく log の計算に時間がかかりすぎて、音声処理が間に合わないのだと思います。試しに次のサンプルを Spresense
で動かすと、759ミリ秒かかります。

[code]

    #include <math.h>
    
    const uint32_t array_size = 4096;
    float data[array_size];
    float output[array_size];
    
    void setup() {
    
      Serial.begin(115200);
    
      uint32_t start_time = 0;
      uint32_t duration = 0;
      
      /* initialize data */
      int value = 10;
      for (uint32_t n = 0; n < array_size; ++n) {
        data[n] = value;
        value += 10;
      }
    
      /* measure the time with log function */
      start_time = millis();
      for (uint32_t n = 0; n < array_size; ++n) {
        output[n] = log(data[n]);
      }
      duration = millis() - start_time;
      Serial.println("time(log): " + String(duration));
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    }
    
[/code]

それに対し、サンプリングレート 48kHz で 4096 の音声サンプルを取り込む時間は、85ミリ秒です（1/48000 x 4096=
0.085）。つまり 85ミリ秒以内に処理をしないと次から次へとデータがやってきてしまい FIFO が溢れてしまいます。

私がよくやる解決策としては、4096のサンプルを別の配列にコピーして、コピーした配列をサブコアに渡して処理をするというものです。

Arduino IDE
を使っているのなら、”ファイル”→”スケッチ例”→”Spresense用のスケッチ例”→"MultiCoreMP"→"AudioFFT"
によい例があります。私はこのコードをいつも参考にしています。

