2015年 02月 03日

Mac でいっぱいUSB機器を繋げない問題

一定数以上のUSBデバイスを接続すると Mac が不安定になり、内蔵キーボード・トラックパッドなどが一切効かなくなる (USB バス全体が死ぬ感じ) という状況があり、よくわからないので、怪しいハブを止めたり、新しいハブを買ってみたりしていた。

そんななか、あるハブに替えたところバスが死ぬ前にエラーメッセージがでるパターンがようやく観測された。以下の通り (Console.app で USB を grep しながら見ていた)

the USB hardware ran out of device slots

このエラーメッセージで検索をかけたところ、まさにこの問題のことであろうFacebook のノートがひっかかった。

どうやら Haswell ではデフォルトだとたくさん繋ぐことができないらしい。このノートでもひとまずの解決方法が示されてはいるものの、USB 3.0 バスとの併用で疑問がある感じ。

リンクされているErgotron のドキュメントも読んだが、よくわからない。Haswell では25台以上はサポートしないと書いてあったり、もし30台以上のデバイスを繋ぐのであれば USB 3.0 デバイスは繋ぐなという感じのことが書いてある。

台数の根拠がよくわからないので、自分のところで追試を行なったが、「the USB hardware ran out of device slots」になるのは32台を超えたとき(32台までなら大丈夫)という感じだった。

そんなにいっぱい繋がないやろwww とお思いだろうか?

接続中のUSBデバイスの数

接続中のUSBデバイスの数は以下で出した。

system_profiler SPUSBDataType | grep 'Location ID' | wc -l

USB の規格上のデバイス数上限は127(USB のアドレスが7bitで、0は予約されている)、このアドレスは Mac 上では「場所 ID」や「Location ID」と呼ばれている。デバイスの抜き差しが発生していなければ普通は連番の番号が振られている。

上記コマンドではアドレスが割り振られたデバイスがいくつあるか? を算出している。なので現実世界における見掛けのデバイス数とは異なる。

手元の MacBook Pro Retina Late 2013 では何も接続していなくても以下のデバイスが有効になっている。

  • メモリカードリーダー(内蔵)
  • キーボード・トラックパッド(内蔵)
  • Bluetooth ハブ(内蔵)
  • Bluetooth USB コントローラ(内蔵)

つまり、外部にはこれらを抜いた28デバイスが最大となる。

USB 3.0 7ポートハブの罠

USB 3.0 ハブは USB 2.0 のハブの機能も持っている。これは、実際に物理レイヤーとして USB 2.0 レイヤーも持っている (USB 2.0 と USB 3.0 は物理プロトコルが全然違うからかな)。そんな関係からか、OS から見ると 3.0 のハブと 2.0 のハブ2種類が別々に見える。

あるチップの仕様書を見たりするとなんとなくわかりやすい、
http://ww1.microchip.com/downloads/en/DeviceDoc/00001681B.pdf

そして、7ポートのハブというのは、内部的には4ポートのハブチップを2個使って2段接続されている。

つまり、7ポートUSB3.0ハブは、見掛けは1台だが、OSには4つのデバイスに見え、SuperSpeed と Hi-Speed それぞれにアドレスが振られる。

どうしてもたくさん繋ぎたい場合

Ergotron のドキュメントに示されているように、とりあえず USB 2.0 の機器をたくさん繋ぎたい場合、

nvram -p | grep usb-options で何も設定されていないことを確認して

sudo nvram usb-options="%01%00%00%00"

を実行して再起動すると認識するようになる。

元に戻すには

sudo nvram -d usb-options

この方法は確かにデバイスの上限を突破できるみたいだが、手元で試したところバスが不安定になり、内蔵キーボードなどを巻き込んでバスが死ぬことがあった。

Mac の場合、USB 3.0 Hi-Speed バス (2.0 互換レイヤー)、USB 3.0 SuperSpeed バス (3.0レイヤー) のみがデフォルトでアクティブなバスとなっているが、このコマンドによって USB Hi-Speed バス (2.0 ネイティブレイヤー) のバスが有効になるっぽい。

消費電力が増えるデメリットがあるみたいだけど、他のデメリットがよくわからない。3.0 との併用がうまくいかない?

いずれにせよ、自分の環境では不安定になるのは解決されなかったので深く追わなかった。

自分の環境

