Blog categories

Comments

[C++] GSL라이브러리를 이용한 Wavelet Transforms (웨이브렛 변환) 수행

[C++] GSL라이브러리를 이용한 Wavelet Transforms (웨이브렛 변환) 수행

GSL 라이브러리

GSL 라이브러리란?

GSL (GNU Scientific Library) 라이브러리는 C/C++에서 널리 사용되는 과학 연산 라이브러리이다. GNU General Public License를 따르는 free software 이다. 과학 연산을 위한 다양한 기능들을 제공한다.

GSL 설치

설치 방법은 다양하지만, 가장 손쉬운 방법으로는 vcpkg를 이용하는 것이다.

VCPKG란 마이크로소프트(Microsoft)가 개발한 툴로, 여러 C/C++ Library 를 간편하게 설치할 수 있도록 돕는다.
다양한 플랫폼에서 사용 가능하게 설계 되어, Windows 뿐만 아니라 Linux 및 MacOS에서 사용 가능하다.

VCPKG 사용과 관련한 자세한 내용은 아래 링크를 참조할 수 있다.

VCPKG를 이용해 GSL 라이브러리를 설치하는 명령어는 아래와 같다.
패키지 이름은 gsl이며 뒤에 옵션은 사용 환경에 따라 달라진다.
여기서는 windows용 64bit 환경의 라이브러리를 설치한다.

.\vcpkg install gsl:x64-windows

GSL을 이용한 Wavelet transforms

Example:

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_sort.h>
#include <gsl/gsl_wavelet.h>

#include <random>
#include <functional>

int main(int argc, char **argv)
{
    (void)(argc); /* avoid unused parameter warning */
    int i, n = 256, nc = 20;
    double *orig_data = (double*)malloc(n * sizeof(double));
    double *data = (double*)malloc(n * sizeof(double));
    double *abscoeff = (double*)malloc(n * sizeof(double));
    size_t *p = (size_t*)malloc(n * sizeof(size_t));

    gsl_wavelet *w;
    gsl_wavelet_workspace *work;

    std::mt19937 engine(100);		// Fixed seed
    std::uniform_real_distribution<> distribution;
    auto generator = bind(distribution, engine);

    w = gsl_wavelet_alloc(gsl_wavelet_daubechies, 4);
    work = gsl_wavelet_workspace_alloc(n);

    for (i = 0; i < n; i++)
    {
        orig_data[i] = generator();
        data[i] = orig_data[i];
    }

    gsl_wavelet_transform_forward(w, data, 1, n, work);

    for (i = 0; i < n; i++)
    {
        abscoeff[i] = fabs(data[i]);
    }

    gsl_sort_index(p, abscoeff, 1, n);

    for (i = 0; (i + nc) < n; i++)
        data[p[i]] = 0;

    gsl_wavelet_transform_inverse(w, data, 1, n, work);

    for (i = 0; i < n; i++)
    {
        printf("%g %g\n", orig_data[i], data[i]);
    }

    gsl_wavelet_free(w);
    gsl_wavelet_workspace_free(work);

    free(data);
    free(orig_data);
    free(abscoeff);
    free(p);

    return 0;
}

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

div#stuning-header .dfd-stuning-header-bg-container {background-image: url(https://tech.sangron.com/wp-content/uploads/sites/2/2018/11/cpp_wallpaper_background.jpg);background-color: #3f3f3f;background-size: cover;background-position: top center;background-attachment: initial;background-repeat: no-repeat;}#stuning-header div.page-title-inner {min-height: 350px;}