ようこそ!JQ2RVNのブログです。
PICを使っていろいろな物を作ろうと画策中です。
× [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で、フィルタ作りに格闘中です。 |
カレンダー
プロフィール
コールサイン:
JQ2RVN
性別:
男性
自己紹介:
PICの開発を勉強中です。
目標はPICTNCの高性能版を作ること。 まずは、本家を解析しています。
カテゴリー
最新記事
最新コメント
[04/23 Eolande]
[04/16 太田和巳(JF2UJG)]
[09/10 je7ifp]
[08/06 JQ2RVN]
[08/03 OVC]
最新トラックバック
ブログ内検索
最古記事
(05/18)
(05/19)
(05/19)
(05/20)
(05/21)
アクセス解析
|