忍者ブログ
ようこそ!JQ2RVNのブログです。 PICを使っていろいろな物を作ろうと画策中です。
[31] [30] [29] [28] [27] [26] [25] [24] [23] [22] [21]
×

[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

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
08 2017/09 10
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]
最新トラックバック
バーコード
ブログ内検索
アクセス解析