dsPIC33FJ64GP802 (18) --- 周波数シフター (2)
dsPIC33FJ64GP802 を使った「Bode frequency shifter」のプログラムの基本的な部分がほぼ機能するようになりました。 「スケルチ」などは、まだ実装していません。
クロックに関しては
- 内蔵 FRC オシレータ (7.37 MHz) 使用
- 外付け 12.288 MHz 水晶振動子使用
の 2 通りと、入力アナログ信号を変換する AD コンバータに関しては
- 内蔵 12 ビット ADC 使用
- 外付け 16 ビット ADC 使用
の 2 通りを組み合わせた、合計 4 種類の構成に対して、1 種類のオブジェクトで対応します。
現在のバージョンでのプログラム・サイズは 1744 ワード (24 ビット・ワード)、データ・サイズは 2554 バイトです。 (2019 年 2 月 16 日追記: ヒルベルト変換器のタップ数を増やしたプログラムに差し替えて、プログラム・サイズは 1770 ワード、データ・サイズは 3194 バイトとなりました。)
この記事の後半に hex フォーマットのオブジェクトを掲載します。
「コピー・アンド・ペースト」して hex ファイルを作り、
PICkit 3 などで dsPIC33FJ64GP802 に書き込めば動作させてみることができます。
ソース・リストについては近日中に公開する予定です。
dsPIC33FJ64GP802 (17) --- 周波数シフター (1)
2018 年 11 月に開催された「アナログシンセ・ビルダーズ・サミット 2018」で、「公生32+」さんと「yama」さんが、「Bode Frequency Shifter」(以下「周波数シフター」と略記) の構成に基づいた (アナログ) シンセ・モジュールを出品されていました。
この周波数シフターを dsPIC33FJ64GP802 を使って「ディジタル的」に実現しようと試みていましたが、「性能」や「実用性」はともかく、「周波数シフト」という基本機能については動作することが確認できました。
内蔵 12 ビット ADC / 内蔵 16 ビット DAC を使用し、入出力の「シグナル・コンディショニング」用の OP アンプを除けば、主要なチップとしては dsPIC33FJ64GP802 ワンチップだけで実現できています。
外部 16 ビット ADC を接続すれば性能の向上が期待できます。
外部 ADC 対応、使用メモリ量の低減など、プログラムの整理がついたら公開したいと思っています。
周波数シフターの構成について、簡略化したブロック・ダイアグラムをディジタル実現の場合について下に示します。
PSoC1 (6) --- スイッチトキャパシタ・フィルタ (6)
フィルタのユーザモジュールのウィザードでは、フィルタ仕様を入力して設計するほかに、外部のプログラムでコーナー角周波数を 1 [rad/s] として設計したフィルタの s-平面上の「極」の配置を入力して使うこともできます。
ELPF ユーザモジュールでは、「ノッチ」となる「零点」の入力も必要ですが、こちらは s-平面上の位置ではなく、ノッチ周波数を入力します。
MATLAB および GNU Octave には、ディジタル / アナログ両方に対応した楕円フィルタ設計関数「ellip( )」があるので、これを試してみました。
GNU Octave で記述したプログラム (ELPF4.m) を下に示します。
PSoC1 (5) --- スイッチトキャパシタ・フィルタ (5)
SC ブロックを「フィルタ」として使うために特化した「ユーザモジュール」として、下の 6 種が用意されています。
- BPF2 (2 次バンドパス・フィルタ)
- BPF4 (4 次バンドパス・フィルタ)
- LPF2 (2 次ローパス・フィルタ)
- LPF4 (4 次ローパス・フィルタ)
- ELPF2 (2 次楕円ローパス・フィルタ)
- ELPF4 (4 次楕円ローパス・フィルタ)
2 次のフィルタは ASC + ASD のペアを 1 組使い、4 次のフィルタは ASC + ASD のペアを 2 組使います。
SC ブロック間の接続は自動的に行われ、ユーザは入力の接続および出力の接続だけを指定すればすみます。
キャパシタの値の設定も、「ウィザード」を利用すれば、周波数応答のグラフを見ながら調節することができます。