dsPIC

dsPIC33FJ64GP802 (28) --- 周波数シフター (12)

現状の周波数シフター・プログラム (2019 年 2 月 7 日付けの記事に hex ファイルを掲載) では、処理に余裕があったので、 2019 年 1 月 16 日付けの記事の実質 507 タップのヒルベルト変換器ではなく、タップ数を増やして実質 763 タップとしたものを使って…

dsPIC33FJ64GP802 (27) --- 周波数シフター (11)

2019 年 3 月 24 日付けの記事では、方形波を表すフーリエ級数表現の式を積分して、三角波のフーリエ級数表現が得られることを示しましたが、サイン/コサイン入れ替え版の式は求めていませんでした。 1.442-3. 式の左辺の積分を計算すると次のようになります…

dsPIC33FJ64GP802 (26) --- 周波数シフター (10)

解析的には積分が難しい関数でも、べき級数としての表現が得られれば、その式を項別に積分して結果の式を求めることができます。 得られた級数を必要な精度を満たす項まで計算すれば、数値としての値が求まります。 Maxima にはテイラー級数 (Taylor series)…

dsPIC33FJ64GP802 (25) --- 周波数シフター (9)

前回の三角波のサイン → コサイン置き換え版を、数式処理システムの「Maxima」でフーリエ級数以外の表現で求めてみたところ、やはり、初等関数では表せない形になるようです。 まず、「方形波」を積分すれば「三角波」になるので、方形波のフーリエ展開の式…

dsPIC33FJ64GP802 (24) --- 周波数シフター (8)

偶対称の位置に配置した方形波のフーリエ展開である 1.442-4. 式のサイン → コサイン置き換え版である 1.442-3. 式 と、前回示した逆グーデルマン関数の定義 の右辺を比較すると、 係数 の有無 変数 と変数 の違い を除いては同じ形になっていることが分かり…

dsPIC33FJ64GP802 (23) --- 周波数シフター (7)

"Table of Integrals, Series, and Products" でのグーデルマン関数 (Gudermannian function, 関数名は「」と表記) の定義を引用します。

dsPIC33FJ64GP802 (22) --- 周波数シフター (6)

前回と同様に、"Table of Integrals, Series, and Products" から引用した式を示します。 まず、方形波の場合です。

dsPIC33FJ64GP802 (21) --- 周波数シフター (5)

以下、(1.441-1.) のような式番号が付けられている式は、 I.S. Gradshteyn, I.M. Ryzhik 著 Alan Jeffrey, Daniel Zwillinger 編 "Table of Integrals, Series, and Products", Seventh Edition, Academic Press からの引用です。 まずは、のこぎり波のフー…

dsPIC33FJ64GP802 (20) --- 周波数シフター (4)

ヒルベルト変換器を通すと、すべての周波数成分の位相が 90° 遅れるので、単一周波数の正弦波以外の一般の信号では、入力信号とは違った波形になります。 のこぎり波 / 方形波 / 三角波に対する出力波形を観測し、「理論値」と比較してみました。 まずは単一…

dsPIC33FJ64GP802 (19) --- 周波数シフター (3)

前回示したオブジェクト・プログラムでサポートしている 外付け 12.288 MHz 水晶振動子を使用した回路 外付け 16 ビット ADC を使用した回路 を示します。 ただし、簡単のため、電源の配線など前回の基本回路図で表されている部分は省略し、追加すべき部分に…

dsPIC33FJ64GP802 (18) --- 周波数シフター (2)

dsPIC33FJ64GP802 を使った「Bode frequency shifter」のプログラムの基本的な部分がほぼ機能するようになりました。 「スケルチ」などは、まだ実装していません。 クロックに関しては 内蔵 FRC オシレータ (7.37 MHz) 使用 外付け 12.288 MHz 水晶振動子使…

dsPIC33FJ64GP802 (17) --- 周波数シフター (1)

2018 年 11 月に開催された「アナログシンセ・ビルダーズ・サミット 2018」で、「公生32+」さんと「yama」さんが、「Bode Frequency Shifter」(以下「周波数シフター」と略記) の構成に基づいた (アナログ) シンセ・モジュールを出品されていました。 この周…

dsPIC33FJ64GP802 (16) --- 1/12 オクターブバンド・フィルタを使った「グライコ」風表示 (1)

1/12 オクターブバンド・フィルタを多数並べて、オーディオ用グラフィック・イコライザの「バー」風の表示をさせてみました。 表示は、下の記事の Adafruit 1.8 インチ TFT LCD シールド互換のシールドを装着した Arduino で行い、1/12 オクターブバンド・フ…

dsPIC33FJ64GP802 (15) --- 無償で使えるフィルタ設計アプリケーション (2)

前回示した ディジタル・フィルタ設計プログラム (IIR_Design、FIR_Remez、FIR_Kaiser) — (三上直樹著・CQ 出版「はじめて学ぶディジタル・フィルタと高速フーリエ変換」のサポート・プログラム) http://www.cqpub.co.jp/hanbai/books/30/30881.htm は、上記…

dsPIC33FJ64GP802 (14) --- 無償で使えるフィルタ設計アプリケーション (1)

libdsp の IIR フィルタ関数では、フィルタ係数の生成には「dsPIC FD」(dsPIC Filter Designer) を使用することが前提になっています。 dsPIC FD にはフル機能版と機能限定の廉価版 (dsPIC FD Lite) がありますが、両者ともに「有償」で「無償版」はありませ…

