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

link もっと前
   2021年 5月 9日 ---> 2021年 4月 30日
link もっと後

2021年 5月 9日

Raspberry Pi のオーディオ出力 その 4 - オーディオ出力回路

Raspberry Pi 3 のオーディオ出力は HW PWM の出力(矩形波)を何らかのフィルタ回路を通しているのではないか?という疑問を解決するため、オーディオ出力回路を調べます。

会社のみなさまに回路をシミュレーションする LTspice というツールを教えていただいた(ありがとうございます!)ので、Raspberry Pi 3 の Schematics 通りに回路を組んで回路シミュレーションをしました。Spice という名前は聞いたことありましたけど、使うのは初めてです。

私が使っているのは Raspberry Pi 3 model B rev 1.2 ですので、rpi_SCH_3b_1p2_reduced.pdf という回路図が該当します。オーディオ出力回路だけ抜粋すると下記のとおりです。


Raspberry Pi 3 model B rev 1.2 のオーディオ出力回路

前段が RC ローパスフィルタ回路、後段が RC ハイパスフィルタ回路と思われます。この回路の 1ch 分を LTspice で組んで AC 特性をシミュレーションしますと、こんな感じになりました。


オーディオ出力回路の AC 特性解析

参考までにゲインが -3dB になる周波数(フィルタのカットオフ周波数)に線を足しています。低いほうが 1.7〜1.8Hz 辺り、高い方が 21〜22KHz くらいに見えます。素人目には fs = 48KHz のとき再生帯域 24KHz ですから、発生してはならない不要な高周波を落としているフィルタに見えます。

過渡応答特性

フィルタの AC 特性はわかったので、矩形波を入れたときにどんな波形になるかも見ておきたいと思います。主に回路の入力やシミュレーション方法をミスっていないか確認のためです。初めて使うので、これで合っているのか?と何かと不安なんです……。

V1 の設定を変更して 12.5kHz の矩形波を出す設定に変えます。RasPi の PWM は変調速度が少なくとも 50MHz はありそう(※)なので、立ち上がり立ち下がりは 200ns にしています。

(※)PWM で 0 と 1 が交互に出力されるであろう Duty 比 1/2 にすると 50MHz とオシロ様がおっしゃっているので、変調速度は 50MHz だと思うのですが、本当はもっと速いけど我が家のオシロ Tektronix TBS 1052B の測定限界(50MHz モデル)を超えていて、正しく測れていないだけかもしれません。

我が家のオシロは信号の周波数 20MHz 辺りから波形がミミズみたいになって、何が表示されているのかわからなくなるので、HW PWM 信号を直接見るのは無理です。仮に正しく表示できても波形から値を読み取るのは困難ですし、波形の正確性は気にしなくて良いのです。


電圧源の設定


12.5kHz 矩形波に対する過渡応答解析

対して実際の出力がこんな感じです。PWM が矩形波に近くなっている中央部分の波形を見ると、オシロの波形とシミュレーションの波形がほぼ同じ波形になっています……よね?


fs = 48kHz, 12kHz Sin 波の周波数スペクトル(Raspberry Pi 3)

不明点

Rasberry Pi 3 の HW PWM はレジスタに設定した値を Duty 比だと思ってずっと出力し続けます。最大値(0x800、設定で変えられる)を書き込むとずっと 3.3V、0 を書き込むとずっと 0V、半分の値を書くと 3.3V と 0V を交互に出力します。特に不思議なところはありません。

Raspberry Pi 3 のオーディオ出力は PWM の Duty 比を 100%に固定すると、なぜオーディオ出力が減衰していくのか?という点が良くわからないままです。以前、ボリューム設定をミスっていたときの波形がわかりやすいです。数カ所で PWM 出力が Duty 比 100%に張り付いていますが、なぜかオーディオ出力は上限値に張り付かず減衰します。


fs = 44kHz, 30Hz Sin 波の周波数スペクトル(Raspberry Pi 3)0.4dB ゲインあり

LTspice の過渡応答シミュレーションの結果では Duty 比 100%が続いたら 0.9V に張り付いており、減衰するような波形にはなりません。何かシミュレーションをミスっているんでしょうか?それともまだ隠し要素があるんでしょうか……?

編集者: すずき(更新: 2021年 5月 9日 17:56)

コメント一覧

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



2021年 5月 8日

Raspberry Pi のオーディオ出力 その 3 - ボリューム調整

Raspberry Pi 3 のオーディオ出力はハードウェア PWM を使っているみたいです。適当に PWM の FIFO レジスタにデータを書き込むと、オーディオ出力に変なスパイクが出ました。さらに PWM の FIFO モードを解除して各 PWM チャネルを直叩きすると、Left が PWM1 で Right が PWM0 と対応していることもわかります。Raspberry Pi の Schematics とも一致しますし、おそらく間違いないでしょう。

