Keyword: 1次元, 離散, ウェーブレット変換
概要
本サンプルは1次元離散ウェーブレット変換を行うC言語によるサンプルプログラムです。 本サンプルは以下に示される8個の要素をもつ配列についてDaubechies ウェーブレットを用いて1次元離散ウェーブレット変換を行い、近似係数、詳細係数とウェーブレットの再構成を出力します。
※本サンプルはnAG Cライブラリに含まれる関数 nag_dwt() のExampleコードです。本サンプル及び関数の詳細情報は nag_dwt のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_dwt のマニュアルページを参照)このデータをダウンロード |
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 のマニュアルページを参照)この出力例をダウンロード |
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等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
このソースコードをダウンロード |
/* 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; }