• ベストアンサー

デジタルフィルタの計算式について

すいませんがIIRのデジタルフィルタの計算式についてわかる人がいましたら教えてください。スポーツ関係をしていて、データ処理をエクセルで計算式を今作っているのですがどうもわかりません。  2次のバターワースフィルタの計算式Y(n)=AX(n)+AX(n-1)+AX(n-2)+BY(n-1)+BY(n-2)と専門書に書かれていますがこの式でデータの反対からもフィルタを掛けていることになるのでしょうか?時間的なずれはなくなることですよね  それと実際計算をするときには、初めのY(n-1)、Y(n-2)は、どのような値を入れたらいいのですか?  よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.3

時間を逆に、、 なるほど 最初に Yn=A Xn + AX(n-1) A X(n-2)+ B Y(n-1) + B Y(n-2) という処理をnを増やす向きでしたあと Zn= A Y(n) + A Y(n+1) + A Y(n+2) + B Z(n+1) B+ B Z(n+2) という処理nを減らす向きでして、Znを最終的な出力として使うということかと。 これでしたら、haba999さんがご質問出かかれていたように、一回目の処理と2回目の処理で時間遅れをキャンセルさせて、最終的な信号ZとXの間の時間差を無くす処理でしょう。 フィルタの次数と、往復で何回かけるというというのは別の話になるかと思います。 (Yn=A Xn + AX(n-1) A X(n-2)+ B Y(n-1) + B Y(n-2) 自体は二次のフィルタですが、先に書いたように、出力信号と入力信号の間には時間差があります) この処理が通常のデジタルフィルタで使われないのは、現在の出力を計算するために未来の入力を使う(因果律が成立しない、実時間で処理できない)ことと、同じフィルタを往復で使うので最終的に得られるフィルタの特性に若干の制約がある ことが理由かと思います。 以下余談 IIRでなくて、FIR形式のフィルタなら、往復の操作を Zn= C(-k) x(n+k)+ +C(1) x(n+1)+C(0) x(n) + +C(1) x(n-1) + ... + C(k) x(n-k) という具合にひとつにまとめれます。 で、このままだと、因果律を満たさないので、ちょいと変形して z(m)=C(-k)x(m)+..+C(-1)x(m-k+1)+C(0)x(m-k)+..+C(k)x(m-2k) と言う具合にすれば因果律を満たす(でも、出力は入力よりkだけ送れるけど)ようになります。 が、IIRだとこういうわけにいかない(無限の過去から出力信号が出てる)ので,,

haba999
質問者

お礼

何回も回答頂いて、ありがとうございました。

その他の回答 (2)

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

フィルタの時間遅れ ・単純な移動平均とはフィルタの特性が違うので単純に比較はできません。 ・Yn=A0Xn+A1X(n-1)+A2X(n-2)+B1Y(n-1)+B2Y(n-2) の形式のフィルタは  Yn=c0X(n)+c1X(n-1)+c2X(n-2)+...+ckX(n-k)+.. の形式ので置き換えることができます。(重み付移動平均で書きかえれます。)つまり、出力からの帰還があるIIRフィルタも、同じ(同程度の)特性をもった重み付移動平均と同じだけの時間遅れがあります。 (c1,c2,,,ck,,は、元のフィルタの係数(A,B)から計算することもできますし、元のフィルタにインパルス応答(X(0)=1,それ以外のXは0として、フィルタの出力Ynを求める)から決めることもできます。) 時間の進む向きと逆に、フィルタをかける どういう文脈ででた記述かわからないので、、いくつか考えられることを。 a.フィルタが何かの入力や内部信号の推定に使われている。 観測したデータから、何か内部の状態や入力の状態を逆に求めるような使い方をするときには、時間をさかのぼるような使い方をすることもあるかと。 b.フィルタの動作の記述 フィルタの今の出力Ynを出すのに、現在の入力Xn以外に、過去の入力や出力を2点分さかのぼって X(n-1),X(n-2),Y(n-1),Y(n-2)使っています。この動作を表しているのかもしれません。

haba999
質問者

お礼

ありがとうございました。私の文章べたで分かりにくかったかもしれません。丁寧な解答ありがとうございました。  「時間の進む向きと逆に、フィルタをかける。」このことについてもう一度書きます。一度、フィルタを掛けた値を時間経過を逆にしてもう一度フィルタを掛ける作業です.そして出てきた数値が二次のフィルタを掛けたことになる値と本にかかれていました。  私の頭の中では1次、3次5次…は、フィルタを(正の時間軸、負の時間軸の順に)奇数回掛けること、2次、4次,6次…は、フィルタを(正の時間軸、負の時間軸の順に)偶数回掛けることと今まで思っていましたが違うのですね。

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

