Armadilloフォーラム

PDMマイク駆動について

gakuto

2022年9月22日 14時18分

お世話になります。
Armadillo-Iot G4を使用してマイクモジュール(SPH0641LU4H)を駆動するシステムを構築しています。
現在HowTo(https://armadillo.atmark-techno.com/howto/aiotg4-use-pdm-mic)に従い、wav形式で保存する部分まで動作が確認できました。

つきましては、下記2点教えていただけないでしょうか。

①PDM駆動周波数について
"arecord -D plughw:0,0 -r 192000 -f S16_LE mic_rec.wav -d 10"
上記コマンドを実行したところ、クロック(CON11-17ピン)周波数は実測3.072MHzであり、想定通りでした。

"arecord -D plughw:0,0 -r 300000 -f S16_LE mic_rec.wav -d 10"
次に上記コマンドを実行したところ、こちらもクロック周波数が実測3.072MHzでした。
300kHz x 16bit = 4.8Mhzでの駆動(マイクの最高速度)を実現したいのですが、適切な方法はありますでしょうか。

②録音中の周波数変更について
"arecord -D plughw:0,0 -r 192000 -f S16_LE mic_rec.wav -d 10"
上記コマンドを実行した場合定常状態から3.072MHzのクロック出力が始まり、10秒後に定常状態に戻ります。
マイクはUltrasonicModeで使用したいため3.072MHz~4.8MHzのクロック周波数で録音しますが、
SleepModeからUltrasonicModeに直接の遷移ができないため
定常状態 → 1.024MHz~2.475MHzを20ms程度 → 3.072MHz~4.8MHzに遷移し録音 → 定常状態(録音終了)
といった駆動をしたいと考えています。適切な方法はありますでしょうか。

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

コメント

at_akihito.irie

2022年10月5日 17時48分

入江です。

回答が遅くなってしまい申し訳ございません。

> ①PDM駆動周波数について

PDM駆動周波数の計算方法が間違っているかと思います。

PDM駆動周波数の値は、サンプリングレートとQuality Modeによって決まります。

Quality Modeは
https://armadillo.atmark-techno.com/howto/aiotg4-use-pdm-mic
の「マイク感度の調整」にあるコマンドで変更できます。

[container /]# amixer -D hw:0 sset 'MICFIL Quality Select' 'VLow0'

まずサンプリングレートですが、ハードウェア的に
11025Hz, 16000Hz, 22050Hz, 32000Hz, 44100Hz, 48000Hz
の6種類にしか対応していません。
それ以外の値を入力してもドライバ内で上記のうち近いサンプリングレートに
変更されます。

192kHzを指定しても、300kHzを指定しても、PDM駆動周波数が同じく3.072MHz
なのは、内部的にサンプリングレートが48kHzになっているためです。

参考)
https://github.com/atmark-techno/linux-5.10-at/blob/main/sound/soc/fsl/…

そして、PDM駆動周波数ですが、正しい値の範囲を求める計算式が「i.MX 8M
Plus Applications Processor Reference Manual Rev. 1, 06/2021」の
「14.3.2.4 Time Generator」に記載されています。

以下ではマニュアル記載の計算方法に触れつつ、デバイスドライバ内での実際
の計算について説明します。

Armadilloから出力されるPDM駆動周波数は、マニュアルで言うところの
「PDM_CLK rate」にあたりますので、これを求めます。

初期状態では、Quality ModesはMediumに設定されており、またOSR=16です。
このとき、arecordでサンプリングレートを192kHzと指定しても、前述の通り
内部的にはサンプリングレートは48kHzとして計算されます。

まずはじめにMICFIL_CLK_ROOT rateを求めます。
このMICFIL_CLK_ROOT rateをベースに、PDM_CLK rateを生成しています。

マニュアルには適切なMICFIL_CLK_ROOT rateの計算方法が書いてありますが、
Armadillo-IoT ゲートウェイ G4のドライバ内部では、

サンプリングレートが8000で割り切れる  → MICFIL_CLK_ROOT rate=24576000
サンプリングレートが8000で割り切れない → MICFIL_CLK_ROOT rate=22579200

としています。

そのため、192kHzと指定したサンプリングレートは、内部的には48kHzとなり、
8000で割り切れるため、

MICFIL_CLK_ROOT rate=24576000

となります。

次に、「Equation 2. CLKDIV bitfield value」から、

CLKDIV = MICFIL_CLK_ROOT rate / (8 * OSR * サンプリングレート)
= 24576000 / (8 * 16 * 48000)
= 4

さらに、「Equation 3. PDM_CLK rate」から、

PDM_CLK rate = MICFIL_CLK_ROOT rate / (2 * floor(K * CLKDIV))

であり、「Table 14-5. K factor value」から、MediumのときK=1なので、

PDM_CLK rate = 24576000 / (2 * floor(1 * 4))
= 3072000 = 3.072MHz

が求める値PDM_CLK rateとなります。

以上のことから、arecordで192kHzを指定すると、PDM動作クロック周波数は
3.072MHzになります。

この計算で出力しうる全てのPDM駆動周波数を算出しましたが、4.8MHzちょう
どが出力されるパターンはありませんでした。
(Quality ModeをHighにすると周波数が上がるのが確認できます。)

> ②録音中の周波数変更について

ユーザーランドから触れる簡単な方法としては、以下のような方法が挙げられます。

前述のQuality Modeですが、arecord実行中でも変更することができます。

例えば、

[container /]# amixer -D hw:0 sset 'MICFIL Quality Select' 'Low'
[container /]# arecord -D plughw:0,0 -r 48000 -f S16_LE mic_rec.wav &

とすると、PDM駆動周波数は1.536MHzになり、バックグラウンドで録音し続けます。

このとき、

[container /]# amixer -D hw:0 sset 'MICFIL Quality Select' 'Medium'

を実行すると、定常状態を挟まずにPDM駆動周波数が3.072MHzに変わります。

ご期待の動作かは分かりかねますが、ご参考まで。

以上、よろしくお願いいたします。

gakuto

2022年10月6日 13時51分

入江様

ご回答いただきまして誠にありがとうございます。
①の内容につきまして追加で質問させていただきます。

>192kHzを指定しても、300kHzを指定しても、PDM駆動周波数が同じく3.072MHz
>なのは、内部的にサンプリングレートが48kHzになっているためです。
①-1
192kHzと300kHzでの録音データ(.wav)を比較すると、音声ファイルのビットレートは指定値に合わせて変化していることが確認できました。(添付1.png)
これらは内部的なサンプリングレートは48kHzのままで、保存されるデータのビットレートのみが変化しているということでしょうか?
①-2
サンプリングレート48kHzの音声データを192kHzや300kHzのビットレートで保存しようとした場合入力データが不足するため、
192kHzの場合は連続4つ300kHzの場合は連続6つ程度のデータが同じ値を示すものと想像しましたが、データを見るとそういった波形ではありませんでした。
192kHzや300kHzを指定した際に保存されているこれらのデータは実際にマイクから収集されたデータでしょうか?あるいは、データが不足する部分については推測などにより補完されているのでしょうか?
 
添付1.pngの補足
スピーカから880Hzの音声を出力し、Armadillo G4に接続したPDMマイクに入力。
Armadilloに接続したSDカードに.wav形式で保存
.wavファイルをPCに取り込みAudacitiにより表示しています。

ファイル ファイルの説明
添付1.png