2021/07/26(月)D級ヘッドホンアンプと出力フィルタと負帰還

Twitterにも書きましたが、D級ヘッドホンアンプ Ver2 / pwm-hpa2をいじっていました。

出力フィルタの意味と役割

pwm-hpa2_1ch.png

D級である限り、出力フィルタは避けて通れないものです。この出力フィルタ(L5/C5)は、高周波のスイッチノイズを除去するために入れていますが、再生音を良くするためというよりは、余計なノイズ(電波)を巻き散らかさないためという意味合いが大きくあります。

第2世代と呼ばれるD級アンプは、原理的に「LCフィルタを入れなくても十分に放射ノイズ(EMI)が少ない」ことが利点として挙げられています。TPA3110D2なんかもそれです。

ノイズの問題を一旦おいておけば、L5があったほうが良いか、無いほうがよいかは難しい問題ですが、うまく動作させられるならばL5は無いほうが良さそうです。実際、TPA3110D2アンプの音が良いのは、そういう点も影響しています。

出力フィルタの影響をなくしたい!

フィルタを無くすというわけにはいかないものの、フィルタの後ろからフィードバック(負帰還)をかけて出力フィルタの影響を少なくするということは可能です。*1

D級アンプICですと、フィルタ前のフィードバックをやめることはできませんが(ミックスした負帰還になる)、自作回路ならL5の後ろからのみフィードバックすることは可能ですので、試してみました。

まず通常動作時です。(1)がL5の手前で、(2)がL5の後の波形になります。32MHzでスイッチしており、出力ではこのスイッチノイズが減っています。

pwm-hpa2_lpf1.png

次にL5の後ろからフィードバックをかけた波形です。

pwm-hpa2_lpf2.png

発振周波数が下がり、出力に±5Vのsin波が出ていますが(おそらく共振と思われる)、音質はこのほうが良い感じでした。

まとめ

AB級アンプで同じことをすると発振します。(自励式)D級アンプは元々発振させるものですので、どうせ発振させるのならフィルタの後ろから負帰還かけても良いんじゃない? という実験でした。

このまま使うのは躊躇しますが、もうひと工夫すれば pwm-hpa2 を更に進化させる可能性もありそうです。

2021/06/18(金)壊れたホットプレートと近況

Twitterすらろくに書いていないことに気づいて、たまにはブログも更新しておこうという。

壊れたホットプレート

GP6000/GP9000の鍋型ホットプレート。

GP6000_1.jpg
GP6000_2.jpg

どこが壊れたかというと、温度調整用のサーモスタットが壊れて、常にオフになりました。

GP6000_3.jpg

しかもバイメタルが壊れたというよりは、バイメタルに使われている金属接点とバイメタルの接合部が壊れた(抵抗値が大きい)ようです。「はんだ付けして直してやる」と意気込んだものの、すぐに慌てて吸い取ったりしました。*1

修理部品のサーモスタットだけ売ってくれないか問い合わせてみたけど、当然無理でした……。

ここで思いついた

ホットプレートを改造して、リフロー装置にするのはみなさんおなじみですが、ホットプレートを改造すればホットプレートを修理できるんじゃないか?と(笑)

大容量リレースイッチとか、PTCサーミスタとか、5V電源はUSB 5V1A電源使えばリレーの駆動も楽だなとか、マイコンは慣れてるMSP430でいいかなとか、かなり真面目に検討したのですが……結局面倒くさくてやめました(苦笑)

というより、ホットプレートとして使用する場合は、使い勝手を考えると筐体内に収める必要があって、それをするのは結構な労力と気づいて買い直しました。

そして

壊れたホットプレートが余りました。電熱線は生きてて、サーモスタットをショートさせてあげれば使用できます。一度その方法で使用しましたが、電源の抜き差しが大変でした……。

つまりリフロー炉にはできそうというわけで、もし欲しい人いたらあげます。処分しました。

*1 : 熱源に使用する装置にはんだ付けは厳禁

近況

キットの品切れが長いこと続いてるので、いい加減再販しようかなと思い、どうせ再販するならと「PCM2704 DAC」を魔改造したり、TPA1517をオフセットで選別したりしてました。

