![]() |
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ビット整数をみっちり詰め込んで渡します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
i2s_config_t i2s_config = { | |
.mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX | |
.sample_rate = SAMPLE_RATE, | |
.bits_per_sample = BITS_PER_SAMPLE, | |
//.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels | |
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, | |
.communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB, | |
.dma_buf_count = 16 , | |
.dma_buf_len = 64, // | |
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 //Interrupt level 1 | |
}; | |
i2s_pin_config_t pin_config = { | |
.bck_io_num = 26, | |
.ws_io_num = 25, | |
.data_out_num = 22, | |
.data_in_num = -1 //Not used | |
}; | |
i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); | |
i2s_set_pin(I2S_NUM, &pin_config); | |
i2s_write_bytes(I2S_NUM, (const char *)speech, sizeof(speech), portMAX_DELAY); |
ESP32はI2S使えるのですか!いいこと聞きました。
返信削除意外とI2Sを使える環境って無いんですよね。
なにげにクロック高いしタイミングもシビアなのでマイコンには荷が重いんですかね>i2s
削除なお音データをアップロードする手段が見当たらないので、cで変換プログラムを書いて全部16進にしてconst uint16_t speech[] = {...}で読み込ませましたw
1.2MBのヘッダ、昔だったら読み込むだけで何分かかるんだろ?って感じですが、コンパイル一瞬ですねー。今のパソコン凄いです。
最近は使っていないですが、SoX - Sound eXchangeというコマンドライン・ツールでwavファイルとテキストデータの変換をしてたことがあります。
返信削除自分で変換プログラム書くより楽だったような気がします。昔のバッチファイル見ると
sox.exe -s -w -r 44100 -c 1 "DDSTest-LFO.raw" "DDSTestLFO.wav"
というようなコマンドでテキストデータから音声ファイルに変換してたようです。オプションの意味はもはやわからないですが、逆もやってたような(^q^;
そうなんですか。うーむ、私はhello, world世代のcプログラマなのでこのぐらいは探すより調べる方が早いわwww
削除とか言いたいのですが、少し、ハマりましたw