dポイントプレゼントキャンペーン実施中!

手元にC++で設計されたFIRフィルタの記述があります。これを理解したいのですが、FIRフィルタの構造が分からないため、理解できずにいます。
FIRフィルタについて分かりやすく解説したサイトはないでしょうか?自分でも探してみたのですがピンと来るものがみつけられませんでした。
厳密に解説してあるものというより、C++での設計のためのアルゴリズムにつなげられるような解説だと助かります。

ちなみに私はC++は専門ですが回路は初心者です。

よろしくお願いします。

A 回答 (4件)

まず、基本は平均です。


デコボコな信号波形でも、平均にするとなだらかになります。
ですから、平均を取った場合、ローパスフィルタになります。
平均を式で表すと Σx(i) / N になります。

しかし、平均を取っただけでは滑らかにしきれませんし、
逆にハイパスやバンドパスができません。
そこで、加重平均を取ることにします。
式で表すと Σ(a(i)*x(i)) / Σ a(i) になります。
ここで、Σa(i)は一定ですから、分子のシグマの中に入れてやります。
Σ(a'(i) * x(i) )となり、ちょうどFIRの式と一致します。

さて、このa(i)を求める方法ですが、
回答で書くにはスペースが足らないので、URLを紹介しておきます。
http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1 …
Googleなどでの検索では
「伝達関数」や「Z変換」などを加えるとよいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
”基本は平均”といわれると、なんだか急に親しみやすくなりました。(気のせいだとは思いますが・・・)
なかなかすぐには、演算式を理解できないですが、添付していただいた資料が基本からなので助かります。
また、検索のアドバイスありがとうございます。資料と合わせて調べながら理解したいと思います。

お礼日時:2009/06/18 19:19

#1 さんのコメントにあるように、FIR の伝達特性を最適化する「設計問題」でないとします。



このページの末尾にあるブロック図から「アルゴリズム」のイメージを把握できるでしょう。
  ↓
 http://yamatyuunet.bne.jp/audio/fir/index.htm
>FIR型フィルタの設計

・入力信号 x[n]は、一定の時間間隔T ごとに現れる。(n = 0, 1, 2, 3, ........)
・遅延素子は、入力を時間T ずつ遅らせて右方へ伝達。
・遅延素子の端子(タップ)から引き出した信号に、それぞれ所定の係数(タップ係数) h[i] を掛けて加算器へ送出。
・加算器にてタップ係数の乗算結果をすべて加算して、FIR の出力信号 y[n] を得る。

…というのが基本的な動作です。
 
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かにブロック図があるとだいぶ違いますね。実際に数値を代入してみながら理解してみたいと思います。

お礼日時:2009/06/18 19:25

このあたりの特集でも図書館などで読んでみるとか


http://www.cqpub.co.jp/interface/sample/200702/I …
他にもデジタルフィルタの本を開けば必ず書いてあると思います
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
デジタルフィルタの本、というのがあるんですね。デジタル回路の本ばかり見ていました。(そんなことも分からない初心者ですみません)
教えていただいた資料参考にさせていただきます。

お礼日時:2009/06/18 19:09

FIRの設計を行う(係数を求める)のは、少し難しいですが、


単にFIRフィルタをコードするというのならそれほど難しくありません。

FIR関数を作り、タップ数と入力・出力、遅延用・係数の配列を渡します。
プロトタイプは、
void FIR(int Ntap,int in, int* out, int* pDelay, int* pCoeff);

遅延配列を1つずらし、最後に入力された値を入れます。
for( i=0; i<Ntap-1 ; i++ )
pDelay[i] = pDelay[i+1];
pDelay[i]= in;

遅延配列と係数配列を掛け合わせて、それを足しあわせます。
sum = 0;
for( i=0;i<Ntap ; i++)
sum += pDelay[i] * pCoeff[i];

最後に、
*out = sum;
return;

以上で、FIR関数は完了です。
ここでは、整数型でやってますが、浮動小数にへんこうするなりしてください。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

プログラム自体の処理は手元にあるので、一応処理としてはわかるのですが、そもそもFIRフィルタとは何ぞや?から始まって、どういう仕組みのフィルタをこのアルゴリズムとプログラムにしたんだろう?という前段階のところで詰まっています。
C++で回路設計をするという本で勉強しているのですが、例題や問題に出てくる回路は理解しているのが前提なもので・・・。

お礼日時:2009/06/18 11:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!