2017年9月1日金曜日

ESP32でI2Sから音を出す

Kickstarterプロジェクトで使ったI2Sに関するメモ

■内蔵DAC, PDM, 外付けI2S■

esp-idfのexample/peripheral/i2sにサンプル入ってますけど、これ動きました?

DAC, PDM, I2S、いずれも苦労しました。DACとI2Sは符号付き整数、PDMだけ符号なし整数でデータの塊を作ってi2s_write_bytesに渡しますが、i2s_driver_installへのパラメータが試行錯誤の山でした。

PDMはやたら音が歪んでしまい、パラメータをいじりまくったのですが改善しないのでギブアップしました。正弦波を出して第二高周波が-10dBも出ているのは辛いです。DACは素直に入れた通りの波形が出てきます(あたりまえですが)。

で、I2Sに関しては、MAX98357Aを接続し、最終的に以下のコードで動きました。なお、MAX98357Aはモノラルなので、データは符号付き16ビット整数をみっちり詰め込んで渡します。




■(追記)続編です■

再生の途中で中断したい場合の処理を追加しました。

4 件のコメント:

  1. ESP32はI2S使えるのですか!いいこと聞きました。

    意外とI2Sを使える環境って無いんですよね。

    返信削除
    返信
    1. なにげにクロック高いしタイミングもシビアなのでマイコンには荷が重いんですかね>i2s

      なお音データをアップロードする手段が見当たらないので、cで変換プログラムを書いて全部16進にしてconst uint16_t speech[] = {...}で読み込ませましたw 

      1.2MBのヘッダ、昔だったら読み込むだけで何分かかるんだろ?って感じですが、コンパイル一瞬ですねー。今のパソコン凄いです。

      削除
  2. 最近は使っていないですが、SoX - Sound eXchangeというコマンドライン・ツールでwavファイルとテキストデータの変換をしてたことがあります。

    自分で変換プログラム書くより楽だったような気がします。昔のバッチファイル見ると

    sox.exe -s -w -r 44100 -c 1 "DDSTest-LFO.raw" "DDSTestLFO.wav"

    というようなコマンドでテキストデータから音声ファイルに変換してたようです。オプションの意味はもはやわからないですが、逆もやってたような(^q^;

    返信削除
    返信
    1. そうなんですか。うーむ、私はhello, world世代のcプログラマなのでこのぐらいは探すより調べる方が早いわwww

      とか言いたいのですが、少し、ハマりましたw

      削除