HYPERCONCERTO株式会社のチーフエンジニア雑記Blog

hyperconcerto株式会社のチーフエンジニアが日々気づいたことを書いています

またヘッドホンアンプを作ってみました

引っ越したり色々あったので更新がとても遅くなりました。

前回作ったヘッドホンアンプはICをつなぐだけでできるのであまり面白くありません。
個人的には気に入ってなかったりします。
実はあの作例のだいぶ前から電流増幅部分をICではなく、単体の素子で作りこんだアンプを作っていました。

1~2代目は分解されてしまったので写真無し

1代目は4極ヘッドホン用に小規模な回路で試作しました。
色々妥協した設計でしたのであっさり動きましたが、面白くないので大電流動作させようと設計変更しましたがここから泥沼へ…

2代目は大電流でヘッドホンを駆動しようとしましたが、熱暴走する上に動作が不安定なのでやめました。

3代目(一部分解済み)
f:id:hyperconcerto:20161018220348j:plain
熱暴走するならヒートシンクつけたらいいのでは?と安直な考えで生まれたのが3代目です。
写真には写っていませんが、この基板の2倍の大きさがある電源が付いています。
回路構成を極力統一化してトラブルを防ごうとしましたが、手配線特有のばらつきは解消できず片耳側だけ音が歪むという致命的な問題がありました。
増幅回路の安定化手法に関するナレッジについては収穫がありましたので4代目の設計に入りました

4代目
f:id:hyperconcerto:20161018220025j:plain
変なこだわり?は捨ててシンプルに作ろうというわけで、電源はACアダプターにして消費電流も控えめに設計しました。増幅回路の形式によって解消できない暴走が起きるので、いままでと違う増幅回路にしました。
細かい話をすると、ヘッドホンの入力側って見た目は電線なんですが複雑な作用をします。
その影響を断ち切る構造が必要なので大幅な設計変更をしました。
今回はまったく同じ回路を4つ並べて配線間違いのリスクを減らしました。
これも4極ヘッドホン用に作りました。
今もACアダプターをつなぐと動きます。
しかし変なこだわりは捨てられず、特殊な増幅ICを使っているので汎用性がありませんでした。

5代目
f:id:hyperconcerto:20161018220018j:plain
4代目の結果を受けてさらに簡素化して、普通の増幅ICを使えるようにしたのものです。抜群の回路安定性で不安定な高周波増幅ICを使っても動作します。
いい加減動くと思ったので、手配線せずに基板屋さんで製造してもらいました。
(部品実装は自分でやりました)
これは普通の3極ヘッドホン用に作りました。

基板製造!?って驚く方が多いと思いますが、基板製造委託って今はそれほど難しくないんです。
回路CAD使えたら注文は簡単ですし、回路CADもオープンソースの物があります。
私はKiCADを使っています。
製造のほうは海外へ注文すればかなりお安くできます。(納期確認とかデータ不備について英語で対応できればですが…経験談)
少ない枚数(5枚以下)でも作ってくれるので、自作派の方は検討しても良いかもしれません。

5代目を聞き比べ
iPhoneにつなぐことを想定して作っていましたので、iPhone6 Plusで試してみました。直結より音の広がりが良いです。というかiPhoen6 Plusはかなり音が良いと思います。
数万円するDACと同じぐらいだし、ノイズもないので音楽プレーヤーとしても優秀だと思います。
ついでにiPhone7 Plusと6で比べてみました。7からイヤホン端子がなくなりましたので、劣化を気にしていたのですが、やはり劣化してました。音が平らで広がりがかなり弱くなりました…

最後に
自分で作ったアンプだと思い込みでまともに聞こえている可能性があります。不安になったのでまともな特性なのか調べてみました。
f:id:hyperconcerto:20161018225001p:plain
このグラフは各周波数でどの程度の音量(正確には電圧)なのか測定したグラフです。
下が周波数で、20kHzまでが人間が聞き取れる周波数だそうです。
イコライザーアンプなどはこの特性を意図的に変化させるように作られています。
今回のアンプは標準的な特性ですので問題はなさそうです。(多分…)