RasPi の Audio Out と HW PWM の出している信号を同時に見たかったので、GPIO Function Select を直接弄って GPIO13 ピンに PWM 信号を同時に出して(※)みました。黄色の Ch1 が Audio Out で、水色の Ch2 が PWM の信号です。


fs = 44kHz, 30Hz Sin 波の周波数スペクトル(Raspberry Pi 3)

(※)やり方は GPFSEL1 の FSEL13(bit 11 - 9)を 0b100 にするだけです。GPFSEL1 はアドレス 3f200004 にあるので、例えば元の値が 0x24000 だとしたら 0x24800 に変えれば OK です。

クリッピングの末に

30Hz の Sin 波を再生していますが、頭が欠けたような変な波形になっています。最初は理由がわからなかったのですが Facebook で色々コメントいただいたりして調べているうちに原因がわかりました。ボリュームが大きすぎでした。

先程の波形を取得したときのボリューム設定では 0.4dB のゲインが掛かっています。この設定だと Sin 波の頂上付近がクリッピングされて PWM の出力が 100%固定になっています。


ボリューム設定、0.4dB ゲイン


fs = 44kHz, 30Hz Sin 波の周波数スペクトル(Raspberry Pi 3)0.4dB ゲインあり

次がゲインを解除した設定です。PWM 波形が 100%に張り付いている時間が大幅に減って、オーディオ出力も割と綺麗なSin 波になります(実は拡大するとうねってますけど…)。


ボリューム設定、ゲインなし


fs = 44kHz, 30Hz Sin 波の周波数スペクトル(Raspberry Pi 3)ゲインなし

色々な周波数を試したところ 1kHz, 2kHz くらいまでは割ときれいです。


fs = 44kHz, 1kHz Sin 波の周波数スペクトル(Raspberry Pi 3)


fs = 44kHz, 2kHz Sin 波の周波数スペクトル(Raspberry Pi 3)

ところが 4kHz, 8kHz 辺りになってくると波形がウニョウニョし始めます。


fs = 44kHz, 4kHz Sin 波の周波数スペクトル(Raspberry Pi 3)


fs = 44kHz, 8kHz Sin 波の周波数スペクトル(Raspberry Pi 3)

11kHz になるともはや Sin 波には見えません。


fs = 44kHz, 11kHz Sin 波の周波数スペクトル(Raspberry Pi 3)

編集者: すずき(更新: 2021年 5月 9日 16:52)

コメント一覧

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



2021年 5月 5日

ぶきあつめコンプリート

The World is Your Weapon をコンプリートしました。2018年にふりーむ!で公開されたフリーゲーム「ぶきあつめ」の Steam 移植版です。ふりーむ!版でも十二分に遊べますが、作者さんを応援したいってことで購入しました。


ぶきあつめコンプリート

Steam 版はダンジョン探索ゲームが追加実装されていますが、本筋と関係ないうえ非常に長いです。私はほとんどやってません……。

一応、ふりーむ!へのリンクも貼っておきましょうか。
ぶきあつめ 〜なんでも武器になる RPG〜 - ふりーむ!

ぶきあつめでは、近づけるものはほぼ何でも(モノ、人、モンスターなど)武器にできます。RPG をやりなれている人は、スルーしてしまいそうな壁や床といった意外なものまで武器にできます。常識を捨ててプレイしましょう。私のお気に入りは地面の穴、ヘイワ村、海ですね。「ええっ!?それ取れるんだ??」と思わず笑ってしまいます。しかも案外強いです。海なんてほぼ最強ランクじゃないですかね?

このゲームは剣や杖など普通の意味での武器の形をしているものを除けば、基本的に大きなものほど強い傾向があります。ただし大きなものは上側の視界を塞ぐので非常にゲームがやりづらいトレードオフがあります。特にヘイワ村や海などは上半分がほぼ見えなくなるため、気づかないうちに上からモンスターに殴られることがあります。

エンディングは 4つ(通常)+1つ(シークレット)ですが、Steam 版はシークレットエンドが実装されていないのか、条件を満たしても発生しませんでした。ちょっと残念。

メモ: 技術系?の話は Facebook から転記しておくことにした。大幅に追記。

編集者: すずき(更新: 2021年 5月 9日 16:01)

コメント一覧

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



2021年 5月 3日

Raspberry Pi のオーディオ出力 その 2 - 周波数スペクトル

引き続き Raspberry Pi 3 のオーディオ出力波形がグニャグニャしている謎を調べます。サンプリング周波数の 1/4 の矩形波を再生(理想的な周波数変換がなされると Sin 波になるはず)を出力した際の周波数スペクトルを見ます。パワーを合わせるために波形の最大値を 3.2V くらいに合わせて測ったつもりです。が、RasPi 3 の波形は歪んでいてピークがわからないので、合っているか自信ありません。参考程度です。

Raspberry Pi 3 のオーディオ出力です。ピークの 11kHz 以外に 15.5kHz や 37kHz など、多数の高調波が出現します。高調波は安定して出現するので、波形の崩れは外乱やノイズではなさそうです。


