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

1次元マルチレベル離散ウェーブレット変換

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

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

概要

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

1次元マルチレベル離散ウェーブレット変換のデータ 

※本サンプルはNAG Cライブラリに含まれる関数 nag_mldwt() のExampleコードです。本サンプル及び関数の詳細情報は nag_mldwt のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本関数の詳細はnag_mldwt のマニュアルページを参照)

このデータをダウンロード
nag_mldwt (c09ccc) Example Program Data
64                                     : n
Nag_Daubechies4  Nag_ZeroPadded        : wavnam, mode
6.5271  6.512   6.5016  6.5237  6.4625
6.3496  6.4025  6.4035  6.4407  6.4746
6.5095  6.6551  6.61    6.5969  6.6083
6.652   6.7113  6.7227  6.7196  6.7649
6.7794  6.8037  6.8308  6.7712  6.7067
6.769   6.7068  6.7024  6.6463  6.6098
6.59    6.596   6.5457  6.547   6.5797
6.5895  6.6275  6.6795  6.6598  6.6925
6.6873  6.7223  6.7205  6.6843  6.703
6.647   6.6008  6.6061  6.6097  6.6485
6.6394  6.6571  6.6357  6.6224  6.6073
6.6075  6.6379  6.6294  6.5906  6.6258
6.6369  6.6515  6.6826  6.7042         : X(1:n)

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に入力データである配列の要素の数(n)を指定しています。
  • 3行目にどのウェーブレット法を使用するかを示すパラメータ(wavnam)とデータの端部拡張(End Extension)の手法を示すパラメータ(mode)を指定しています。この場合は、4つの消失モーメントがある Daubechies ウェーブレットを使用することを意味し、データの端部をゼロパディング(ゼロ詰め)することを意味します。
  • 4〜16行目に配列の要素(x)を指定しています。

出力結果

(本関数の詳細はnag_mldwt のマニュアルページを参照)

この出力例をダウンロード
nag_mldwt (c09ccc) Example Program Results

MLDWT :: 
     Wavelet  : Nag_Daubechies4
     End mode :  Nag_ZeroPadded
     N        :              64

 Input Data      X :
  6.5271   6.5120   6.5016   6.5237   6.4625   6.3496   6.4025   6.4035
  6.4407   6.4746   6.5095   6.6551   6.6100   6.5969   6.6083   6.6520
  6.7113   6.7227   6.7196   6.7649   6.7794   6.8037   6.8308   6.7712
  6.7067   6.7690   6.7068   6.7024   6.6463   6.6098   6.5900   6.5960
  6.5457   6.5470   6.5797   6.5895   6.6275   6.6795   6.6598   6.6925
  6.6873   6.7223   6.7205   6.6843   6.7030   6.6470   6.6008   6.6061
  6.6097   6.6485   6.6394   6.6571   6.6357   6.6224   6.6073   6.6075
  6.6379   6.6294   6.5906   6.6258   6.6369   6.6515   6.6826   6.7042

   Number of Levels :                    6
   Number of coefficients in each level : 
       7        7        8       10       14       21       35 

   Wavelet coefficients C : 
  0.0000  -0.0227  -0.3446   2.7574 -10.1970  44.8800  15.9443   0.0010
 -0.4881 -10.2673  11.3258  -1.7469   2.0785  -0.7334  -0.0054  -0.1402
 -5.8980  -1.1527   5.5613   2.1352   0.3203  -0.4004   0.0010   0.5229
  0.5055  -2.7274  -0.0911  -0.2806  -0.3669   2.9467  -0.3799  -0.1552
  0.0218   0.0922   5.4626  -2.1620   0.5196  -0.0287  -0.0199   0.0920
 -0.0134  -0.1298  -5.5168   2.3105  -0.5383  -0.0155   0.3057   0.6186
 -1.5542   0.2682   0.1566   0.0030  -0.0152  -0.0589   0.0126   0.0063
  0.0171  -0.0268   0.0077  -0.0189   0.0207   0.0104  -0.3207  -0.6062
  1.6288  -0.2414  -0.0671   3.1657  -1.1462   0.2785   0.0523  -0.0030
 -0.0270  -0.0442   0.0090   0.0171  -0.0230  -0.0015   0.0213  -0.0402
 -0.0263  -0.0099   0.0021  -0.0250   0.0210  -0.0028  -0.0298  -0.0095
  0.0034   0.0281  -0.0188  -0.0002  -0.0173  -0.0076  -0.0014   0.0184
 -0.0318   0.0048   0.0047  -3.2555   1.1710  -0.2913 

   Reconstruction              Y : 
  6.5271   6.5120   6.5016   6.5237   6.4625   6.3496   6.4025   6.4035
  6.4407   6.4746   6.5095   6.6551   6.6100   6.5969   6.6083   6.6520
  6.7113   6.7227   6.7196   6.7649   6.7794   6.8037   6.8308   6.7712
  6.7067   6.7690   6.7068   6.7024   6.6463   6.6098   6.5900   6.5960
  6.5457   6.5470   6.5797   6.5895   6.6275   6.6795   6.6598   6.6925
  6.6873   6.7223   6.7205   6.6843   6.7030   6.6470   6.6008   6.6061
  6.6097   6.6485   6.6394   6.6571   6.6357   6.6224   6.6073   6.6075
  6.6379   6.6294   6.5906   6.6258   6.6369   6.6515   6.6826   6.7042


  • 4行目にウェーブレット変換の手法が出力されています。
  • 5行目にデータの端部拡張(End Extension)のモードが出力されています。
  • 6行目に入力された配列の要素の数が出力されています。
  • 9〜16行目に入力データである配列の要素が出力されています。
  • 18行目に実行される多重分解のレベルの数が出力されています。
  • 20行目に各レベルの変換係数の数が出力されています。左から最終レベル(レベル6)の分解の 近似係数の数、詳細係数の数、レベル5からレベル1までの詳細係数の数が出力されています。
  • 23から35行目にマルチレベルウェーブレット変換の係数が出力されています。
  • 38から45行目にウェーブレット再構成が出力されています。