・Y(n-1)などの初期値 通常は入力信号が入る前の出力は0でしょうから0を入れることが多いかと思います。(場合によっては、0以外の一定値を入れることもあるでしょうが) ・データの反対からもフィルタを、、 反対側からというか、出力側信号をフィルタの入力に戻す帰還が入っています。時間的な遅れはどうしても出るかと。

haba999
質問者

補足

回答ありがとうございます。 ・Y(n-1)などの初期値:  わかりました。やってみます ・データの反対からもフィルタ:  私も出力側信号が入っているので時間的な遅れは、単純移動平均法よりは少ないと考えています。よくわからないのがバイオメカニクス系のフィルターを説明している本とかを見てみると、Y(n)=AX(n)+AX(n-1)+AX(n-2)+BY(n-1)+BY(n-2)を時間軸の進む方と終了から開始方向の反対にするように書かれています。デジタルフィルタの本では時間軸の進む方にしか計算式をするように書かれていません。素人の私は、混乱しています???  参考にしている本は、「見てわかるディジタル信号処理」「ビギナーズデジタルフィルタ」、「スポーツバイオメカニクス20講」です。

関連するQ&A

  • FPGAによるデジタルフィルタ計算方法

    AD変換でアナログ値をデジタルに変換して、演算をして、DAでアナログ値に変換して、出力したいと考えています。 そこで、デジタル演算をFPGAで行いたいと考えていますが、以下の計算を行う場合、何か良い方法ありませんでしょうか。 係数に小数点があり、どのように演算すればいいのか、良く分かりません。 計算式は、Y=Y[n-1]+(1-a)*n   (RCフィルタ演算)とありました。 Yは、出力値、nはサンプリングデータの場所、 Y[n-1]は、一個前の演算結果の出力データ、 aが係数で、小数点0.9878等の値が入ります。 この小数点を含む計算をFPGAで実現する方法を教えてください。 あと、FPGAにこだわらず、 他に実現する良い方法ご存じでしたら、教えてください。 宜しくお願い致します。

  • デジタルフィルターの遅延について

    高周波のノイズを除去して、低周波の信号を通過させるローパスフィルターとしてバターワースフィルターを使っていますが、信号の遅延に困っています。取得したデータを後からフィルター処理するのではなく、リアルタイムに処理して、なおかつ遅延が少なく、波形の歪みも少ないフィルター処理をするにはどのような方法があるか教えてください。

  • デジタルフィルタの設計

    はじめてデジタルフィルタの設計をすることになりました。 決まっている事項は以下のようになります。 ・25msごと(40Hz)にA/D変換されたデータが出力されます。 ・出力データを使って波形を描きます。 ・描く波形はおよそ周波数は0~10Hzのものです。 ・係数を算出して、C言語のプログラムに組み込みます。 今のところ決まっているのはこのくらいです。 自分でも勉強していますが、 FIRは計算が比較的簡単で、安定しているが、次数が多くなる。 IIRは複雑で、不安定になることもあるが、次数が少なくてよい。 FIRでは、窓関数やREMEZ法などリプルを小さくする方法がある。 IIRでは、バタワース、チェビシェフ、ベッセルなどの方法がある。 程度のことしかわかっていません。 どのように設計していけばいいかわかりません。 経験のある方、良いアドバイスをお願いします。 また何かフリーツールで設計できるものがあれば教えてください。

  • インパルス応答の推定を適応デジタルフィルタでやるには…。

    線形・時不変・因果的なディジタルシステムが在って、それにあるディジタル信号x(n)を加えたら出力y(n)が得られました。 x(n)とy(n)から、このディジタルシステムのインパルス応答を適応デジタルフィルタを利用して推定したいのですが、どうすればよいのでしょうか?

  • FIRフィルタの遅延量補正とIIRフィルタの安定性について教えて頂きた

    FIRフィルタの遅延量補正とIIRフィルタの安定性について教えて頂きたいのですが。  双一次z変換を用いていくつかのIIRフィルタを作る事が出来ました。Scilbが持つIIR関数と比較して同じ結果になっています。IIRフィルタがフィルタ係数によっては不安定=発信したりする、というのはScilab等の結果と同じになる→フィルタ係数も同じ→不安定にならない。と思ってよいのでしょうか?。例えばですが、あるサンプリング周波数の波形データをフィルタする為に、同じサンプリング周波数で作ったImplus波形をIIRフィルタに放り込んで周波数応答を確認したら、実際にフィルタする波形データの最初から最後までその周波数応答でフィルタされると私は理解しているのですが。  私のフィルタを使う用途の場合は、フィルタの計算速度は特に制限は無く、速いに越した事はありませんが得られた結果が正確な事が大切なので、安定性や係数誤差の事を考えるとIIRフィルタではなくFIRフィルタでも構わないのですが、FIRフィルタの場合だとタップ数が多くなるので波形の遅延量が無視出来ません。フィルタを通した波形は次定数fastのレベル波形にして100Hz位で出すとは言え、IIRよりは数秒かコンマ数秒遅延した結果になると思います。そのような場合、遅延量を補正するとしたらどうしたら良いのでしょうか?。個人的にはタップ数が(IIRの場合は次数が)遅延量と思っているのですが。  宜しくお願い致します。

  • 2次のバターワースフィルタについて

    2次のバターワースフィルタを利用して,ある実測データのノイズを除去することを考える場合に疑問点があります。 2次フィルタの場合、二つステップ(観測ステップ/時間)過去までのフィルタ処理を行っていないデータおよびフィルタ処理を行ったデータを用いて,現在の測定データにフィルタ処理を施すことになると思います。 このとき、データの測定開始直後では、その過去のフィルタ処理後のデータに信用性がない(ノイズがまだきちんと除去できていない?)ため,きちんとローパスフィルタが機能するのは,何ステップか時間が経った後からになると思います. そこで二つ質問があります. (1)上の解釈はそもそも正しいでしょうか? (2)正しいとすると,設定した遮断周波数等から,フィルタがうまく機能するようになるまで,はじめに何ステップ程度必要かを計算,あるいは判断することはできるのでしょうか? 詳しい方がいらっしゃいましたら,ご教授いただければと思います. よろしくお願いします.

  • 位相ずれのないフィルター

    現在デジタルフィルタに関して勉強中の者です。 当初周波数特性しか意識せずFIRやIIR等を使用していたのですが、後に位相特性がある事に気づきました。お恥ずかしい話です。 狙った周波数成分を除去し、且つ位相ずれがないフィルタをご存知の方がいらっしゃったら教えて頂けますでしょうか。 自分でできる限り調べMATLABのfiltfilt関数が一番近いのかなと思っています。 どうぞよろしくお願いします。

  • 繰り返し計算で求められる解を直接計算して求める方法

    こんにちは、 下記について、教えて下さい。 y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3); があります。 a2は a2->-((7*(-1+x))/(1+2*x))-s1; です。 s1は nが1のときは、s1=0 nが2以上のときは、s1=(92*n)/(y*10^6) となります。 nを増やして、yが5.9に一番、近づいたときの nを求めたいのですが、どのように計算すれば 良いでしょうか? 下記は、nを増やして、mathematcaを使用して数値計算で求めたものです。 答えは n=13822 y=5.89997 となりました。 もっと、スマートに直接計算する方法を教えて下さい。 x=0.767476; For[n=1,n<2*10^4,n++, If[n==1,s1=0]; If[n>1,s1=(92*n)/(y1*10^6)]; y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3); y1=y/.a2->-((7*(-1+x))/(1+2*x))-s1; If[y1-5.9<0,Print["n=",n]]; If[y1-5.9<0,Print["y1=",y]]; ];

  • 繰り返し計算で得られる解を、直接計算して求める方法

    こんにちは、 下記について、教えて下さい。 y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3); があります。 a2は a2->-((7*(-1+x))/(1+2*x))-s1; です。 s1は nが1のときは、s1=0 nが2以上のときは、s1=(92*n)/(y*10^6) となります。 nを増やして、yが0.1に一番、近づいたときの nを求めたいのですが、どのように計算すれば 良いでしょうか? 下記は、nを増やして、mathematcaを使用して数値計算で求めたものです。 答えは n=14675 y=0.0829778 となりました。 もっと、スマートに直接計算する方法を教えて下さい。 x=0.767476; a2=.; For[n=1,n<2*10^4,n++, If[nŠ1,s1=0]; If[n>1,s1=(92*n)/(y*10^6)]; y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3); a2=-((7*(-1+x))/(1+2*x))-s1; f=0.1; If[y-f<0,Print["n=",n]]; If[y-f<0,Print["y=",y]]; If[y-f<0,Break[]]; ]; 下記は、以前、ここでご教示頂いたものですが、 いろいろと計算しますと、計算値が、上記の繰り返し計算の値と 異なってしまいます。 x=0.767476; y=.; n=.; z=Solve[y-(625.733*((2/5)*(1-x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^2-(4/105)*(1+2*x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^3))Š0,n]; y=0.1; Simplify[z]

  • 最小2乗法における連立方程式の計算法を教えて下さい

    最小2乗法に関して E=Σ(y-ax-b)^2 ∂E/∂a=Σ(y-ax-b)×2×(-x)=0 ∂E/∂b=Σ(y-ax-b)×2×(-1)=0 ここまでは分かるのですが、aとbを求めるにあたって、恥ずかしながらどのように連立方程式の計算をすればいいのか分かりません。 どなたかこの連立方程式の計算過程を分かりやすく教えて下さい。宜しくお願い致します。 それとこの計算に関してある本を見たところ、Σb=n として計算するとありました。 なぜΣb=nとしていいのかも合わせて教えて頂けると嬉しいです。