

MicroPythonについてです。  
ラズパイpicoのADCピンにマイクモジュールを接続し、録音しようと思っています。  
実際に録音自体はできるのですが、毎回サンプリングレートに変動があり、7000~11000あたりをさまよっています。  
これを音声としてまともに聞けるように44.1khzか、22.05khz固定にしたいのですが、MicroPythonを使った場合どのようにしてサンプリングレートを固定できるのでしょうか？  
心当たり、少しでも思うことがあれば教えていただきたいです。

環境  
Raspberry Pi pico  
MicroPython 1.20


CC BY-SA 4.0
2023-05-31T15:53:59.310
95049
2023-08-16T05:51:55.463
2023-06-01T04:33:53.883
3060
58540
question
python raspberry-pi
Raspberry Pi picoでADCピンに接続したマイクでの録音時にサンプリングレートが変動してしまう


どのようなプログラムで、そのような問題を抱えているのでしょうか。  
今回のような質問では、問題が起きているソースコードを示すことが重要です。  
ソースコードも一緒に質問文に入れていただかないと、誰も的確な回答ができませんorz

Micropythonはその言語特性上、10kHzあたりまででしたら大抵の場合誤差なく処理できますが、10kHzを越えるような処理は安定しません。  
どうしても22.05kHzや44.1kHzあたりで安定してサンプリングできるような処理を求めるようでしたら、開発言語はMicropythonではなく、C/C++あたりを視野に入れたほうが良いでしょう。

ところで、Micropythonでの開発で、もしタイマ割り込みを使用せずに問題に直面しているのでしたら、タイマ割り込みを使ってみてはいかがでしょうか。

> クラス Timer -- ハードウェアタイマーの制御  
>  <https://micropython-docs-
> ja.readthedocs.io/ja/latest/library/machine.Timer.html>

こんな感じに記述できます。

[code]

    from machine import Timer
    
    # 定期的に呼び出される処理
    def sampling(timer):
        # ~~~ ここにサンプリング処理を書く ~~~
    
    timer_sampling = Timer()
    timer_sampling.init(mode=Timer.PERIODIC, freq=22050, callback=sampling)
    
[/code]

上記のコードでは、22.05kHz周期で`sampling関数`を呼び出すように設定しています。  
しかし先述のとおり、高周波のため実際の呼び出し周期は安定せず、誤差が生じます。  
実測では、ほぼ負荷のないテスト環境でも、22.22(±3)kHzあたりの周期で呼び出されていました。  
44.1kHzも試してみましたが、全く安定せず、使い物にはなりませんでした。


CC BY-SA 4.0
2023-08-16T05:51:55.463
95950
2023-08-16T05:51:55.463
59496
95049
answer