埼玉工業大学 テーマ: 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 Excel によるデジタルフィルタ 観測波形をフーリエ変換してフーリエ・スペクトルを求めたのち,成分の一部を減衰さ せたスペクトルを逆フーリエ変換すると,元の観測波形にフィルタを掛けた波形が得られ る.これをデジタルフィルタという.Excel にはデータ分析ツールの一つとして,フーリエ 変換および逆フーリエ変換の機能が装備されている.この機能を利用すると手軽にデジタ ルフィルタを実現することができるが,フーリエ変換および逆変換のたびに,手動で分析 ツールの呼び出しが必要なため操作が煩雑である.自動的にデジタルフィルタリングを行 うには,分析ツールの呼び出しを VBA で自動化するか,フーリエ変換および逆変換そのも のを VBA で組む必要がある.本資料では,Excel のデータ分析ツールを手動で使用する方 法,データ分析ツールの操作を VBA で自動化する方法,VBA で FFT(高速フーリエ変換) プログラムを記述する方法について述べる. 1.デジタルフィルタの概要 1.1 フーリエ変換 時刻 t における観測波形を x(t ) とすると, x(t ) のフーリエ変換 X は X xt e jt dt xt cost j sin t dt (3) この X は複素数で表され,実数部 X R を,虚数部を X I と表すと X X R jX I 1.2 逆フーリエ変換 フーリエ・スペクトル X の逆変換は xt 1 X x e jt d 2 1 x t X x e jt dt 2 (3) で表される. 1.3 フィルタ関数 観測波形 x(t ) のフーリエ変換 X に対して,フィルタ関数 W との積 X W を計算 し, X W に対してフーリエ逆変換を行うと,信号成分と雑音成分を分離することが できる.フィルタ関数は,フィルタリングの種類すなわちローパス(低域通過),バンドパ ス(帯域通過),ハイパス(高域通過)によって,図 1 に示すように定義する. 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-2/14 W() W() W() 1 1 1 N3 N4 N1 低域通過フィルタ関数 N2 N3 N4 帯域通過フィルタ関数 図1 N1 N2 高域通過フィルタ関数 フィルタ関数 1.4 計算例 (1)観測波形 フーリエ変換を行うには,2 の倍数(2, 4, 8, 16, … , 2n)個のデータが必要となる.デー タ数が不足する場合は,0 を追加して 2 の倍数個にしなければならない.ここでは,図 2 に示す 1024 個のデータからなる観測波形データがあるものとする. 観測波形データ, x(t) 12500 12000 11500 観測値 11000 10500 10000 9500 9000 8500 1 46 91 136 181 226 271 316 361 406 451 496 541 586 631 676 721 766 811 856 901 946 991 8000 N 図2 観測波形 (2)フーリエ・スペクトル 図 1 の観測波形にフーリエ変換を行うと図 3 に示すフーリエ・スペクトルが得られる. (ただし,N=0 のスペクトルは表示を省略)このとき,=0 の点を除き, X は N/2 を中 心に左右対称となる. 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-3/14 フーリエ・スペクトル フーリエ・スペクトル, X() 700000 600000 500000 400000 300000 200000 100000 1 48 95 142 189 236 283 330 377 424 471 518 565 612 659 706 753 800 847 894 941 988 0 N 図3 フーリエ・スペクトル (3)フィルタ関数 低域通過フィルタ関数を図 4 のように定義する.このとき,=0 の点を除き, W は N/2 を中心に左右対称となる.この例では, W 1 N 0,1,2,,20 and N 1004,1005,,1024 W 0 N 21,22,,1003 である. フィルタ,W() 1.2 1.0 W() 0.8 0.6 0.4 0.2 1 44 87 130 173 216 259 302 345 388 431 474 517 560 603 646 689 732 775 818 861 904 947 990 0.0 N 図4 フィルタ関数 (4)フィルタ通過後のスペクトル フィルタ通過後のスペクトル X W は,図 5 のとおりである. 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-4/14 フィルター通過後のスペクトル 700000 フーリエ・スペクトル 600000 500000 400000 300000 200000 100000 1 48 95 142 189 236 283 330 377 424 471 518 565 612 659 706 753 800 847 894 941 988 0 N 図5 フィルタ関数 (5)フィルタ通過後の波形 図 5 のスペクトルをフーリエ逆変換することにより,図 6 に示すように低域通過後の波 形が得られ,平滑化が行われたことが分かる. フィルタ通過後の波形 12000 11500 軸ラベル 11000 10500 10000 9500 9000 8500 1 46 91 136 181 226 271 316 361 406 451 496 541 586 631 676 721 766 811 856 901 946 991 8000 N 図6 フィルタ通過後の波形 2.Excel を用いた FFT によるデジタルフィルタリング 2.1 Excel のデータ分析ツールを手動で使用する方法 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-5/14 小西研究室フリーウェアーのページ http://www.sit.ac.jp/user/konishi/JPN/Freeware/Freeware.html より, 「Excel によるデジタルフィルタ Ver. 1.0」をダウンロードし, 「デジタルフィルタ(フ ーリエ解析機能利用+手動操作).xslm」という名の Excel シートを開く. 注意:ダウンロードしたシート上の観測波形のデータを単に更新しただけでは,自動計算 されません.必ず下記の要領で操作が必要になります. 操作方法①:準備 リボンのファイルタブから,オプション→アドイン→分析ツールをチェック→設定ボタン をクリックする. 「アドイン」ダイアログボックスで,「分析ツール」および「分析ツール-VBA」をチェッ クし,OK をクリックする. 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-6/14 操作方法②:データの更新と削除 C 列の観測波形のデータを更新する. D 列と K 列のデータを削除する. 操作方法③:データ範囲の指定 リボンのデータタブ→データ分析(下図)→フーリエ解析を選択→OK をクリック 図 の ダ イ ア ロ グ ボ ッ ク ス が 表 示 さ れ る の で , 入 力 範 囲 を $C$4:$C$1027 , 出 力 先 を $D$4:$D$1027 に指定し,OK をクリック 注意:D 列の値を削除しなかった場合は,次のメッセージが表示されるので,OK をクリ 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-7/14 ックする.D 列が空欄の場合はこのメッセージは表示されない. 操作方法④:実部,虚部,フーリエ・スペクトルの計算 E4 セルの数式を =IMREAL(D4),F4 セルの数式を=IMAGINARY(D4),G4 セルの数式を =IMABS(D4)とし,これらの数式を E 列 F 列 G 列の 5~1027 行に貼り付ける 操作方法⑤:フィルタ関数の指定 フィルタの値を H 列に入力する 操作方法⑥:フィルタ通過後の複素数計算 I4 セルの数式を=COMPLEX(H4*E4,H4*F4)とし,I 列の 5~1027 行に貼り付ける 操作方法⑦:フィルタ通過後のスペクトルの計算 J4 セルの数式を=IMABS(I4)とし,これらの数式を J 列の 5~1027 行に貼り付ける 操作方法⑧:逆フーリエ変換を行う リボンのデータタブ→データ分析→フーリエ解析をクリック 図 の ダ イ ア ロ グ ボ ッ ク ス が 表 示 さ れ る の で , 入 力 範 囲 を $I$4:$I$1027 , 出 力 先 を $K$4:$K$1027 に指定,逆変換をチェックし,OK をクリック K 列の値を削除しなかった場合は,上書き確認のメッセージが表示されるので,OK をク リックする.K 列が空欄の場合はこのメッセージは表示されない. 注意:K 列の値はテキスト形式で表示される.値が表示された直後は変換範囲がすでに選 択されているので,直ちに下図のように数値に変化する処理を行う. 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-8/14 以上の操作で,上述の図 6 が更新される. 2.2 データ分析ツールの操作を VBA で自動化する方法 小西研究室フリーウェアーのページ, http://www.sit.ac.jp/user/konishi/JPN/Freeware/Freeware.html より, 「Excel によるデジタルフィルタ Ver. 1.0」をダウンロードし, 「デジタルフィルタ(フ ーリエ解析機能利用+手動操作).xslm」という名の Excel シートを開く. 注意:ダウンロードしたシート上の観測波形のデータを単に更新しただけでは,自動計算 されません.必ず下記の要領で操作必要になります. 操作方法①:準備 Excel は直前の設定に従うため,ファイルをダウンロードしただけでは,VBA を使用でき るとは限らない.リボンに開発タブが表示されていない場合は VBA を使用するため,以下 の設定を行うこと. リボンのファイルタブから,リボンのユーザ設定を選ぶ.開発にチェックを入れ,OK をクリックしてダイアログを閉じる.これにより,メニューに「開発」が追加される. 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-9/14 次に,Excel の分析ツールを使用するため,2.1 の操作方法①:準備に記述した設定を行 う. 操作方法②:データの更新と削除 C 列の観測波形のデータを更新する. D 列と K 列のデータを削除する. 操作方法③:フーリエ変換 「ボタン 1」をクリックすると,フィルタ通過後の値(K 列)が自動計算される. 参考:「ボタン 1」には,以下のプログラムを記述する. Sub ボタン 1_Click() Dim i0, n As Integer Dim i0str, i1str As String i0 = Cells(1, 2) n = Cells(2, 2) i0str = Right$(Str(i0), Len(Str(i0) - 1)) i1str = Right$(Str(i0 + n - 1), Len(Str(i0 + n - 1) - 1)) Application.Run "ATPVBAEN.XLAM!Fourier", ActiveSheet.Range("$C$" + i0str + ":$C$" + i1str), ActiveSheet.Range("$D$" + i0str + ":$D$" + i1str), False, False For i = i0 To i0 + n - 1 Cells(i, 5) = WorksheetFunction.ImReal(Cells(i, 4)) Cells(i, 6) = WorksheetFunction.Imaginary(Cells(i, 4)) Cells(i, 7) = WorksheetFunction.ImAbs(Cells(i, 4)) 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-10/14 If Cells(i, 8) = 0 Then Cells(i, 9) = 0 Else Cells(i, 9) = WorksheetFunction.Complex(Cells(i, 8) * Cells(i, 5), Cells(i, 8) * Cells(i, 6)) End If Next i Application.Run "ATPVBAEN.XLAM!Fourier", ActiveSheet.Range("$I$" + i0str + ":$I$" + i1str), ActiveSheet.Range("$K$" + i0str + ":$K$" + i1str), True, False For i = i0 To i0 + n - 1 Cells(i, 11) = Val(Cells(i, 11)) Next i End Sub 2.3 VBA で FFT(高速フーリエ変換)プログラムを記述する方法 小西研究室フリーウェアーのページ, http://www.sit.ac.jp/user/konishi/JPN/Freeware/Freeware.html より, 「Excel によるデジタルフィルタ Ver. 1.0」をダウンロードし, 「デジタルフィルタ(フ ーリエ解析機能利用+手動操作).xslm」という名の Excel シートを開く. 注意:ダウンロードしたシート上の観測波形のデータを単に更新しただけでは,自動計算 されません.必ず下記の要領で操作必要になります. 操作方法 ① Excel の VBA を使用するため,2.2 の操作方法①:準備に記述した設定を行う.ただし, VBA で FFT プログラムを記述するため,分析ツールの設定は不要. ② 観測波形のデータ(C 列)を更新する. ③ フィルタの値(G 列)を設定する. ④ ボタン 1 をクリックする. 上記操作により,フィルタ通過後の値(H 列)が自動計算される. 謝意 FFT(高速逆フーリエ変換)のプログラムは,露本伊佐男氏のホームページに記載され たものを使用しました.URL は次のとおりです. http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html 逆フーリエ変換のプログラムは,上記 FFT プログラムを逆 FFT 用に修正したものです. この場を借りてお礼申し上げます. 参考:「ボタン 1」には,以下のプログラムを記述する. 埼玉工業大学 技術資料(小西克享) Sub ボタン 1_Click() Dim g, h, i, j, k, l, m, o, p, q As Integer i=0 j=0 k=0 l=0 p=0 h=0 g=0 q=0 'Fourier 変換 'データ数 n を指定(2 の倍数) Dim i0, n As Integer Dim i0str, i1str As String i0 = Cells(1, 2) n = Cells(2, 2) i0str = Right$(Str(i0), Len(Str(i0) - 1)) i1str = Right$(Str(i0 + n - 1), Len(Str(i0 + n - 1) - 1)) 'n = 1024 m = Log(n) / Log(2) 'xr,xi はデータ数以上、s,c はデータ数の半分以上を指定しておく Dim W(1024), xr(1024), xi(1024), xd, s(512), c(512), a, b As Double 'データの読み込み For i = 1 To n xr(i - 1) = Cells(i + i0 - 1, 3) xi(i - 1) = 0 Next i 'FFT の計算 a=0 b = 3.14159265359 * 2 / n For i = 0 To n / 2 s(i) = Sin(a) c(i) = Cos(a) a=a+b Next i l=n h=1 For g = 1 To m l=l/2 k=0 For q = 1 To h p=0 For i = k To l + k - 1 Excel によるデジタルフィルタ-11/14 埼玉工業大学 技術資料(小西克享) j=i+l a = xr(i) - xr(j) b = xi(i) - xi(j) xr(i) = xr(i) + xr(j) xi(i) = xi(i) + xi(j) If p = 0 Then xr(j) = a xi(j) = b Else xr(j) = a * c(p) + b * s(p) xi(j) = b * c(p) - a * s(p) End If p=p+h Next i k=k+l+l Next q h=h+h Next g j=n/2 For i = 1 To n - 1 k=n If j < i Then xd = xr(i) xr(i) = xr(j) xr(j) = xd xd = xi(i) xi(i) = xi(j) xi(j) = xd End If k=k/2 Do While j >= k j=j-k k=k/2 Loop j=j+k Next i 'データの出力 For i = 1 To n Cells(i + i0 - 1, 4) = xr(i - 1) Cells(i + i0 - 1, 5) = xi(i - 1) Cells(i + i0 - 1, 6) = Sqr((xr(i - 1) ^ 2 + xi(i - 1) ^ 2)) Next i '逆 Fourier 変換 'データの読み込み Excel によるデジタルフィルタ-12/14 埼玉工業大学 技術資料(小西克享) For i = 1 To n W(i - 1) = Cells(i + i0 - 1, 7) 'フィルタ関数 xr(i - 1) = xr(i - 1) * W(i - 1) xi(i - 1) = xi(i - 1) * W(i - 1) Next i 'FFT の計算 l=n h=1 For g = 1 To m l=l/2 k=0 For q = 1 To h p=0 For i = k To l + k - 1 j=i+l a = xr(i) - xr(j) b = xi(i) - xi(j) xr(i) = xr(i) + xr(j) xi(i) = xi(i) + xi(j) If p = 0 Then xr(j) = a xi(j) = b Else xr(j) = a * c(p) + b * s(p) xi(j) = b * c(p) - a * s(p) End If p=p+h Next i k=k+l+l Next q h=h+h Next g j=n/2 For i = 1 To n - 1 k=n If j < i Then xd = xr(i) xr(i) = xr(j) xr(j) = xd xd = xi(i) xi(i) = xi(j) xi(j) = xd End If k=k/2 Do While j >= k Excel によるデジタルフィルタ-13/14 埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-14/14 j=j-k k=k/2 Loop j=j+k Next i Cells(i0, 8) = xr(0) / n 'データの出力 For i = 2 To n Cells(i0 + n - i + 1, 8) = xr(i - 1) / n Next i End Sub http://www.sit.ac.jp/user/konishi/JPN/Tech_inform/Pdf/DigitalFilterbyExcel.pdf Copyright ⓒ 2013-2014 小西克享, All Rights Reserved. 個人的な学習の目的以外での使用,転載,配布等はできません.
© Copyright 2024 Paperzz