こんな事してますが、専門分野はWindows Serverなどです。

むき出しの基板だと使いにくいので箱を作らないといけませんが、工作のセンスないんです。
穴あけるだけは簡単ですが・・・

ヘッドホンアンプを作ってみました

前回からの続きです。
部品を入手し作ってみました。
今回の回路で主役となるBUF634はDigikeyで買いました。
購入理由を英語で書かないとだめだという制限はありますが、すぐに届くので便利です。
国内通販ではマルツパーツ館様で販売していると思います。

試作してみてわかったというか、回路図書いてた時点で予想していたのですけど増幅した信号をすぐに戻す経路を追加しないと正常に動作しませんでした。
追加しない場合は信号を入力してないのに、無意味な信号が出力されます。
(いわゆる発振という状態ですね)
メーカーのアプリケーションノートそのままの回路なんですが・・・

修正回路図
f:id:hyperconcerto:20160809213508p:plain

出力と-入力に10pFのコンデンサを入れました。
たぶん22pFのコンデンサがいいと思います。実際の製作時も22pFを使用しました。(手持ち材料の都合で)

完成したらこんな感じになりました。
f:id:hyperconcerto:20160808222020j:plain
※ステレオで作ってます
針金が無かったので、0オーム抵抗でジャンパーをしました。
無計画に配線したのがばればれです。

通電してみると、やはり配線間違いがあったので何度か修正して動くようになりました。
とりあえずオシロスコープで見てみましょう。
f:id:hyperconcerto:20160808222025p:plain

意図した信号が出ているので問題なさそうです。
最初なんでオペアンプはNJM4580を使いました。

レッツ試聴
モニター系ヘッドホンで聞いてみましたが普通に鳴りました。
こもったりとかそういうことも無く良い感じです。
このヘッドホンは良くないアンプで効くと良くない音になるので、試聴には便利なのですが機器を選ぶのが難点です。
イヤホンで聞いてみるとすっきりしない感じがしました。

音が出ることが確認できたのでオペアンプの差し替えをやってみました。
しかし、回路的に不安定なようで高性能オペアンプを使うと上手く動作しませんでした。
色々試したところ、ADA4627が相性良さそうでしたが、このICは国内入手が絶望的なのでそれを除くとOPA2134やNJM4580あたりが良いかと思います。

製作コストをのぞけば簡易な回路で良い音がでますのでお勧めです。

次回のネタもヘッドホンアンプでいこうと思いますが、試作段階でかなり苦戦しています・・・

ヘッドホンアンプを作ってみよう

先日ポタフェスに行って来ました。
ポータブルオーディオの新製品展示や試聴ができるイベントです。(秋葉原で開催していました)
ポータブルというわけですので、イヤホンやヘッドホンの展示がメインであとは携帯用のヘッドホンアンプが出ていました。

実は携帯電話のイヤホン端子ってあんまり音がよくありません。
そのためヘッドホンアンプというものが販売されていて、結構ブームになっています。
なぜ音が良くないかというと携帯電話という機械の性格上、音楽を聴く機器ではないのでそれほど高性能なヘッドホンアンプICを使っていません。
携帯機器なので流せる電流も最低限なので、ヘッドホンやイヤホンに対する駆動力が足りなくなります。
ヘッドホンアンプってそれほど難しい回路じゃなくても作れるので、回路図を書いてみました。

f:id:hyperconcerto:20160723215702p:plain
※モノラルで書いてます。普通はステレオなのでこの回路を2個作る必要があります。

回路シミュレーターの都合でLT1010はBUF634に変更します。
本当はLT1010で作りたかったのですが、あの秋葉原さえ店頭在庫が無かったのでBUF634に変更しました。
BUF634のほうがだいぶ高いのですが…
(1個1000円)
ICで1個1000円はかなり高額な部類に入ります。というわけで一般的な機器では使用されないICです。

