読者です 読者をやめる 読者になる 読者になる

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

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

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

前回からの続きです。
部品を入手し作ってみました。
今回の回路で主役となる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を使用して実装しましょう

 

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

【Python】Windowsで開発環境を作ってみる

PythonWindowsで開発環境を作ってみる

今大人気のPythonに挑戦したいと思います。
本当は、Raspberry PiがPython使わないといけない関係で、日常的に使うWindows
開発環境を作ろうかと思いついたわけです。

結論から言うとかなりはまりました。
色々妥協した結果一通り動く環境ができたので環境構築手順をまとめておきます。

OS
Windows 8 64bit
Windows 7 64bit

まずインストールするパッケージですが、お題としてリアルタイムFFTに挑戦したいので
numpyとmatplotlibが必須となります。
ついでにscipyや高速描画グラフで有名なpyqtgraphも入れます。
最初は最新のPython3.5 64bitでいいかなと思っていたのですが、他のモジュールが入らないので断念しました。

構築手順
まずPython 3.4.4 x86 をインストールします。
環境変数に登録するをチェックしてください。
その後、管理者権限でコマンドプロンプトを起動しpipをバージョンアップします。
python -m install --upgrade pip
Pyaudioをインストールします。
python -m install pyaudio
numpyとscipyとPyQt4とpyqtgraphのインストーラー形式のモジュールをダウンロードしインストールします。

各ファイル名
numpy-1.10.2-win32-superpack-python3.4.exe
PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x32.exe
pyqtgraph-0.9.10.win32.exe
scipy-0.16.0-win32-superpack-python3.4.exe

pipでもインストールできそうな気がしますが、失敗するのでインストーラーで行ってください。
微妙に古いバージョンを使っている理由は、パッケージが壊れていてインストールできないためです。

最後matplotlibをpipでインストールします。
python -m install matplotlib

Visual Studio 2015のインストール
特別な設定は不要ですが、カスタムインストールでPythonの機能を有効化してください。

次回はmatplotlibとnumpyを使ってリアルタイムスペクトルアナライザを作ってみましょう

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