ゆけッ! やっせんぼ・とよちゃん!

オーディオプロセッサ(ver.1)の自作記録 (2010年10月24日)





どして?

タイムドメインスピーカー電子ボリュームの製作を終えて しばらくは自己満足していたのですが、人間の欲とは恐ろしいもので(笑)、今使っているグラフィックイコライザー BEHRINGER FBQ1502 と電子ボリュームを合体したものを作りたくなりました。 グラフィックイコライザーも色々いぢくる時が多いのです。 アナログなのでちょっと面倒くさい。 そういうわけで、電子ボリューム+グラフィックイコライザー+αを製作することにしました。 の部分は ちょっとしたエフェクトを入れられたら良いかなっと思っているのですが・・・どでしょか。(笑)




基本機能

基本的な機能としては

  • 50段階のアッテネーション、
  • グラフィックイコライザー、
  • ステレオエンハンス等の特殊効果、
  • 128x64ドットのグラフィックLCD表示 (メニュー画面用)、及び
  • ロータリーエンコーダーと、押しボタン、赤外線リモコンによるメニュー操作
とう感じです。

右図がブロックダイヤグラムです。 最上部がオーディオプロセッサ部、最下部がユーザーインターフェイス部です。 真ん中の部分はスペクトルアナライザー部なのですが、部品は全部そろっているのですが、時間の都合未製作のため 今回のレポートには入っていません。m(__)m

アッテネーションは基本的にソフトウエアで行います。 グラフィックイコライザで畳み込み処理を行うので そのカーネルのパワーを操作して結果的にアッテネーションを実現します。 50段階のレベルがあれば十分だと思います。

グラフィックイコライザーには、スピーカー特性補正と環境エフェクトの2つの機能があります。 スピーカー特性補正は、使っているスピーカーの周波数特性を補って 聞いたときにできるだけフラットな特性になるようにするものです。 環境エフェクトは、POPとかROCKとかLIVEとか 聞いている音楽によって聞きやすいように周波数特性を操作する機能です。 ホール効果とかもこれに入りますが、使うマイコンのパワーとメモリ不足のため 実現不可能でした。 グラフィックイコライザーのバンド数は15にしました。 ソフトでやっているので多くすることは簡単なのですが、バンド数が多すぎると 使っているときにパラメータを調整する時に大変なのです。(爆)

特殊効果としては ステレオエンハンスを入れてみました。 ただし、使い物になるかどうかは疑問です。(爆)

ユーザインターフェイスには、128x64のLCDディスプレイ SG12864AS が余っていたので使うことにしました。 メニュー選択と、グラフィックイコライザーの15バンド分のレベル表示に使用します。

ロータリーエンコーダーと押しボタンでメニューの選択、イコライザー設定の変更等、細かい調整ができるようにしました。 赤外線リモコンは、ボリュームとグラフィックイコライザーのプリセットの選択等 よく使う機能を割り振るようにしました。 リモコンのキーがあれば基本何でも割り振れるのですが、使えそうな便利なリモコンが売っていないのですよね。




ハードウエアデザイン - ユーザーインターフェイス部

ユーザーインターフェイス部は、LCD表示部とシステムコントローラー部から構成されています。 メインプロセッサにはそれぞれ、PIC16F873 と dsPIC33FJ64GP802 を使用しています。

LCD表示部の回路は右図のようになっています。 PIC16F873 を使用した理由は、見て分かるように、I/Oピン数が多いからです。(笑) LCDのコントロールには多くのピン数が必要で、PIC16F873でギリギリでした。

図上部にある6ピンのコネクタは PICのプログラム・デバッグ用です。 LCDモジュールのコントロール用とピンが重複使用になっているので、実際にプログラムしたりデバッグしたりするときは LCDモジュールを外す必要があります。

図下部にある4ピンのコネクタは LCD表示モジュールへの電源供給とシステムコントローラー部からのコマンド受信のための非同期シリアルインターフェイスです。

LCD表示部は5Vでも3.3Vでも動作しますが、3.3Vではバックライトが使用できません。 必要なら、バックライトに別電源で5Vを供給するように変更してください。

システムコントローラー部の回路は右図のようになっています。

ユーザインターフェイスの入出力と、オーディオ入力レベルのモニタリングを行います。 ユーザ入力には、押しボタンスイッチx2、ロータリーエンコーダ、赤外線受光センサをつけました。 押しボタンスイッチはLCD表示と設定入力モードの変更に使います。 ロータリーエンコーダーは、メニュー選択と設定値の変更に使います。 赤外線受光センサの入力は割り込みライン INT0 に接続し、ソフト側で割り込みを使用してコード解析を行います。

出力は、前述のLCDディスプレイのみです。 設定項目とグラフィックイコライザの表示等を行います。 LCD表示部のコントローラ PIC16F873 とは非同期シリアルインターフェイスを介して通信を行います。

Input Gain (MCP42xxx) へのコネクタは、後述のオーディオプロセッサ部の入力ゲインコントロール用のデジタルポテンショメータ MCP42050 の抵抗値を設定するためのものです。

図上部にある6ピンのコネクタは PICのプログラム・デバッグ用です。 デジタルポテンショメータ MCP42050の制御用及びモニタリング・デバッグ用ピンと重複使用になっているので、実際にプログラムしたりデバッグしたりするときは それぞれのコネクタを外したほうが安全です。