回路のキモですが、音楽信号はLT1115というオペアンプICで電圧増幅します。
これもシミュレータの都合でLT1115を使ってますが、NJM4580など一般的な2回路入りオペアンプなら大抵のもが使えます。
このオペアンプの出力に直接イヤホンなども接続しても良いのですし、実際にそのような製品が多いのですが電圧増幅を行うICで電流をたくさん消費する機器を直接駆動すべきではないです。
あくまで電圧増幅する物なので音の歪みが大きくなったりとか音がいまいちになります。
というわけでBUF634という電圧増幅は一切しませんが、電流をたくさん流せるICを後ろにつなぎます。
わざわざ高価なICを使わず1個20円のトランジスタなら4個で構成できますが、配線が面倒なので今回は妥協しました…

基板もうほとんど完成しているのですが、次回試聴してみます。
FPGAを放置してますがまた今度やります!

FPGAでLチカ ALTERA編

XilinxFPGAでCPUを自作しようとせっかくコードを書いたのですが、コンパイルできなくなったので放置したのが去年の話でした。
原因はライセンスファイルがおかしくなったのが原因のようです。
せっかく安くない評価ボードを買ったのに…
2台のパソコンで同様の事例が起きたので、ちょっと深追いする気にもなれません。
諦めモードでしたが、FPGAに対する興味は消えることもなく、Verilog HDLで書いてみたい熱が再発したので違う環境にしたいと思います。
というわけでチップベンダーをAlteraにしました。
Quartus Prime Lite Editionならライセンスファイルの管理もいりません。
そしてAltera製チップが搭載されている評価ボードも用意しました!

 

f:id:hyperconcerto:20160606223818j:plain

Terasic DE0-CV

アメリカなのにわずか2日で届くDigi-keyで買いました。
日本で買うより数千円お安いです。

さくっとコードを書いてしまいましょう…
と思いましたが完全にVerilog HDLの文法を忘れていました…
単純LEDが点滅するだけだと簡単すぎるので、4bitのカウンタを作って
それぞれの桁をLEDに対応させてみたいと思います。

 

わからないなりに書いてみたコード

gist89e6333a187e08712652d6841c8ceb7b

 

テストベンチ

gist1b7f27903e1c21c4c7ef1a8cb995058f

 

シミュレーションまではうまく行ったので、実機確認は次回

リソースメーターを作ってみる1

前回つくったなんちゃってスペクトラムアナライザをRaspberry Pi2に移植しようかと思いましたが
実行スピードに問題があるのでやめました。
納得できる描画速度にするにはPIC32MXあたりとシリアル通信しないと無理そうです。

というわけで作りかけの物がたまっていますが、新しいプロジェクトを開始したいと思います。
CPUやメモリの使用率を表示する物理メーターを作りたいと思います。
メーターといっても色々あるんですけど、ラジコン用のサーボモーターを使用してメーターを作ります。

ラジコン用サーボモーターは電子工作としてはメジャーなデバイスなんですけど、筆者は使ったことがありません。
PWM制御なのは知ってるのでファンクションジェネレータで動かすだけはやってみようかと思ったのですがうまく動きませんでした。
やっぱり検証用のボードを作らないとダメなようです…
PWM制御というのはパルスの幅を制御して見かけのON時間を調整する仕組みです?

Raspberry Pi2で作ろうかと思ったのですが、Raspberry PiにはPWMポートがありません。
1個だけの制御ならいいのですが複数同時制御だと辛そうです。
そのため専用機能を持っている組み込み用CPUをモーター制御用に使用して、ホストPCから負荷情報を受け取るようにしたいと思います。
使うCPU?というか動作環境は悩んだのですがArduino UNOにしましょう。
色々楽なのと、製品組み込みとかそういう用途ではないのでボードのコストと寸法は無視できます。
あと普及している機種なので、はまる事も少ないかと思います。

あと注意点ですが、5V動作のArduinoを選びましょう。
速いからといってArduino Dueを選ぶと3.3Vのためレベルシフト回路が必要になります。

というわけで今回は準備だけでした。
次回はArduinoで動かしてみますが、ラジコンサーボ用のライブラリが用意されているようなので思ったよりも楽かもしれません。

【Python】リアルタイムスペクトラムアナライザを作ってみる。 その2