これからは USB 3.0 だ!! と意気込んでハブ類は USB 3.0 にできるだけ統一しようとしており 7 ポートの USB 3.0 ハブを2台をメインにデバイスを接続していた。また、ディスプレイに内蔵されている USB 3.0 ハブも、どうせだからと接続していた。上記の罠の関係もあって、デバイス上限に達しやすい環境だった。

ハブがいっぱいあっても意味がないので、USB 機器は計画性を持って管理したほうが良い。上限いかねーよwwとか舐めてると余裕でひっかかる。

バスが死ぬのは、デバイス上限を超えるというエッジケース(仕様上は127台を超えるまで発生しない)をしっかりテストしておらず対応できないデバイスがあって暴走(バスをロック?)しているような気がする。バスが死ぬとCPUは生きているのにハードリセットしか終了方法がなくなるので絶対に避けたい。

まとめ

USB 2.0 ですむ範囲のデバイスは USB 2.0 用のハブでまとめたほうが良い。今回のようなケースもそうだし、コスト的にもかなり安くすむ。USB 3.0 が必要なケースはそれほど多くない。カードリーダーや、HDD などぐらいだ。

また、DELL のディスプレイにはカジュアルに USB 3.0 ハブがついているが「せっかくだから…」と繋いでおいたりすると、上限を超えやすくなる。

というか根本的に127デバイスまでちゃんといけるようにしてほしい。

iBUFFALO USB2.0Hub バスパワー 4ポート ブラック 【PlayStation4,PS4,PS3 動作確認済】BSH4U06BK - バッファロー

バッファロー

5.0 / 5.0

USB C Hub Type-C Hub One/in Macbook Pro 13 15/For 40gbps Thunderbolt 3 K HDMI PD Fast Charging Micro/SD Card USB 3.0 Port X 2 Multi Converter Adapter - FIESAND

FIESAND

5.0 / 5.0

4Kと2Kが同じにみえる、という人もいるらしい。

たとえば視力2.0の人が300ppiのディスプレーで十分に綺麗に(隣り合うピクセルを区別できない)見れる距離で使っていたとしたら、同じ鑑賞距離の場合視力1.0の人は半分の150ppiでも十分ということになってしまう。

というわけで、デスクトップのディスプレイを想定して鑑賞距離を50cm固定としたとき、各視力でどれぐらいのppiがあれば十分かを出してみた。

0.3 52 ppi
0.5 87 ppi
0.7 122 ppi
1 175 ppi
1.5 262 ppi
2 349 ppi

2K 24インチモニタの場合 96ppi なので、50cm の鑑賞距離の場合、視力 0.5 の人は 4K になっても気付きにくいということになる。

2015年 02月 02日

ディスプレイキャリブレーションの覚書

久しぶりにやるとカラーマネジメントまわりのことをすっかり忘れている。

キャリブレーションしてもOSのUIの色はあわない

写真を表示させるとあっているように見えるのに、OS の UI (例えば Finder の背景の白) とかがディスプレイごとに全く違う色に見えたりする。

正確な情報が見つからなかったけど、OS の UI にはカラープロファイルがついてない?っぽい。スクリーンショットを撮った場合、撮影した画像にはモニタのプロファイルが埋め込まれる (ので、この画像を移動させると、そのモニタにおける見えかたが再現される、はず…)。

同じように、ウェブページの背景色など、CSS で指定されている色もカラーマネジメントの対象外なので、たとえディスプレイプロファイルを適切に設定していても、色は一致しない。実は color-profile というプロパティがCSSに用意されているが、どのブラウザにも実装されていない。(追記: Safari では sRGB として扱われるのでカラーマネジメントの中にいるみたい)

色域が異るディスプレイ間での色一致

片方が Adobe RGB 対応で、もう片方が sRGB だけの対応という場合

Adobe RGB の色域の画像を表示させる
  • Adobe RGB モニタでは正確に出せる
  • sRGB では色が圧縮される

sRGB の色域の画像を表示させる

  • Adobe RGB モニタでは正確に出せる (sRGB 領域を含んでいるから)
  • sRGB でも表示できる

カラーマネジメントが有効なケースまとめ

印刷まで行う場合

これが基本になる。ディスプレイのプロファイルと、プリンタ(用紙も含む)のプロファイルを作り、カラーマッチングする。

この出力の場合 Adobe RGB モニタで、画像データも Adobe RGB の範囲で作業するのが望ましい。

