14
埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ 観測波形をフーリエ変換してフーリエ・スペクトルを求めたのち,成分の一部を減衰さ せたスペクトルを逆フーリエ変換すると,元の観測波形にフィルタを掛けた波形が得られ る.これをデジタルフィルタという. Excel にはデータ分析ツールの一つとして,フーリエ 変換および逆フーリエ変換の機能が装備されている.この機能を利用すると手軽にデジタ ルフィルタを実現することができるが,フーリエ変換および逆変換のたびに,手動で分析 ツールの呼び出しが必要なため操作が煩雑である.自動的にデジタルフィルタリングを行 うには,分析ツールの呼び出しを VBA で自動化するか,フーリエ変換および逆変換そのも のを VBA で組む必要がある.本資料では,Excel のデータ分析ツールを手動で使用する方 法,データ分析ツールの操作を VBA で自動化する方法, VBA FFT (高速フーリエ変換) プログラムを記述する方法について述べる. 1.デジタルフィルタの概要 1.1 フーリエ変換 時刻 t における観測波形を ) (t x とすると, ) (t x のフーリエ変換 X dt t j t t x dt e t x X t j sin cos (3) この X は複素数で表され,実数部 R X を,虚数部を I X と表すと I R jX X X 1.2 逆フーリエ変換 フーリエ・スペクトル X の逆変換は dt e x X t x d e x X t x t j t j 2 1 2 1 (3) で表される. 1.3 フィルタ関数 観測波形 ) (t x のフーリエ変換 X に対して,フィルタ関数 W との積 W X を計算 し, W X に対してフーリエ逆変換を行うと,信号成分と雑音成分を分離することが できる.フィルタ関数は,フィルタリングの種類すなわちローパス(低域通過),バンドパ ス(帯域通過),ハイパス(高域通過)によって,図 1 に示すように定義する.

x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

Embed Size (px)

Citation preview

Page 1: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14

テーマ: Excel によるデジタルフィルタ

観測波形をフーリエ変換してフーリエ・スペクトルを求めたのち,成分の一部を減衰さ

せたスペクトルを逆フーリエ変換すると,元の観測波形にフィルタを掛けた波形が得られ

る.これをデジタルフィルタという.Excel にはデータ分析ツールの一つとして,フーリエ

変換および逆フーリエ変換の機能が装備されている.この機能を利用すると手軽にデジタ

ルフィルタを実現することができるが,フーリエ変換および逆変換のたびに,手動で分析

ツールの呼び出しが必要なため操作が煩雑である.自動的にデジタルフィルタリングを行

うには,分析ツールの呼び出しを VBA で自動化するか,フーリエ変換および逆変換そのも

のを VBA で組む必要がある.本資料では,Excel のデータ分析ツールを手動で使用する方

法,データ分析ツールの操作を VBA で自動化する方法,VBA で FFT(高速フーリエ変換)

プログラムを記述する方法について述べる.

1.デジタルフィルタの概要

1.1 フーリエ変換

時刻 t における観測波形を )(tx とすると, )(tx のフーリエ変換 X は

dttjttx

dtetxX tj

sincos (3)

この X は複素数で表され,実数部 RX を,虚数部を IX と表すと

IR jXXX

1.2 逆フーリエ変換

フーリエ・スペクトル X の逆変換は

dtexXtx

dexXtx

tj

tj

2

1

2

1

(3)

で表される.

1.3 フィルタ関数

観測波形 )(tx のフーリエ変換 X に対して,フィルタ関数 W との積 WX を計算

し, WX に対してフーリエ逆変換を行うと,信号成分と雑音成分を分離することが

できる.フィルタ関数は,フィルタリングの種類すなわちローパス(低域通過),バンドパ

ス(帯域通過),ハイパス(高域通過)によって,図 1 に示すように定義する.

Page 2: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-2/14

1.4 計算例

(1)観測波形

フーリエ変換を行うには,2 の倍数(2, 4, 8, 16, … , 2n)個のデータが必要となる.デー

タ数が不足する場合は,0 を追加して 2 の倍数個にしなければならない.ここでは,図 2

に示す 1024 個のデータからなる観測波形データがあるものとする.

図 2 観測波形

(2)フーリエ・スペクトル

図 1 の観測波形にフーリエ変換を行うと図 3 に示すフーリエ・スペクトルが得られる.

(ただし,N=0 のスペクトルは表示を省略)このとき,=0 の点を除き, X は N/2 を中

心に左右対称となる.

8000

8500

9000

9500

10000

10500

11000

11500

12000

12500

1

46

91

13

6

18

1

22

6

27

1

31

6

36

1

40

6

45

1

49

6

54

1

58

6

63

1

67

6

72

1

76

6

81

1

85

6

90

1

94

6

99

1

観測値

N

観測波形データ, x(t)

1 1 1

W() W() W()

N3 N4

N1 N2 N3 N4

N1 N2

低域通過フィルタ関数

帯域通過フィルタ関数

高域通過フィルタ関数

図 1 フィルタ関数

Page 3: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-3/14

図 3 フーリエ・スペクトル

(3)フィルタ関数

低域通過フィルタ関数を図 4 のように定義する.このとき,=0 の点を除き, W は

N/2 を中心に左右対称となる.この例では,

1024,,1005,100420,,2,1,01 NandNW

1003,,22,210 NW

である.

図 4 フィルタ関数

(4)フィルタ通過後のスペクトル

フィルタ通過後のスペクトル WX は,図 5 のとおりである.

0

100000

200000

300000

400000

500000

600000

700000

1

48

95

14

2

18

9

23

6

28

3

33

0

37

7

42

4

47

1

51

8

56

5

61

2

65

9

70

6

75

3

80

0

84

7

89

4

94

1

98

8

フーリエ・スペクトル

, X

()

N

フーリエ・スペクトル

0.0

0.2

0.4

0.6

0.8

1.0

1.2

1

44

87

13

0

17

3

21

6

25

9

30

2

34

5

38

8

43

1

47

4

51

7

56

0

60

3

64

6

68

9

73

2

77

5

81

8

86

1

90

4

94

7

99

0

W(

)

N

フィルタ,W()

Page 4: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-4/14

図 5 フィルタ関数

(5)フィルタ通過後の波形

図 5 のスペクトルをフーリエ逆変換することにより,図 6 に示すように低域通過後の波

形が得られ,平滑化が行われたことが分かる.

図 6 フィルタ通過後の波形

2.Excel を用いた FFT によるデジタルフィルタリング

2.1 Excelのデータ分析ツールを手動で使用する方法

0

100000

200000

300000

400000

500000

600000

700000

1

48

95

14

2

18

9

23

6

28

3

33

0

37

7

42

4

47

1

51

8

56

5

61

2

65

9

70

6

75

3

80

0

84

7

89

4

94

1

98

8

フーリエ・スペクトル

N

フィルター通過後のスペクトル

8000

8500

9000

9500

10000

10500

11000

11500

12000

1

46

91

13

6

18

1

22

6

27

1

31

6

36

1

40

6

45

1

49

6

54

1

58

6

63

1

67

6

72

1

76

6

81

1

85

6

90

1

94

6

99

1

軸ラベル

N

フィルタ通過後の波形

Page 5: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-5/14

小西研究室フリーウェアーのページ

http://www.sit.ac.jp/user/konishi/JPN/Freeware/Freeware.html

より,「Excel によるデジタルフィルタ Ver. 1.0」をダウンロードし,「デジタルフィルタ(フ

ーリエ解析機能利用+手動操作).xslm」という名の Excel シートを開く.

注意:ダウンロードしたシート上の観測波形のデータを単に更新しただけでは,自動計算

されません.必ず下記の要領で操作が必要になります.

操作方法①:準備

リボンのファイルタブから,オプション→アドイン→分析ツールをチェック→設定ボタン

をクリックする.

「アドイン」ダイアログボックスで,「分析ツール」および「分析ツール-VBA」をチェッ

クし,OK をクリックする.

Page 6: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-6/14

操作方法②:データの更新と削除

C 列の観測波形のデータを更新する.

D 列と K 列のデータを削除する.

操作方法③:データ範囲の指定

リボンのデータタブ→データ分析(下図)→フーリエ解析を選択→OK をクリック

図のダイアログボックスが表示されるので,入力範囲を$C$4:$C$1027,出力先を

$D$4:$D$1027 に指定し,OK をクリック

注意:D 列の値を削除しなかった場合は,次のメッセージが表示されるので,OK をクリ

Page 7: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) 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 列の値はテキスト形式で表示される.値が表示された直後は変換範囲がすでに選

択されているので,直ちに下図のように数値に変化する処理を行う.

Page 8: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) 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

をクリックしてダイアログを閉じる.これにより,メニューに「開発」が追加される.

Page 9: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) 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))

Page 10: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) 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」には,以下のプログラムを記述する.

Page 11: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-11/14

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

Page 12: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-12/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 変換

'データの読み込み

Page 13: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-13/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

Page 14: x t X x e d Z Z j t S x t X x e dt Z j t Z SŸ¼玉工業大学 技術資料(小西克享) Excel によるデジタルフィルタ-1/14 テーマ: Excel によるデジタルフィルタ

埼玉工業大学 技術資料(小西克享) 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.

個人的な学習の目的以外での使用,転載,配布等はできません.