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 のマニュアルページを参照)

このデータをダウンロード
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;
}


関連情報
Privacy Policy  /  Trademarks