ウェブ向けの場合

基本的に、世の中のモニタはキャリブレーションされていないので、正確なカラーマッチは期待できない。とはいえ、中にはあわせている人もいるので、基本的に sRGB で統一して出すのが一番良い。

画像データの恒久性

あとは自分の写真が将来的に一貫して同じ色で表示されるようにデータをちゃんとしておくという用途。

ちゃんとキャリブレーションされていないモニタで作業した時点で、データは何がなんだかわからない色を基準にしていることになってしまう。将来的にモニタを替えたときに色が変わってしまう。

Lightroom でのカラーマネジメント覚書

http://helpx.adobe.com/jp/lightroom/help/color-management.html#about_color_management_in_lightroom

Lightroom は内部的には ProPhotoRGB というカラースペースを使っている。これは Adobe RGB よりももっと広い色域を持つカラースペースになっている。Adobe RGB ではカバーしきれない範囲の色をサポートするプリンタのためこうなっているっぽい。

つまり、Adobe RGB のモニタを使っていたとしても、見えない色を作っている場合がある。これは、ちょっと難しい問題だ。もしプリンタの色域を活かすならばディスプレイとのカラーマッチを捨てる必要がある。ディスプレイとのカラーマッチを優先するなら、ディスプレイの表示色域に出力色域が制限される。

実際のワークフローでは以下のような手順が必要

全体的な調整

ソフト校正を使用せずに大まかに好みの画質に調整する。とりあえず色域のことを考えず見えている画像を最適化する。

印刷する場合

現像モジュールでソフト校正をプリントのプロファイルにあわせる。校正刷りをつくる。

色域外警告をちゃんと見ながら作業する。モニター色域外警告色の部分は頭で補完するか、実際に印刷して検証するしかない。

校正の色域外警告はソフト校正で「色が変わっている部分」なので、注目してチェックを行う。

ウェブ用に出力する場合

印刷する場合と一緒だけど、現像モジュールでソフト校正を sRGB にあわせる。

sRGB はかなり色域が狭く感じることがあるので、校正刷りを作るなり、ウェブ主体なら sRGB の状態で校正かけるなりしたほうがよさそう。

色域

綺麗な青緑系の色は sRGB モニタでは殆ど表示できない。ので、意図的にホワイトバランスを崩したりしている場合かなり色が変わることがある。

cwebp はメタデータを削除する

WebP に変換するデモコマンドである cwebp はデフォルトでメタデータを全て削除する。ICC プロファイルすら消しさるのでかなりひどい。

  -metadata <string> ..... comma separated list of metadata to
                           copy from the input to the output if present.
                           Valid values: all, none (default), exif, icc, xmp

必要なメタデータ削っといて「ファイルサイズ減りました!!!」とか言わないように気をつけてください。

2015年 01月 28日

アンプの増幅率を変えず、前段で減衰させるのはなぜか?

こういう回路で、大抵の場合音量調整用のボリュームは入力についており、アンプ本体の増幅率は固定になっている。なんとなく「増幅率のほうを変えたほうが効率が良くないか?」と考えてしまう。

答え

アンプの増幅率を設定する抵抗 (入力抵抗と帰還抵抗) は繊細な部分なので、長く配線をひきまわしたりできない。余計なことをすると発振する。

また、使用時に増幅率を変えられるようにすると、ボルテージフォロワ状態で発振しないように位相余裕をとる必要があり、設計に制限が増える。つまり余計なことすると発振する。

リモートボリューム

しかし、前段で減衰させて入力を行うのは、S/N的には不利になる。なので、抵抗の位置はそのままにして、遠隔で抵抗値を可変できれば良いのではないか? と考えたりできる。

デジタルポテンショメータ (デジタル可変抵抗) はまさにそういう用途に使えそう。こういったゲイン可変のアンプは、プログラマブルゲインアンプという名前がついていたりする。一方、デジタル制御する場合、それ自体がノイズを出すので、S/N改善目的では難しい面もありそう (試してない)。

2015年 01月 22日

シミュレーションしたヘッドフォンアンプを作ってみる

いくつか回路をシミュレーションしたが、ClassAA のヘッドフォンアンプは今まで作ったことがなく、ブリッジの応用の部分がかっこいいので、実際に作ってみたくなった。比較的高出力なオペアンプを選べば能動素子をオペアンプ以外使わなくてもかなり良さそうなので気が楽だ。