今回はpyqtgraphというグラフ描画ライブラリを使います。
このライブラリはQtを使って描画するためmatplotlibより大幅に高速です。
早すぎて取り込みの方が追い付かないぐらいです。

前回のmatplotlib版だとマイクの前でしゃべってもかなり遅れて波形が出たと思いますが
今回のものはすぐに反映されます。
そのため、pyaudioによる録音速度がボトルネックになっています。
もっと早くキャプチャーできる仕組みがあればさらに細かな波形を書けると思います。

リアルタイム表示は結構面白いですね。

 

f:id:hyperconcerto:20160204230233j:plain

矩形波をファンクションジェネレータで発生させました。

高次のピークが理論通り記録されています。

 

f:id:hyperconcerto:20160204230236j:plain

いつもの正弦波です。

 

f:id:hyperconcerto:20160204230240j:plain

声を取り込みました。

 

例によってソースコードGithubに上げてあります。
自己責任の範囲でご自由にお使いください。

 

gist9c8f295f0619744b6f52

 

コードの書き換えられる部分について
変数Nは取り込む波形の範囲を示しています。
少なくすると取り込み時間が少なくなるので、レスポンスが良くなりますが代償として波形が粗くなります。
大きくすると取り込み時間が長くなるので、レスポンスが悪くなりますが波形がきれいになります。
1024が最適だと思っています。
RATEは解析する周波数の範囲です。
RATE割る2が対象周波数ですので、可聴域全体を解析するなら40000を指定してください。
ただ、音楽データは低音が多いのであまり反応しないでしょう。

本来はRaspberry piで実行したかったのですが、上記Nの値を8196にしないと動作しない事がわかり当然のことながら取り込み時間が非常に遅いので諦めました。
pyaudio以外の手法で取り込む必要があるのですが、Arduinoと違いRaspberry piはADコンバータを搭載していません。
(アナログ信号をデジタルに変換する機能)
外付けのADコンバータが必要ですが、比較的簡易に接続できる品種では速度が出ませんでした。
(SPI接続のMCP3002を試しましたがいまいちでした)
パラレル接続のADコンバータだとスピードが出そうですが、難易度が高そうです。
次回に続く?

ハイパーコンチェルト株式会社

 

【Python】リアルタイムスペクトルアナライザを作ってみる。その1

FFTスペアナを作ります。
入力にはマイク端子を使いますので測れるのは可聴域のみとなります。
オーディオ機器についているピークを示すレベルメーターとほぼ同じ物になります。
そもそもスペアナって?
信号に含まれる周波数を分解して、それぞれの信号の強度を表示します。
この分解する時に高速フーリエ変換という計算をして所定のデータを取り出します。
と書いていてもいまいちわからないので、動いているときの写真を載せます

f:id:hyperconcerto:20160128211345p:plain


上が信号の波形で、下が信号強度を表示しています。
ファンクションジェネレータで生成した1kHzの正弦波なので1カ所にしかピークが出ません。

コードの紹介
前回掲載した手順で構築された環境であればコピペで動作すると思います。
必要なモジュールはmatplotlibとnumpyとpuaudioです。

例によってGithubに上げてあります。
ソースコードは自己責任の範囲でご自由にお使いください。

Matplotlib realtime audio FFT


使い方
パソコンのマイク入力に、測定したい信号源をつなぎます。
例えば自分の声を調べたい場合はマイクをつなぎます。
音楽を調べるときは、ヘッドホン出力を直結します。
微弱信号であれば、変換端子を自作して回路と接続できますが、パソコンが壊れるかもしれません。
コードを実行すれば測定開始です。

注意事項
録音デバイスの優先度が重要なので、特にUbuntuなどの場合はarecord -lの結果などを確認してから使ってください。
何も波形が出ない場合は録音デバイスが動作しているかよく確認してください。
このソースコードはRaspberry Piだと、デバイス指定やCHUNKの値が小さすぎるため動かないと思います。

動かしてみたらわかると思いますが、かなり遅いです。
遅い原因はmatplotlibで、描画が遅いためカックカクになるんです。
これを解決するために次回はpyqtgraphを使用して実装しましょう

 

ハイパーコンチェルト株式会社