忍者ブログ
ようこそ!JQ2RVNのブログです。 PICを使っていろいろな物を作ろうと画策中です。
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

MPLAB C30 の DSPライブラリについて・・・
あまり掲載記事のないFIRDecimate()関数の解析。

まずはデータシートの要約。

FIRDecimate()関数は、
サンプルされた値をフィルタしたのちR:1の割合で間引く関数。
オーバーサンプリングしたのち、LPFを通して間引きする時に有用。

プロトタイプは、
extern fractional* FIRDecimate (
    int numSamps,
    fractional* dstSamps,
    fractional* srcSamps,
    FIRStruct* filter,
    int rate
);

numSampsはサンプル数だけれども、この場合は出力の個数
また、rateは間引き率。

(e.g.) 5つのサンプルを入力し、1つの出力をする場合。
numSamps=1, rate=5
と指定する。
さらにこの場合、srcSampsは5要素、dstSampsは1要素の配列とする。

(e.g.)10のサンプルを入力して、2つの出力をする場合。
numSamps=2, rate=5
secSampsは10要素、dstSampsは2要素の配列。

注意点:
フィルタのタップ数Mは、rateの整数倍でなければいけない。



次に、ソースの解析結果よりわかったこと。(firdecim.s)


遅延配列の値は移動させることによって最新値と書き換えている。
遅延配列をd[ ]とすると、MAC計算(畳み込み)前に、
d[ R+1 ] <- d[ 0 ]
d[ R+2 ] <- d[ 1 ]
.....
d[ M ] <- d[ M-R-1 ]
という風に、R+1個分大きな処に値をコピーする。
その上で、d[ 0 ] <- x[ 0 ] .... d[ R] <- x[R]と、コピーをする。

つまり通常のFIR()関数のように、FIRStruct構造体のdelayメンバを使った
モジュロアドレッシングによる計算をしていない


したがって注意すべきことは、
FIR()関数とFIRDecimate()関数を切り替えて使えない
ということ。

FIR()で計算したときはd[ firStruct.delay ]からサンプルを入れるけどをするけれど、
FIRDecimate()のときはd[ 0 ]からサンプルを入れる。
また、畳み込みの計算開始位置も違う。
結果、計算がおかしくなってしまう。

この「切り替える」というのは1つのFIRStruct構造体に対してであって、
2つの構造体を、一方はFIR()で、一方はFIRDecimate()で、
という使い方をしても、問題はない。

普通は1つを切り替えるということはしないだろうから、
気にする必要はないと思われる。
PR

ただいま、MPLAB C30で、フィルタ作りに格闘中です。

大まかな流れは以下のとおり

FIR用構造体を作成

FIR構造体の初期化

FIRの実行


上2つは、書籍やホームページを参照しておけばOKだと思う。

最後のFIRの実行は、そのまんまの名前のFIR()関数を使用する。
FIR( numSamp , &outSamp , &inSamp , &Filter )
という形式。

ここで、numSampはサンプリングされた値の個数。
多くの場合は1でよいと思う。


inSampがサンプリングされた値。
FIR()関数が呼び出されると、遅延配列の最古の値がinSampで書き換えられる。

もしタップ数が5つだったとしたら
5 4 3 2 1

4 3 2 1 inSamp
というように書き換えられる。

その上で、畳み込み計算がおこなわれて、結果がoutSampに出てくる。


遅延配列の書き換えは、dsPICの場合便利にできていて、
たとえば0から4の5つの番地に書き込もうとするとき、
dsPICに0と4を登録しておく。
そうすると、ポインタをインクリメントしていくと
通常だと、0 1 2 3 4 5 ・・・となるが、
dsPICだと、0 1 2 3 4 0 1 2・・・と自動的にポインタが戻ってくれる。

これを登録するのは、FIRStruct構造体に仕込まれていて
coeffsBase , coeffsEnd , delayBase , delayEnd
の4つの値になる。
(係数配列の先頭と終端、遅延配列の先頭と終端)

この機能があるおかげで、dsPICでの畳み込みは
REPEAT + MAC命令で、単純&高速にできる。
(レジスタはXMODSTAT , XMODEND , Y~~)

逆にいえば、これがなかったらPIC24と同じだなw
(ホントは40bitアキュムレータとか、ビット順序逆転とかもあるけど・・・)



忍者ブログ [PR]
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
プロフィール
コールサイン:
JQ2RVN
性別:
男性
自己紹介:
PICの開発を勉強中です。
目標はPICTNCの高性能版を作ること。
まずは、本家を解析しています。
最新コメント
[04/23 Eolande]
[04/16 太田和巳(JF2UJG)]
[09/10 je7ifp]
[08/06 JQ2RVN]
[08/03 OVC]
最新トラックバック
バーコード
ブログ内検索
アクセス解析