回路

シミュレーションで、出力や発振しないかなどを確認した上で、実装しやすいように (手元にある部品で作れるように) 定数を変更している。

ブリッジにしろ、帰還抵抗にしろ比率が保たれていれば良いので、比較的自由がある。

増幅率は3倍にしてあるが、1〜2倍程度でもいいかなという気がする。あまり下げると (つまり帰還を多くすると) オペアンプによっては発振しやすくなるみたいだが、事前にシミュレーションしてある程度確認できるぶん、定数設定が楽だ。いわゆる Zobel フィルタ (高周波発振を防ぐ) は入れてないけど、負荷をちゃんとシミュレーションしていないので、安全のためにはいれたほうが良さそう。

出力インピーダンスはほぼ出力についている抵抗値に等しくなる (=1Ω)。入力インピーダンスはボリュームの値になる (=10kΩ)。

電源

±9V の両電源をトランスから、リニアレギュレータを介して生成している。これは特に理由はなく、もともとあった昔作ったヘッドフォンアンプの電源を流用しているため。高校生ぐらいのときに作ったところなので、ちゃんと作りなおしたほうがよさそうだけど、そのまま…

実体配線図

例によって Eagle に回路を起こしなおし、基板検討を行い。C基板 (25×15 穴) にほぼ収まるように配置した (GND ラインがはみだしてる)。ブリッジ部分が綺麗に配線できるか心配だったが、思いのほか綺麗にいった。ジャンパはパスコン部分だけ。

低周波回路では基板上でも一点アースにして共通インピーダンスをなくすのが非常にノイズ対策に効くのだが、基板の面積的に厳しいので、GND と V+ V- を太めのスズメッキ線を使って配線するようにした。

実際つくったもの

その後検討しなおしたもの

できるだけ、電源の配置を電流が多く流れる出力側にしたり、基板サイズにあうようにした

測定

オーディオアナライザなどはないので、簡易的な測定しかできない。PCオーディオインターフェイスを介して測定を行う。

測定環境

Xonar U7 のヘッドフォン端子から、ヘッドフォンアンプに入力し、ヘッドフォンアンプから、Xonar U7 のライン入力に繋いでいる。

この状態で RMAA (RightMark Audio Analyzer を使って測る)

測定環境ではループバック測定した場合 THD 0.0019% / SN -110dB 程度。これよりも精密な測定はできないので、これよりも悪くなければとりあえず良いということにする。

測定結果

ClassAA RMAA

全体的にそんなに悪くはなさそうだけど、測定限界まで良いとは言えない。Noise level の FFT を見ると、電源を内蔵としたためか、50Hz とその高調波が出力に少し出ている (最大で -100dB 程度)。耳には聞こえないレベルではあるがちょっと気持ちは悪い。これをどうにかしないと測定限界を超えられなさそう。

つまり何も考えないで作った電源がネック

まとめ

別にこれによって音が良くなったかとかは感じないのだけど、自分で作った回路を通して音を聞くというのは気分が良い体験で、面白い。

あいかわらずノイズ対策が最も難しく感じる。いまいちどこから飛びこんでいるノイズなのかがわからない。ボリューム位置で少し変化するので少なくとも入力には多少入っているみたいだ。聴覚上聞こえなくても測定はできる。

できれば、最近そこらにころがっている5V USB を電源にしてコンパクトに作ってみたい。5V から昇圧をかけてノイズフィルタとレギュレータを通す、みたいな。

ASUS Xonar U7

ASUSTek ハイレゾ対応 USB DAC 7.1ch対応 Xonar U7 - ASUS

ASUS

5.0 / 5.0

現時点で最高の USB オーディオデバイスだと思う。

つくった回路の評価のためにもオーディオアナライザが欲しいところだけれど、本物は非常に高価で手に入らない。オーディオに特別思い入れもないのにそこまで投資する気にはなれない。

ただ測定なしでは作る意味が全くないので、RMAA ぐらいは通したい、ということで、今手に入る中で性能的にコスパ最高のを探したところ、そこそこ最近出た ASUS Xonar U7 が良いということがわかった。

RMAA テスト結果

