VBA Private Private Const Num 128 Const PI
VBAでの記述 ①データ宣言とパルス信号の設定 (色々な信号を設定してみよう) Private Private Const Num = 128 Const PI = 6. 28318530717959 / 2 X(Num) As Double Y(Num) As Double Z(Num) As Double Private Sub パルス() For K = 0 To Num - 1 X(K) = -1 If K >= 30 And K < 80 Then X(K) = 1 Next X(Num) = X(0) End Sub
VBAでの記述 ②結果設定とボタンClickイベントハンドラ Private Sub 結果設定() With Worksheets("Sheet 1"). Cells(1, 1) = "No. ": . Cells(1, 2) = "X". Cells(1, 3) = "Y": . Cells(1, 4) = "Z" For K = 0 To Num. Cells(K + 2, 1) = K: . Cells(K + 2, 2) = X(K). Cells(K + 2, 3) = Y(K): . Cells(K + 2, 4) = Z(K) Next End With End Sub ボタン 1_Click() パルス DCT IDCT 結果設定 End Sub
VBAでの記述 ③DCT Private Sub DCT() 'DCT(離散的コサイン変換) Dim C 0 As Double: Dim Cn 0 As Double C 0 = 1 / Sqr(Num): Cn 0 = Sqr(2#) * C 0 For K = 0 To Num - 1 Y(K) = 0 For j = 0 To Num - 1 Y(K) = Y(K) + X(j) * Cos((2 * j + 1) * K * PI / (2 * Num)) Next If K = 0 Then Y(K) = C 0 * Y(K) Else Y(K) = Cn 0 * Y(K) End If Next Y(Num) = 0 End Sub
VBAでの記述 ④IDCT Private Sub IDCT() 'IDCT(離散的逆変換) Dim C 0 As Double: Dim C As Double C 0 = 1# / Sqr(2#): C = Sqr(2# / Num) For j = 0 To Num - 1 Z(j) = C 0 * Y(0) For K = 1 To Num - 1 Z(j) = Z(j) + Y(K) * Cos((2 * j + 1) * K * PI / (2 * Num)) Next Z(j) = C * Z(j) Next Z(Num) = Z(0) End Sub
VBAでの記述 ①データ宣言とパルス信号の設定 Private Const Num = 8 Private Const PI = 3. 12159265358979 Private X(Num) As Double '入力データ Private Y(Num) As Double '変換結果 Private Z(Num) As Double '逆変換結果 Private Sub パルス() For K = 0 To Num - 1 X(K) = -1 If K >= 3 And K <= 5 Then X(K) = 1 Next X(Num) = X(0) End Sub
VBAでの記述 ②結果設定とボタンのClickイベントハンドラ Private Sub 結果設定() With Worksheets("Sheet 2"). Cells(1, 1) = "No. ": . Cells(1, 2) = "X". Cells(1, 3) = "Y": . Cells(1, 4) = "Z" For K = 0 To Num. Cells(K + 2, 1) = K: . Cells(K + 2, 2) = X(K). Cells(K + 2, 3) = Y(K): . Cells(K + 2, 4) = Z(K) Next End With End Sub Sheet 2_ボタン 1_Click() パルス FDCT IDCT 結果設定 End Sub
VBAでの記述 ③Chenのアルゴリズム(その1) Private Sub FDCT() 'FDCT(Chenのアルゴリズム) '(既に入力XがYに複写されているものとする) Cos 4 = Cos(PI / 4): Cos 8 = Cos(PI / 8) Cos 16 = Cos(PI / 16): Cos 163 = Cos(3 * PI / Sin 8 = Sin(PI / 8): Sin 16 = Sin(PI / 16) Sin 163 = Sin(3 * PI / 16) For J = 0 To Num Y(J) = X(J) Next For J = 0 To 3 tmp = Y(J) + Y(7 - J): Y(7 - J) = Y(J) Next tmp = Y(0) + Y(3): Y(3) = Y(0) - Y(3): Y(0) tmp = Y(1) + Y(2): Y(2) = Y(1) - Y(2): Y(1) tmp = Cos 4 * (-Y(5) + Y(6)) Y(6) = Cos 4 * (Y(5) + Y(6)) Y(5) = tmp 16) Y(7 - J): Y(J) = tmp
VBAでの記述 ④Chenのアルゴリズム(その2) tmp = Cos 4 * (Y(0) + Y(1)) Y(1) = Cos 4 * (Y(0) - Y(1)) Y(0) = tmp = Sin 8 * Y(2) + Cos 8 * Y(3) = -Cos 8 * Y(2) + Sin 8 * Y(3) Y(2) = tmp = Y(4) + Y(5): Y(5) = Y(4) - Y(5): Y(4) = tmp = -Y(6) + Y(7) = Y(6) + Y(7) Y(6) = tmp = Sin 16 * Y(4) + Cos 16 * Y(7) = -Cos 16 * Y(4) + Sin 16 * Y(7) Y(4) = tmp
VBAでの記述 ⑤Chenのアルゴリズム(その3) tmp = Cos 163 * Y(5) + Sin 163 * Y(6) = -Sin 163 * Y(5) + Cos 163 * Y(6) Y(5) = tmp = Y(1): Y(1) = Y(4): Y(4) = tmp = Y(3): Y(3) = Y(6): Y(6) = tmp For J = 0 To Num - 1 Y(J) = 0. 5 * Y(J) Next Y(Num) = Y(0) End Sub
VBAでの記述 ⑥確認用逆変換 Private Sub IDCT() 'IDT(離散的逆変換) Dim C 0 As Double: Dim C As Double C 0 = 1# / Sqr(2#): C = Sqr(2# / Num) For J = 0 To Num - 1 Z(J) = C 0 * Y(0) For K = 1 To Num - 1 Z(J) = Z(J) + Y(K) * Cos((2 * J + 1) * K * PI / (2 * Num)) Next Z(J) = C * Z(J) Next Z(Num) = Z(0) End Sub
- Slides: 24