ハードウエアデザイン - オーディオプロセッサ部

オーディオプロセッサ部の回路は右図のようになっています。

メインの信号処理には dsPIC33FJ64GP802 使用しています。 理由は、DIPタイプでピン数も多く扱いやすいからです。

dsPIC33FJ64GP802 をデュアルに2個使用している理由は、1個では処理速度が間に合わないからです。 dsPIC33FJ64GP802 の処理能力は 40MIPS が最大で、FIRの畳み込みは MAC 命令で行いますが、REPEAT 命令も含むと1サンプルの乗算処理に2マシンサイクルを必要とします。 サンプリング周波数48000Hzを処理しようとすると、1サンプルあたりのインターバルが T=1/48000=20.8[μsec] となり、1サンプルの処理に費やせるマシンサイクル数は 40MIPSの dsPIC33FJ64GP802 では800って事になります。 FIRでの1サンプルあたりの畳み込みに2マシンサイクルかかりますから、最大でも400タップしか処理できません。 他の処理も行うこととFFT処理することを考えると、採用できるタップ数は256ということですね。 音響的には、サンプリング周波数はコントロールできる最大周波数、FIR のタップ数は最低周波数に影響します。 256タップで処理できる最低の周波数は Flow=48000/256=187[Hz] で、低音を鳴らしたければこれ以上タップ数を減らせないって事になります。

dsPIC33FJ64GP802 を2個使用して処理するのですが、それぞれの dsPIC33FJ64GP802 にLRチャネルの両方とも供給しているのは LRを混ぜた処理を行いたいと思ったからです。 上でCPU処理能力が足りないようなことを書いたばかりなのに 欲張りですね。(爆) まぁ、処理能力が余ったら なにか簡単なエフェクトをねじ込んでみようと思ったのです。

dsPIC33FJ64GP802 のADC 直前には OPAMP が設けてあります。 これは2つの dsPIC33FJ64GP802 でLRチャネルの信号を取り合うことになるので、1段バッファを入れる必要があったためです。

その前段の OPAMP がオーディオ入力のフィルタリングと増幅を行っています。 ゲインコントロールは、デジタルポテンショメータ MCP42050 を使用しています。 前述のシステムコントローラー部の dsPIC33FJ64GP802 が入力信号をモニタリングしていて、このデジタルポテンショメータの抵抗値をダイナミックに変えて入力ゲインの制御を行えるようになっています。

出力は1つの OPAM を通して行われます。 赤で囲んだ部分は ポップ音を抑えるためのミュート回路ですが、アイデアだけで 実装はしていません。(爆)




ソフトウエアデザイン - ユーザーインターフェイス部

ソースコードを解析してください。m(__)m




ソフトウエアデザイン - オーディオプロセッサ部

ソースコードを解析してください。m(__)m




不満な点色々

まず何よりサンプリングのビット数が足りないですね。 ADCは10ビットで使用していますが、やはりサンプリングノイズがスピーカーから聞こえます。 12bitサンプリングでプログラミングできれば良かったのですが、12bitで2チャネルサンプリングを色々と試したのですが 実現できませんでした。

dsPIC33FJ64GP802 をLRチャネル独立で使用しているせいだと思うのですが、LRチャネルの音の出力がほんの僅かずれるときがあるようです。 また、音場が少し広がり気味に聞こえます。 これもLRチャネルの位相が僅かにずれているからだと推測します。

既知のバグとしては、赤外線コードの解析に問題があるようです。 SONYタイプ、NECタイプ両方に対応できるようにしてあるのですが、NECタイプの受信に失敗するときがあるようです。

特殊効果の部分をアセンブラで書いているのですが、うまく動作していません。 チャレンジャーな人は解析してデバッグしてください。m(__)m




最後に

3ヶ月を費やして完成したオーディオプロセッサ・・・可愛い奴です。(爆) HW、特にOPAMP関連が色々と勉強になりました。

下の写真が完成品です。


私の日記を読んでくださっている人は知っていると思いますが、もう既に Audio Processor V2 プロジェクトが進行しています。 そのうち、時間が出来たらまたレポートします。




リファレンス

ボリュームコントロール関連:

Mirror of the ALTOR.SYTES.NET

PICマイコンで作るリモコン電子ボリューム

オーディオクラフト工房


PIC 関連:

PICで遊ぶ電子工作

オーディオクラフト工房

Welcome to Einstein's electronic lab!

TekuRobo工作室

電子工作の実験室


開発環境関連:

MPLAB Integrated Development Environment

SDCC - Small Device C Compiler

gputils - GNU PIC Utilities

フリーのCコンパイラ(SDCC)でPICを使おう

SDCCの使い方


赤外線コード関連:

赤外線リモコンの解析

赤外線リモコンについて


PIC のアセンブリ言語を知りたければ:

PICのアセンブラ命令の解説




ダウンロード

スースコードは、ユーザーインターフェイス部とオーディオプロセッサ部に分けてあります。 私の開発環境をそのまま圧縮しました。 Microchip の開発環境 MPLAB IDE v8.x を使えば そのまま開いてコンパイルできます。

ユーザーインターフェイス部: ここをクリック

オーディオプロセッサ部: ここをクリック