コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2021年5月14日 >>> 2021年5月14日
link もっと後

2021年5月14日

Raspberry Pi 3のオーディオ その7 - 高い音が出ない謎

目次: Raspberry Pi

その1 - 波形観察(2021年5月2日の日記参照)でRaspberry Pi 3では高い音が出ない現象が発生していました。この原因について調べたメモです。結論だけ言えば、PWMのハード的には出せるはず、でも根本原因はわかりませんでした。

PWMの素性を調べる

RasPi 3のHW PWMは出力Duty比を約20usごとにしか変更できないようです。確認方法は下記のようにしました。

  • FIFOを有効にする: CTL(アドレス3f20c000)のUSEFx(ビット5と13)をセット
  • DMAを無効にする: DMAC(アドレス3f20c008)のENAB(ビット31)をクリア
  • FIFO空きをチェックする: STA(アドレス3f20c004)のFULL1(ビット0)がクリアされるまで待つ
  • FIF1(アドレス3f20c018)に左右両チャネルのデータを書く、つまり2回Writeする
  • FIFO空きチェックに戻る

これにより最速でPWM Duty比を変更することができます。下記は設定例です。

PWMのレジスタダンプ
3f20c000  00002121 00000032  00000303 70776d30
3f20c010  00000800 00000000  70776d30 70776d30
3f20c020  00000800 00000800  70776d30 70776d30

Duty比は何でも良いですけど、0%100%が一番波形が見やすいと思います。この設定例で言えば0x000, 0x000と0x800, 0x800を交互に書きます。


最高速度でPWMのDuty比を切り替えたときの波形(黄色1chオーディオ出力、水色2ch PWM出力)

上記操作をしたときのPWMの波形を見ると約20usに一度しか波形が変わっていません。従ってRasPi 3のオーディオ出力は25kHz程度が上限です。

クロックとの関係

なぜ20usに一度しか変更できないか気になりますが、BCM2835の仕様書には一切記載がありません。試行錯誤してみた結果、clk_pwm_domainのクロック周波数を早くすると変更間隔も速くなるみたいです。

PWMのクロック設定はPWMCTL(アドレス3f1010a0)とPWMDIV(3f1010a4)にあるようです。これも仕様書には載っていませんので、Linuxのクロックドライバdrivers/clk/bcm/clk-bcm2835.cから読み取るしかありません。イマイチな仕様書ですね……。

クロック制御部のレジスタダンプ
3f1010a0  00000096 00005000  00000200 00000000
3f1010b0  00000000 00000000  0000636d 0000636d

クロックドライバの実装をみるに、CTLレジスタのビット0〜3がクロック源です。6なのでPLLD_COREというクロック源が選択されているようです。ビット9が分周するかどうかの設定です。上記の設定だと有効でも無効でもクロックの速度が変わりませんでした。デフォルトが5分周なのか?どこかでデフォルトの分周比を設定しているのか?どちらなのかは良くわかりません。

DIVレジスタは分周比を表すようです。仕様がイマイチわかりませんが固定小数点のようで、上位ビットが整数部分、下位12ビットが小数点以下を表しているようです。上記の設定だと5分周を意味しているはず。


最高速度でPWMのDuty比を切り替えたときの波形(黄色1chオーディオ出力、水色2ch PWM出力)分周比設定0x4000

分周比を0x4000に変更するとDuty比の変更速度も5/4倍になって、16us間隔になるので、上位ビットが整数部分であることはほぼ間違いなさそうです。ちなみにクロック制御部のレジスタを変更する際は、上位16ビットに0x5a00をORしてwrite しないといけません。

クロック源の周波数をdebugfsから確認すると500MHzみたいです。5分周だから100MHz駆動でしょうか?

クロック源の周波数
# cat /sys/kernel/debug/clk/plld_core/clk_rate
500000006

チャネル数は2ch、FIFO幅は32bitですから、100MHz / 2 / 32 = 1.5625MHzつまり0.64us間隔ならまだわかるんですが、どうしてその30倍もある20us間隔になるんでしょう。さっぱりです。

残った謎

PWMの能力的にはギリギリ24kHzも再生できるはずですが、以前示したように通常のオーディオ出力経路(CPU → GPU → DMA → PWMの経路と思われる)を使うと、24kHzが再生できません。24kHzどころかfs = 32kHzでの16kHzでさえ再生不可能です。

PWM以外に、例えばGPU側で何かPCMデータを弄っているなど、高音を再生する際の制約があるのかもしれません。

編集者:すずき(2021/05/14 02:48)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2021年5月14日 >>> 2021年5月14日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<05>>>
------1
2345678
9101112131415
16171819202122
23242526272829
3031-----

最近のコメント5件

  • link 24年4月22日
    hdkさん (04/24 08:36)
    「うちのHHFZ4310は15年突破しまし...」
  • link 24年4月22日
    すずきさん (04/24 00:37)
    「ちゃんと数えてないですけど蛍光管が10年...」
  • link 24年4月22日
    hdkさん (04/23 20:52)
    「おお... うちのHHFZ4310より後...」
  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」

最近の記事3件

  • link 24年4月25日
    すずき (04/26 16:49)
    「[AVIFの変換] AVIFが読めないアプリケーションがたまにあるので、AVIF(AV1 Image File Format)...」
  • link 24年2月7日
    すずき (04/24 02:52)
    「[複数の音声ファイルのラウドネスを統一したい] PCやデジタル音楽プレーヤーで音楽を聞いていると、曲によって音量の大小が激しく...」
  • link 24年4月22日
    すずき (04/23 20:13)
    「[仕事部屋の照明が壊れた] いきなり仕事部屋のシーリングライトが消えました。蛍光管の寿命にしては去年(2022年10月19日の...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/26 16:49