Keyword: 1次元, 離散, ウェーブレット変換
概要
本サンプルは1次元離散ウェーブレット変換を行うC言語によるサンプルプログラムです。 本サンプルは以下に示される8個の要素をもつ配列についてDaubechies ウェーブレットを用いて1次元離散ウェーブレット変換を行い、近似係数、詳細係数とウェーブレットの再構成を出力します。
※本サンプルはnAG Cライブラリに含まれる関数 nag_dwt() のExampleコードです。本サンプル及び関数の詳細情報は nag_dwt のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_dwt のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11
このデータをダウンロード |
nag_dwt (c09cac) Example Program Data 8 : n Nag_Daubechies4 Nag_ZeroPadded : wavnam, mode 1.0 3.0 5.0 7.0 6.0 4.0 5.0 2.0 : X(1:n)
- 1行目はタイトル行で読み飛ばされます。
- 2行目に入力データである配列の要素の数(n)を指定しています。
- 3行目にどのウェーブレット法を使用するかを示すパラメータ(wavnam)とデータの端部拡張(End Extension)の手法を示すパラメータ(mode)を指定しています。この場合は、4つの消失モーメントがある Daubechies ウェーブレットを使用することを意味し、データの端部をゼロパディング(ゼロ詰め)することを意味します。
- 4~11行目に配列の要素(x)を指定しています。
出力結果
(本関数の詳細はnag_dwt のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
この出力例をダウンロード |
nag_dwt (c09cac) Example Program Results DWT :: Wavelet : Nag_Daubechies4 End mode : Nag_ZeroPadded N : 8 Input Data X : 1.0000 3.0000 5.0000 7.0000 6.0000 4.0000 5.0000 2.0000 Approximation coefficients CA : 0.0015 -0.0060 -0.0247 6.3326 12.6652 10.3805 3.6509 Detail coefficients CD : 0.0335 0.0579 -0.8437 2.5120 -1.0630 0.4712 -0.1679 Reconstruction Y : 1.0000 3.0000 5.0000 7.0000 6.0000 4.0000 5.0000 2.0000
- 4行目にウェーブレット変換の手法が出力されています。
- 5行目にデータの端部拡張(End Extension)のモードが出力されています。
- 6行目に入力された配列の要素の数が出力されています。
- 9行目に入力データである配列の要素が出力されています。
- 12行目に近似係数が出力されています。
- 14行目に詳細係数が出力されています。
- 17行目にウェーブレット再構成が出力されています。
ソースコード
(本関数の詳細はnag_dwt のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
このソースコードをダウンロード |
/* nag_dwt (c09cac) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. */ /* Pre-processor includes */ #include <stdio.h> #include <math.h> #include <string.h> #include <nag.h> #include <nag_stdlib.h> #include <nagc09.h> int main(void) { /* Constants */ Integer licomm = 100; /*Integer scalar and array declarations */ Integer exit_status = 0; Integer i, n, nf, nwc, nwl, ny; Integer *icomm = 0; NagError fail; Nag_Wavelet wavnamenum; Nag_WaveletMode modenum; /*Double scalar and array declarations */ double *ca = 0, *cd = 0, *x = 0, *y = 0; /*Character scalar and array declarations */ char mode[24], wavnam[20]; INIT_FAIL(fail); printf("nag_dwt (c09cac) Example Program Results\n\n"); fflush(stdout); /* Skip heading in data file */ scanf("%*[^\n] "); /* Read n */ scanf("%ld%*[^\n] ", &n); if (!(x = nAG_ALLOC(n, double)) || !(y = nAG_ALLOC(n, double)) || !(icomm = nAG_ALLOC(licomm, Integer))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* Read wavnam, mode */ scanf("%19s%23s%*[^\n] ", wavnam, mode); /* * nag_enum_name_to_value (x04nac). * Converts nAG enum member name to value */ wavnamenum = (Nag_Wavelet) nag_enum_name_to_value(wavnam); modenum = (Nag_WaveletMode) nag_enum_name_to_value(mode); if (n >= 2) { printf("DWT :: \n"); printf(" Wavelet :%16s\n", wavnam); printf(" End mode :%16s\n", mode); printf(" N :%16ld\n\n", n); /* Read array */ printf("%s\n", "Input Data X :"); for (i = 0; i < n; i++) { scanf("%lf ", &x[i]); printf("%8.4f%s", x[i], (i + 1) % 8 ? " " : "\n"); } printf("\n"); /* * nag_wfilt (c09aac) * Wavelet filter query */ nag_wfilt(wavnamenum, Nag_SingleLevel, modenum, n, &nwl, &nf, &nwc, icomm, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_wfilt (c09aac).\n%s\n", fail.message); exit_status = 1; goto END; } if (!(ca = nAG_ALLOC(nwc, double)) || !(cd = nAG_ALLOC(nwc, double))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* * nag_dwt (c09cac) * one-dimensional discrete wavelet transform (dwt) */ nag_dwt(n, x, nwc, ca, cd, icomm, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_dwt (c09cac).\n%s\n", fail.message); exit_status = 1; goto END; } printf("Approximation coefficients CA : \n"); for (i = 0; i < nwc; i++) printf("%8.4f%s", ca[i] * sqrt(2.00e0), (i + 1) % 8 ? " " : "\n"); printf("\n"); printf("Detail coefficients CD : \n"); for (i = 0; i < nwc; i++) printf("%8.4f%s", cd[i] * sqrt(2.00e0), (i + 1) % 8 ? " " : "\n"); printf("\n\n"); if (modenum == Nag_Periodic) { ny = 2 * nwc; } else { ny = n; } /* * nag_idwt (c09cbc) * one-dimensional inverse discrete wavelet transform (IDWT) */ nag_idwt(nwc, ca, cd, n, y, icomm, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_idwt (c09cbc).\n%s\n", fail.message); exit_status = 1; goto END; } printf("Reconstruction Y : \n"); for (i = 0; i < ny; i++) printf("%8.4f%s", y[i], (i + 1) % 8 ? " " : "\n"); } END: nAG_FREE(ca); nAG_FREE(cd); nAG_FREE(x); nAG_FREE(y); nAG_FREE(icomm); return exit_status; }