ソースコード

(本関数の詳細はnag_mldwt のマニュアルページを参照)

※本サンプルソースコードはNAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法


このソースコードをダウンロード
/* nag_mldwt (c09ccc) 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, nnz, nwc, nwlmax, nwl, nwlinv;
  Integer *dwtlev = 0, *icomm = 0;
  NagError fail;
  Nag_Wavelet wavnamenum;
  Nag_WaveletMode modenum;
  /*Double scalar and array declarations */
  double *c = 0, *x = 0, *y = 0;
  /*Character scalar and array declarations */
  char mode[24], wavnam[20];

  INIT_FAIL(fail);

  printf("nag_mldwt (c09ccc) Example Program Results\n\n");
  fflush(stdout);

  /*     Skip heading in data file */
  scanf("%*[^\n] ");
  /*     Read n - length of input data sequence */
  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 Wavelet name (wavnam) and end mode (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("MLDWT :: \n");
    printf("     Wavelet  :%16s\n", wavnam);
    printf("     End mode :%16s\n", mode);
    printf("     N        :%16ld\n\n", n);
    /*        Read data array and write it out */
    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_MultiLevel, modenum, n, &nwlmax, &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 (!(c = NAG_ALLOC(nwc, double)) || !(dwtlev = NAG_ALLOC(nwc, Integer)))
    {
      printf("Allocation failure\n");
      exit_status = -1;
      goto END;
    }
    nwl = nwlmax;
    /*        Perform Discrete Wavelet transform */
    /*
     * nag_mldwt (c09ccc)
     * one-dimensional multi-level discrete wavelet transform (mldwt)
     */
    nag_mldwt(n, x, nwc, c, nwl, dwtlev, icomm, &fail);
    if (fail.code != NE_NOERROR) {
      printf("Error from nag_mldwt (c09ccc).\n%s\n", fail.message);
      exit_status = 1;
      goto END;
    }
    printf("   Number of Levels : %20ld\n", nwl);
    printf("   Number of coefficients in each level : \n");
    for (i = 0; i < nwl + 1; i++)
      printf("%8ld%s", dwtlev[i], (i + 1) % 8 ? " " : "\n");
    printf("\n\n");
    nnz = 0;
    for (i = 0; i < nwl + 1; i++)
      nnz = nnz + dwtlev[i];
    printf("   Wavelet coefficients C : \n");
    for (i = 0; i < nnz; i++)
      printf("%8.4f%s", c[i], (i + 1) % 8 ? " " : "\n");
    printf("\n\n");
    /*           Reconstruct original data */
    nwlinv = nwl;
    /*
     * nag_imldwt (c09cdc)
     * one-dimensional inverse multi-level discrete wavelet transform
     * (imldwt)
     */
    nag_imldwt(nwlinv, nwc, c, n, y, icomm, &fail);
    if (fail.code != NE_NOERROR) {
      printf("Error from nag_imldwt (c09cdc).\n%s\n", fail.message);
      exit_status = 1;
      goto END;
    }
    printf("   Reconstruction              Y : \n");
    for (i = 0; i < n; i++)
      printf("%8.4f%s", y[i], (i + 1) % 8 ? " " : "\n");
    printf("\n");
  }

END:
  NAG_FREE(c);
  NAG_FREE(x);
  NAG_FREE(y);
  NAG_FREE(dwtlev);
  NAG_FREE(icomm);

  return exit_status;
}


Results matter. Trust NAG.

Privacy Policy | Trademarks