【先着1,000名様!】1,000円分をプレゼント!

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

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

よろしくお願いします。

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語の配列をC++のvectorに高速に変換したい

質問は表題のとおりです。
単純な方法では以下の通りになると思いますが、
(C言語文字列から string への変換のように)
一括変換の仕組みは vector にないのでしょうか?
static const int n=5;
int a[n]={0,1,2,3,4};
std::vector<int> v(n);
std::vector<int>::iterator vit=v.begin();
for(int i=0; i<n; i++){
*vit++ = a[i];
}

上記の例では n=5 ですが、nがとても大きな場合に適用したいと考えています。
ちなみに、gcc 3.4.3 を使っています。

Aベストアンサー

> C言語の配列に関して、STL のアルゴリズム(binary_searchなど)を
> 使いたいと考えているのですが、
それなら素直にこうすればよいのではないの?

--------------------
#include <algorithm>
#include <iostream>
int main(){
  using namespace std;
  static const int n=5;
  int a[n]={0,1,2,3,4};

  cout << binary_search(a, a+n, 3) << endl;
  cout << binary_search(a, a+n, 6) << endl;

  return 0;
}

QIIRフィルタとFIRフィルタ

無限インパルス応答(IIR)フィルタと有限インパルス応答(FIR)フィルタとはアナログでいう、バンドパスフィルタやローパスフィルタ、ハイパスフィルタのデジタル版みたいなものであることは分かるのですが、
無限、有限というのは何を表しているのでしょうか?
Wikipediaなどに解説はしてあるのですが、どうしても理解することが出来ません。
どなたか易しく説明して頂けないでしょうか?

Aベストアンサー

> つまり、例えば、1秒間だけのパルスに対してフィルタをかける場合、

元の信号の長さは関係ありません。
フィルタの次数が「1秒分」だったら、
入力信号が1秒だろうと10秒だろうと0.1秒だろうと、

> FIRであればパルスが終わった1秒後には信号は完全になくなる
ということになります。ただし、次数が1秒のフィルタなら「1秒後以降は無くなっている」のは保証されますが、場合によっては1秒より短い時間で無くなる可能性もあります。それはフィルタのパラメータ次第。

> IIRでは、フィルタ自体がそのパルスの残像を出力し続け、永遠にそのパルスが出力される
そういう場合も「あり得る」のがIIRです。実際にそうなるかどうかはフィルタのパラメータ次第です。
(で、先ほどの回答にも書きましたが、IIRでも、実用上は、減衰してそのうち影響が無くなるようなパラメータを設定するのが普通です。)


人気Q&Aランキング