さっそく音楽鳴らすよりも先に RMAA を走らせて見たけど、非常に良いっぽいことはわかった。これはヘッドフォン出力からライン入力に入れて、ライン入力のレベルを最大にしたままヘッドフォンを調整して測定した。(ループバックのテストなので、出力と入力の特性が混ざっている。つまり出入力いずれも優秀でないと良い結果にならない)

ノイズが本当に皆無なのがすごい。後段にヘッドフォンアンプをつけてボリュームを最大にしてもホワイトノイズが聞こえてこないレベル。

余談

実は UR22 を買ったちょっとした後に、SDR 用サウンドカードテストのページを見たら載っていて知っていたのだが、SDR だけのためにさらに機械を買うのもという感じで保留していた。

SDR (ソフトウェア無線) ではサンプリング周波数が同時に見れる帯域幅そのものになる。いわゆるハイレゾオーディオインターフェイスは、ハイレゾ音源がそれほどない現時点では謳い文句と裏腹にSDRでの実利が非常に大きい。

SDR 用では視覚的にFFTされた結果を見ることになるので、サウンドカード由来のノイズは非常に気になりやすい、良いSN比や帯域のフラット性が重要になる。そういう意味でも Xonar U7 は現時点で最高の選択っぽい。

2015年 01月 14日

LTSpice でヘッドフォンアンプを解析する

LTSpice に慣れようということで、いくつか代表的なヘッドフォンアンプの回路をシミュレーションし、全高調波歪率 (THD / Total Harmonic Distortion) を出してみた。

オペアンプには単体で70mAまで電流をとれる NJM4556A で全て統一し、増幅率もほぼ同じになるように組んだ。

回路

オペアンプ1回路・バッファなしシンプル

THD=0.000134%

部品点数が少ないし、普通に使うぶんには完全に十分そう…

オペアンプ2回路・出力増強

THD=0.000131%

オペアンプ1回路・ダイアモンドバッファ

THD=0.000150%

ヘッドフォンアンプだと良く使われるバッファ

オペアンプ2回路・ClassAA

THD=0.000055%

オペアンプ2つを使ったものだけど、パラにしているわけではなく、ホイートストンブリッジを使い電圧増幅するオペアンプと電流増幅するオペアンプとで役割をわけたもの。実際に作る場合、最初のオペアンプは殆ど負荷がかからないようになっているので、もっと低歪みのオペアンプを使う。

備考

電流に余裕があるオペアンプなためバッファなしで十分良いという感じになった。

LTSpice

.four コマンドは .tran 解析の後、指定した回路のポイントをFFTして高調波歪を求められる。出力はログ (Cmd+L) に出る。デフォルトでは第9高調波まで算出するが、十分っぽい。最後に THD が表示される。

.option plotwinsize=0 を指定しないと、ものすごい数字が出てしまい、ハマった。このオプションはLTSpiceに対し、解析結果のデータ圧縮を無効にする効果がある。LTWiki の FAQ にもなっていた。歪み率を算出したいのに、データ圧縮が効いているとどうしようもない。

このへんが参考になった

http://lowreal.net/2015/01/14/3 に続く

LTSpice の小技

複数の解析コマンドを簡単に切替えたい

Comment と Directive が同じ画面で編集になっているという点に気付く。

つまり、解析コマンドのまとまりごとに別の Directive のまとまりを作り、必要ないものは Comment に切替えておくという手段をとるのが一番簡単。いちいち行頭にセミコロンを付けてまわるとかしなくて良い。

よく変更するパラメータに名前をつけたい

.param ディレクティブを使えば、任意の数値に名前をつけられる。参照するときは {name} とすれば良い。

LTSpice でヘッドフォンアンプを解析する2

http://lowreal.net/2015/01/14/1 の続き

NJM4556A は 70mA と余裕があるオペアンプだが、こんなに電流とれるオペアンプはそれほどないので、もう少し普通のオペアンプで試してみる。

OPA2134 (= OPA134) という低歪みなオペアンプで試す。これは出力電流が±35mAと、丁度 NJM4556A の半分となる。

回路

オペアンプ1回路・バッファなしシンプル

THD=19.97%

電流が足りず、クリッピングしてる。

オペアンプ2回路・出力増強

THD=0.000041%

オペアンプ1回路・ダイアモンドバッファ

THD=0.000116%

オペアンプ2回路・ClassAA

THD=0.000022%

片方は電流ソースになるので NJM4556A のままにしてある。THD はこれが最低。