pcm2704v2-test.jpg
tpa1517_check.jpg

詳細は後日記事にしますが、もう限界かと思っていたPCM2704 DACの音、更に良くなります。

あとATH-AD2000のプラグがめちゃくちゃ劣化してたので、交換しました。どうせなら4極に。

AD2000_plug-01.jpg
AD2000_plug-02.jpg

HPAキットとかずっと以前からGND分離4極を採用していますが(HPAmsBerryDACも)、実は4極端子のヘッドホンを持ってなかったので初めて試せました。

「音の分離がめっちゃくちゃ良い!」

……当たり前の感想でした(苦笑)*2

なんかヘッドホンのBTLが流行りみたいですね。BTLの一番のメリットって電源効率なのでGND分離で十分じゃないかと思うんですが*3、使ってる方の感想を聞いてみたい気もする。

マイコン触り

そういえば最近ESP32とかも触っているのですが扱いやすいですね。C++でマイコンファームが書けるとか何事ですか、という感じがする。ラズパイPicoといい、1000円以下でこのクラスのマイコンがごろごろ売られているのですから、すごい世の中になったものです。

Z80アセンブラを書いては紫外線で数分かけてEPROMを消していた時代が懐かしい。*4

*2 : 3極の共通GNDですと、ヘッドホンのインピーダンスにもよりますが、左右分離は80dBぐらいが限界(物によって60dBぐらい)ですので……。

*3 : 4回路分作るなら、2回路分作ってコスト倍にしたほうが結果よくなりそうというのもあり。

*4 : 今にして思えば当時すでにEEPROM搭載のPICが登場していたのになぜ誰も使わなかったのか。

RTSP(H264/H265) to MP4の超低遅延ブラウザ再生(配信)

はてブ数 2021/02/22プログラム::TCP/IP

カメラ等で使われるRTSPストリームはブラウザとすこぶる相性が悪く、以前はFlashを使って親戚のRTMPが再生されたりしていましたが、もはや過去のお話。

最近は、分割した MPEG4 ファイルを連続再生する HLS や MPEG-DASH が主流です。しかし、すべてを数秒に分割する仕組みのため通信効率が悪くなってしまいますし、どうやっても遅延の問題が避けられません。

かと言って WebRTC はP2P用に設計されていて、ブラウザ間ビデオチャットには向いていますが、配信等の目的に使うことは難しく、そもそもUDPが使えない環境では動作もしません。

そこで超低遅延(1秒未満)のストリーミング再生(配信)システムを構築しました。

更新履歴

  • 2022/09/05 WebCodecs正式版に対応。
  • 2021/04/29 H.265/HEVCに対応。
  • 2021/04/21 エラー内容をHTML上で表示するよう変更。
  • 2021/02/22 初版。

デモ

デモを設置しています

rtsp:// で始まるURLを入力すると、RTSPをリアルタイムで変換を確認できます。残念ながら適当なフリーのRTSPソースがないため、各自ご用意ください(192.168.x.xxのアドレスで試す人が多いようですが、当然接続できません。グローバルIPを持ったRTSPサーバを指定してお試しください)。

  • Chrome および Firefox が推奨です。
  • 対応しているのは「H.264/avc1」か「H.265/hvc1(HEVC)」ストリームのみです。
  • デモはセキュリティのため以下の制限を加えています。
    • RTSPパスワード認証は使用不可に設定しています。
    • RTSP接続ポートは 554 のみに制限されています。
    • 再生時間は60秒に制限されています。
  • 「WebSocket Server Down」と言われた場合は、変換サーバの起動忘れなので、コメント or ご連絡ください。
  • デモですので、常識の範囲内でご利用ください*1

*1 : 外部から利用する等はやめてください。ログは取っていますので発見次第対処します。

仕組み

rtsp_to_mp4.png

RTSPサーバに接続して、リアルタイムでmp4に変換しています。コンテナ(フォーマット)を変換していますが再圧縮しているわけではないので高速に動作します。ffmpegを使っても同様のことが可能ですが、ffmpegでは変換過程で数秒程度の遅延が発生します。

ffmpeg -rtsp_transport tcp -i rtsp://<ip_address>/path -c:v copy -an -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof -f mp4 pipe:1

