N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< ESP32で音声合成(AquesTalk pico for ESP32) | main | AquesTalk-ESPを簡単に使うクラス(プログラム) >>
ESP32でサウンド出力時のクリックノイズ対策(I2S+内蔵DAC)

keywords: ESP32, サウンド, DAC, I2S

 

■概要



ESP32の内蔵DACから音を出すとき、前後のプチプチというノイズが気になってので、これを防ぐ方法を検討してみました。

 

 

■クリックノイズの原因


 

ESP-IDFのI2Sドライバは無音時の値を0としている。
内蔵DACにおける値0は負の最大値である。

 

通常I2Sの16bitデータは符号付き(無音時の値が0、最小が-32768、最大が32767)で表現します(図1-A)。ESP-IDFのI2Sドライバも、その前提で書かれています。
しかし、内蔵DACは0Vから3.3Vの範囲を16bitの符号無し整数(0から65535)で指定します。
そのため、音声信号では無音時の値を32768、負の最大値を0、正の最大値を65535になるように変換して与える必要があります。

 

ESP-IDFのI2Sドライバは無音時の値が0という前提で書かれていますので、初期状態や動作の開始・終了の状態の変化のときに、この値0を出力することがあります。これは内蔵DACからみれば負の最大値であり、これがクリックノイズの原因です(図1-B)。

 

Waves

図1

 


■対策


 

図1-Cのように、再生の前後の立ち上がりと立下りを滑らかにします。

 

 

■Tips <ここが本記事のメイン



・立ち上がり、立下りは値を256づつ直線的に変化させる

このとき、より滑らかにしようと傾きを緩やかにするのはNGです。
内蔵DACの分解能が8bitしかないので(下位8bitは切り捨てられる)、同じ値が繰り返されるとステップノイズの基本周波数が低くなり、余計にノイズが目立つようになります。

 

・i2s_start()直後は、DMAバッファ1つ分のダミーを出力する

タイミングによりますが、先頭のデータが抜けることがあるために必要です。

 

・i2s_stop()の前に、DMAバッファすべてを0で埋める

再びi2s_start()で再開したときに異音が出ないようにするためです。

 

・i2s_stop()は、DMAバッファすべてとFIFOの長さの値を書き込んでから呼び出す

出力されるタイミングは値を書き込んだ時ではなく、実際はDMAバッファとI2S内のFIFOバッファ分の遅延があります(I2S内には32bitx64のFIFOがあります)。完全に立ち下がってからi2s_stop()を呼び出す必要があります。

 

・i2s_start()の操作で値0が一瞬出力されてしまう

たとえDMAバッファをすべて中間値(32768)で埋めても、値0が瞬間的に出てしまいます。そのため、停止時に中間値で維持する方法は使えません。

 

・DMAバッファを32768で埋めてi2sを止めない方法

この方法はありですが、音を出さないときにもI2Sを動してると、M5Stackでノイズが気になりました。

 

 ※現時点(2018/03/27)のESP-IDFなので今後動作が変わるかもしれません。

 


■サンプルプログラム


 

クリックノイズの対策を行ったサンプルプログラムを公開します。
正弦波のデータを4回に分けて出力しています。

 

・「TestClickNoise.ino
 

・「TestClickNoiseBef.ino」(クリックノイズ対策無し。比較用)

 


■リンク


 

 次の記事「ESP32のPDMでサウンド出力+ノイズ対策」

    http://blog-yama.a-quest.com/?eid=970192

 

「EPS-IDF Programming Guide -I2S」
     http://esp-idf.readthedocs.io/en/latest/api-reference/peripherals/i2s.html

 

「ESP-IDFのI2Sドライバソース i2s.c]
    https://github.com/espressif/esp-idf/blob/master/components/driver/i2s.c

 

「ESP32 Technical Reference Manual」    https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf

 

「ESP32で音声合成(AquesTalk pico for ESP32)」
    http://blog-yama.a-quest.com/?eid=970188

 

| 電子工作 | 23:19 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND