반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
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
Archives
Today
Total
관리 메뉴

폴크(FOLC)

치수 계산하기 - smooth filtering 8 본문

카테고리 없음

치수 계산하기 - smooth filtering 8

folcjin 2025. 6. 28. 10:39
728x90
반응형

Wavelet Denoising은 신호의 주파수와 시간 정보를 동시에 고려하여 노이즈를 제거하는 고급 기법

- 특히 경계(에지)를 보존하면서 노이즈를 억제하는 데 효과적이며, 의료 신호, 이미지, 음향 신호, 과학 데이터 등에 널리 사용됩니다.

Wavelet Denoising은 다음 세 단계로 수행됩니다:
1 단계 : Wavelet Transform: 입력 신호를 다중 해상도(다양한 주파수)로 분해.
2 단계 : Thresholding: 노이즈가 주로 포함된 세부 계수(detail coefficients)에 임계값을 적용해 제거.
3 단계 : Inverse Transform: 노이즈가 제거된 계수를 기반으로 신호를 복원.

1D Soft Thresholding:

 

예제

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

// Soft thresholding
double softThreshold(double val, double lambda) {
    if (std::abs(val) <= lambda) return 0.0;
    return (val > 0) ? (val - lambda) : (val + lambda);
}

// 1-Level Haar Wavelet Decomposition + Denoising + Reconstruction
std::vector<double> waveletDenoise(const std::vector<double>& signal, double lambda) {
    int N = signal.size();
    int half = N / 2;
    std::vector<double> approx(half), detail(half);

    // Haar Transform (decomposition)
    for (int i = 0; i < half; ++i) {
        approx[i] = (signal[2 * i] + signal[2 * i + 1]) / std::sqrt(2.0);
        detail[i] = (signal[2 * i] - signal[2 * i + 1]) / std::sqrt(2.0);
    }

    // Thresholding (soft)
    for (int i = 0; i < half; ++i) {
        detail[i] = softThreshold(detail[i], lambda);
    }

    // Inverse Haar Transform (reconstruction)
    std::vector<double> denoised(N);
    for (int i = 0; i < half; ++i) {
        denoised[2 * i]     = (approx[i] + detail[i]) / std::sqrt(2.0);
        denoised[2 * i + 1] = (approx[i] - detail[i]) / std::sqrt(2.0);
    }

    return denoised;
}

int main() {
    std::vector<double> signal = {1.2, 0.9, 1.1, 1.0, 10.0, 10.2, 9.9, 10.1}; // 신호 + 잡음
    double lambda = 0.5;

    std::vector<double> denoised = waveletDenoise(signal, lambda);

    std::cout << "Original vs Denoised:\n";
    for (size_t i = 0; i < signal.size(); ++i) {
        std::cout << "x[" << i << "] = " << signal[i]
                  << "\t=>\t" << denoised[i] << std::endl;
    }

    return 0;
}

728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --