1次元離散ウェーブレット変換

C言語によるサンプルソースコード : 使用関数名:nag_dwt (c09cac)

ホーム > 製品 > nAG数値計算ライブラリ > サンプルソースコード集 > 1次元離散ウェーブレット変換 (C言語/C++)

Keyword: 1次元, 離散, ウェーブレット変換

概要

本サンプルは1次元離散ウェーブレット変換を行うC言語によるサンプルプログラムです。 本サンプルは以下に示される8個の要素をもつ配列についてDaubechies ウェーブレットを用いて1次元離散ウェーブレット変換を行い、近似係数、詳細係数とウェーブレットの再構成を出力します。

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;
}


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2024
Privacy Policy  /  Trademarks