Excelによるデジタルフィルタ

埼玉工業大学
テーマ:
技術資料(小西克享)
Excel によるデジタルフィルタ-1/14
Excel によるデジタルフィルタ
観測波形をフーリエ変換してフーリエ・スペクトルを求めたのち,成分の一部を減衰さ
せたスペクトルを逆フーリエ変換すると,元の観測波形にフィルタを掛けた波形が得られ
る.これをデジタルフィルタという.Excel にはデータ分析ツールの一つとして,フーリエ
変換および逆フーリエ変換の機能が装備されている.この機能を利用すると手軽にデジタ
ルフィルタを実現することができるが,フーリエ変換および逆変換のたびに,手動で分析
ツールの呼び出しが必要なため操作が煩雑である.自動的にデジタルフィルタリングを行
うには,分析ツールの呼び出しを VBA で自動化するか,フーリエ変換および逆変換そのも
のを VBA で組む必要がある.本資料では,Excel のデータ分析ツールを手動で使用する方
法,データ分析ツールの操作を VBA で自動化する方法,VBA で FFT(高速フーリエ変換)
プログラムを記述する方法について述べる.
1.デジタルフィルタの概要
1.1 フーリエ変換
時刻 t における観測波形を x(t ) とすると, x(t ) のフーリエ変換 X  は
X     xt e jt dt


  xt cost  j sin t dt

(3)

この X  は複素数で表され,実数部 X R  を,虚数部を X I  と表すと
X   X R   jX I 
1.2 逆フーリエ変換
フーリエ・スペクトル X  の逆変換は
xt  

1
X  x e jt d
2 

1
x t  
X  x e jt 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.
個人的な学習の目的以外での使用,転載,配布等はできません.