fs = 44kHz, 1/4 fs = 11kHz Sin 波の周波数スペクトル(Raspberry Pi 3)

続いて fs = 48kHz で 12kHz の Sin 波を再生した場合です。12kHz、36.5kHz、60kHz、85kHz 付近、つまり 3次、5次、7次……のように奇数倍の高調波が出ます。なんだこれ?


fs = 48kHz, 1/4 fs = 12kHz Sin 波の周波数スペクトル(Raspberry Pi 3)

Creative Sound Blaster X-Fi Go! Pro の fs = 44kHz で 11kHz Sin 波出力です。きれいに「11kHz のみ」にピークが出ます。オーディオ機器ならこれが普通ですよね。


fs = 44kHz, 1/4 fs = 11kHz Sin 波の周波数スペクトル(Sound Blaster X-Fi Go! Pro)

矩形波を周波数領域に変換すると 1f, 3f, 5f, ... のように奇数次にスペクトルが出ます。Raspberry Pi 3 のオーディオ出力も同じ傾向がありますから、おそらく PWM 波形をフィルタしてオーディオ出力を作っているのだろうという予想が立ちます。

編集者: すずき(更新: 2021年 5月 9日 16:28)

コメント一覧

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



2021年 5月 2日

Raspberry Pi のオーディオ出力 その 1 - 波形観察

何気なく使っていた Raspberry Pi 3 のアナログオーディオ出力ですが、少し調べてみたところ、かなり変な動きでした。音は出ますが、まともなオーディオ用の回路には見えません。変な点はとりあえず 3つ見つけました。

変な点 1つ目。サンプリング周波数(fs)の半分、つまり 1/2 fs の Sin 波(fs = 48kHz なら 24kHz)が出ません。無音です。オーディオ用の DAC ならば、1/2 fs の Sin 波を出すときに波形が崩れることはあろうとも「無音」はあり得ません。この時点で RasPi 3 のオーディオ出力は変です。どこかで音が出なくなる周波数がありそうですが、上限の周波数までは調べ切れていません。

変な点 2つ目。サンプリング周波数(fs)が 44kHz 系でも 48kHz 系でもありません。1/4 fs の矩形波を入力すると出力は Sin 波になります(フーリエ変換が理想的だった場合)。他の波形と違い歪みがわかりやすいので、私がオーディオ機器をテストする際によく使います。

本来は Sin 波になるはずなのに fs = 44kHz でも 48kHz でも、Sin 波とは程遠い歪んだ波形になります。同じデータを Creative Sound Blaster X-Fi Go! Pro で出力するときれいな Sin 波になります。やっぱり RasPi 3 のオーディオ出力はおかしいです。


fs = 44kHz, 1/4 fs = 11kHz Sin 波の波形(Raspberry Pi 3)


fs = 44kHz, 1/4 fs = 12kHz Sin 波の波形(Raspberry Pi 3)


fs = 44kHz, 1/4 fs = 11kHz Sin 波の波形(Sound Blaster X-Fi Go! Pro)

変な点 3つ目。なぜか GPU を制御しています。RasPi 3 は Broadcom BCM2837 という SoC を使っています。サウンドドライバは linux/drivers/staging/vc04_services/bcm2835-audio/ の下にあるんですけど、このドライバの実装を見ると VideoCore 4 と呼ばれている GPU にデータを投げつける実装になっています。

GPU のはずの VideoCore 4 にサウンドデータを投げつけると音が再生される、謎の仕組みです。Video じゃないのに……??

編集者: すずき(更新: 2021年 5月 9日 16:10)

コメント一覧

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



link もっと前
   2021年 5月 9日 ---> 2021年 4月 30日
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 5/9 17:56

カレンダー

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

最近のコメント 5件

  • link 20年12月19日
    すずき 「なるほど、地元愛 No.1 は福岡なんで...」
    (更新:05/02 00:08)
  • link 20年12月19日
    Twitterから 「> 大学時代に知り合った人たちを思...」
    (更新:04/28 13:38)
  • link 21年04月12日
    すずき 「コメントありがとうございます。ご参考にな...」
    (更新:04/18 22:39)
  • link 21年04月12日
    たくじ 「こんにちは。\n記事読ませていただきまし...」
    (更新:04/16 17:22)
  • link 21年02月28日
    すずき 「ですね、その辺りも違います。違いを全部示...」
    (更新:03/06 00:21)

最近の記事 3件

link もっとみる
  • link 21年05月09日
    すずき 「[Raspberry Pi のオーディオ出力 その 4 - オ] ...」
    (更新:05/09 17:56)
  • link 21年05月08日
    すずき 「[Raspberry Pi のオーディオ出力 その 3 - ボ] ...」
    (更新:05/09 16:52)
  • link 21年05月03日
    すずき 「[Raspberry Pi のオーディオ出力 その 2 - 周] ...」
    (更新:05/09 16:28)

こんてんつ

open/close wiki
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 過去日記について

その他の情報

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