dsPIC33FJ64GP802 (13) --- IIR フィルタ関数と Yデータ・メモリ・アクセス (2)

IIR フィルタ関数が範囲外の Y データ・メモリをアクセスすることで発生するドレス・エラーを防ぐ方法には、大きく分けて次の 2 種類があります。 「範囲外」アクセスの対象が RAM 非実装領域とならないように、RAM 中にダミーの変数を定義して「範囲外」ア…

dsPIC33FJ64GP802 (12) --- IIR フィルタ関数と Yデータ・メモリ・アクセス (1)

dsPIC の libdsp に含まれている IIR フィルタ関数 (IIRCanonic()、IIRTransposed()) では、割り当てられた Y データ・メモリの範囲外へ (不要な) アクセスを行っているため、場合によってはプログラムの停止、リセットの繰り返しなどを生じるおそれがあるこ…

dsPIC33FJ64GP802 (11) --- DSP 命令と DSP ライブラリ (9)

IIRCanonic() 関数と IIRTransposed() 関数を使ったプログラムの断片を下に示します。 フィルタ係数の配列の詳細は 2018 年 10 月 10 日付けの記事 (→こちら) に記載しています。 WaveSpectra による特性測定のために使ったプログラムでは、ふたつの 1/12 オ…

dsPIC33FJ64GP802 (10) --- DSP 命令と DSP ライブラリ (8)

「楽音」の「音名」でいうと「A」(880 Hz)と、「A#」(932.33 Hz) を中心周波数とする 1/12 オクターブ・バンド・フィルタふたつを IIRTransposed() 関数で実現し、内部で発生させたリニア周波数スイープのサイン波をフィルタリングした結果を下に示します。 …

dsPIC33FJ64GP802 (9) --- DSP 命令と DSP ライブラリ (7)

IIRTransposed() での処理の様子と伝達関数の表現との対応を、2 次セクション 1 段の場合について下に示します。 「標準型」の構成を「転置」、つまり信号の向きを反対に (出力を入力に、入力を出力に)、「分岐」を「加算」に、「加算」を「分岐」に置き換え…

dsPIC33FJ64GP802 (8) --- DSP 命令と DSP ライブラリ (6)

IIRCanonicStruct 構造体 (IIRTransposedStruct 構造体も同様) の「numSectionsLess1」 フィールドには、2 次セクションの段数を「S」としたとき、(S - 1) の値を設定します。 前回の 2 次セクション 1 段の場合には、(S - 1) = (1 - 1) = 0 を設定します。 …

dsPIC33FJ64GP802 (7) --- DSP 命令と DSP ライブラリ (5)

DSP ライブラリのドキュメントでは、IIR (Infinite Impulse Response) フィルタ係数は「dsPIC Filter Design」(略称: dsPICFD) プログラム (有償) によって生成されたもの (あるいはそれに等価なもの) を使うように指示されていて、係数値の取るべき詳細な条…

dsPIC33FJ64GP802 (6) --- DSP 命令と DSP ライブラリ (4)

DSP ライブラリ中の (補間/間引き/格子型/適応型などを除く「普通」の) FIR 関係の関数には次の 3 つがあります。 void FIRStructInit ( FIRStruct* filter, int numCoeffs, fractional* coeffsBase, int coeffsPage, fractional* delayBase ); void FIRDela…

dsPIC33FJ64GP802 (5) --- DSP 命令と DSP ライブラリ (3)

DSP ライブラリの FIR() 関数を使う前に、下のようなデータを用意しておく必要があります。 入力データが格納された配列 (要素数 N) 出力データを受け取るための配列 (要素数 N) タップ係数の配列 (要素数 M,、X-データ・メモリあるいはプログラム・メモリ、…

dsPIC33FJ64GP802 (4) --- DSP 命令と DSP ライブラリ (2)

DSP ライブラリに含まれる関数をカテゴリ別に分類すると下のようになります。 ベクトル演算 窓関数の初期化 行列演算 フィルタ FFT/DCT PID 制御 浮動小数点と固定小数点との相互変換 スタック・ガードの設定 (dsPIC33E のみ) これらのカテゴリ分けは、ライ…

dsPIC33FJ64GP802 (3) --- DSP 命令と DSP ライブラリ (1)

FIR (Finite Impulse Response) フィルタの計算では、FIR フィルタの「タップ」ひとつあたり 1 回の積和演算が必要です。 積和の乗算ではオペランドを 2 つ必要とするので、メモリ・アクセスが 2 回必要となります。 したがって、タップひとつ分の計算を 1 …

dsPIC33FJ64GP802 (2) --- DAC の周波数特性 (2)

dsPIC マイコン本体のプログラムで固定周波数の正弦波、あるいはリニア周波数スイープの正弦波を発生させ、DAC に出力し、アナログ信号をホスト PC のオーディオ入力に接続して「WaveSpecta」で周波数特性を観測した結果を示します。 他に注記のない限り、Wa…

dsPIC33FJ64GP802 (1) --- DAC の周波数特性 (1)

Microchip 社の dsPIC33F ファミリは、DSP 命令を持つ 3.3 V 電源の 16 ビット・マイコン・ファミリで、秋月電子では次の 2 品種の取り扱いがあります。 dsPIC33FJ32GP202-I/SP (単価 380 円) dsPIC33FJ64GP802-I/SP (単価 480 円) 型番中の「GP」は「汎用」…