mp4に変換されたデータを WebSocket 経由でブラウザに送信し、受け取ったデータを JavaScript で MediaSource に入力し、VIDEOタグで表示しています。

let sourceBuffer;
const ms  = new MediaSource();
ms.addEventListener('sourceopen', function(evt){
	sourceBuffer= ms.addSourceBuffer('video/mp4; codecs=avc1.64001E');
});

const VIDEO = document.getElementById('video');
VIDEO.src   = window.URL.createObjectURL(ms);

const ws = new WebSocket('ws://example.com/');
ws.binaryType = "arraybuffer";

ws.onmessage = function(evt) {
	sourceBuffer.appendBuffer( evt.data );
}

実際はもう少し複雑ですが、フロントエンド(JavaScript)では難しいことはしていません。デモページ内のソースに、スクリプトが全部書かれていますので、興味のある方はご覧ください。

変換サーバは?

今のところ非公開です。興味のある方はメール等でご連絡ください。ライセンス等する予定です。

まとめ

  • 映像が目的だったため、今のところオーディオには非対応です。
  • H264の圧縮も伸張もしていないので、H264がらみの特許問題は起きないはずです。
  • Windows Media ServerやReal Serverがそうだったように、将来的にはRTSPが廃れるか、ブラウザがRTSPやRTSPライクな何かをサポートして状況は変化するように思います。

参考文献

  • html5_rtsp_player
    • WebSocket経由でRTSPサーバにアクセスし、JavaScript側でRTSP通信をしながらmp4を再構成しています。原理的には似ていますが、サーバ/クライアントでの処理分担が異なります。サーバはNode.jsで書かれていますが、30行程度のスクリプトでサーバを自作することも可能でした。
  • v4l2rtspserver
    • V4L2を使用した、RTSPサーバ。H264で出力をするためには、カメラがH264エンコーダーを内蔵しているか、V4L2対応のH264ハードウェアエンコーダーが必要。
  • fmp4streamer
    • V4L2(H264)なソースから、ブラウザで再生可能なH264ストリームを生成するソフト。やってることは一緒。ただ作り込みが甘いのか、試した限りだとリアルタイム性がいまいち。多少書き換えれば改善するかもしれもい。

メモ

Video4Linuxとffmpegを使用して、カメラからリアルタイムH265を吐き出す方法。

ffmpeg -f video4linux2 -i /dev/video0 -s 640x360 -c libx265 -pix_fmt yuv420p -fflags nobuffer -tune zerolatency -f rawvideo

これをそのままWebSocketで送信できれば、上記デモと全く同じ仕組みで、ブラウザ上にリアルタイムカメラ画像を取得可能。

2020/10/04(日)Huawei nova lite に Android 10(LineageOS 17.1)を入れる

前提条件

  • Oreo以降にアップデート済
  • ブートローダーアンロック済

カスタムカーネルを導入している場合は、作業前に必ずストックROMカーネルに戻しましょう。*1

*1 : いろんなROMを試しても起動せず、数時間ハマったらしい……

導入手順

概ねLineageOS 17.1の記事に書いてあるとおりです。

  1. OS本体とパッチをダウンロードします
  2. Honer P9 lite用のTWRPを焼く(相変わらずP8 Lite用はイマイチ
    fastboot flash recovery_ramdisk twrp-3.4.0-0-prague.img
    
  3. zipを解凍して出てくるOS本体を焼きます。
    fastboot flash system system.img
    
  4. リカバリを起動します。
  5. Wipe → Advance → System → Change File System → Resize File System
  6. cache等を wipe(消去)します(Wipeデフォルト)。
  7. 必要に応じてWipeから Format Data します。消去するとアプリ等の情報はすべて消えます。*2
  8. https://opengapps.org/ から ARM64 10.0 の nano か pico を落とし、TWRPからUSB(MTP)で接続するなどしてSD等に転送します。
  9. 転送した gapps を焼きます。
  10. los_patches_prague.zipを焼きます。
  11. 再起動します。

*2 : 消去したほうが確実ですが、しなくてもきちんと動作することもあります。

その他

関連記事