# 샘플 데이터로의 변환 적용

웨이블릿 변환을 1차원 신호 처리에 적용하기 위해서는 먼저 샘플 데이터를 선택하고, 그 데이터에 대해 적절한 변환을 수행해야 한다. 이 과정은 특정 목적에 따라 다를 수 있으며, 예를 들어 신호 압축이나 노이즈 제거를 목적으로 할 수 있다. 본 절에서는 샘플 데이터에 웨이블릿 변환을 적용하는 단계와 그에 따른 수학적 배경을 엄밀하게 설명한다.

#### 웨이블릿 변환 적용의 일반적인 과정

1차원 신호 $\mathbf{x} = { x\_1, x\_2, \dots, x\_N }$에 대해 웨이블릿 변환을 적용하는 과정은 주로 다음의 절차를 포함한다.

1. **신호 선택**: 신호 $\mathbf{x}$는 시간 도메인에서의 샘플로 구성된다. 예를 들어, 오디오 신호라면 일정 시간 동안 수집한 샘플 데이터가 될 수 있다.
2. **스케일 및 변환 선택**: 웨이블릿 변환은 특정 스케일 $\mathbf{a}$와 위치 $\mathbf{b}$에서 신호를 분석한다. 스케일은 신호의 저주파와 고주파 성분을 구분하며, 이 때의 변환은 다음과 같이 정의된다.

$$
W\_{\mathbf{a}, \mathbf{b}} = \int\_{-\infty}^{\infty} \mathbf{x}(t) \cdot \psi\left(\frac{t - \mathbf{b}}{\mathbf{a}}\right) dt
$$

여기서 $\psi$는 선택된 웨이블릿 함수이며, $\mathbf{a}$와 $\mathbf{b}$는 각각 스케일과 시간 변위이다.

#### 웨이블릿 변환에 적합한 샘플 데이터 특성

웨이블릿 변환을 통한 샘플 데이터의 분석은 특히 비정상(non-stationary) 신호에서 유용하다. 이러한 신호는 시간에 따라 주파수 성분이 변하는 특성을 가지므로, 웨이블릿 변환의 다중 해상도 특성을 잘 반영할 수 있다. 예를 들어, 다음과 같은 샘플 데이터가 웨이블릿 변환에 적합한다.

* **진동 신호**: 고속 진동 신호나 낮은 진동 성분을 포함하는 샘플 데이터
* **오디오 신호**: 사람이 들을 수 있는 주파수 영역에서 다양한 주파수 성분이 시간에 따라 변화하는 오디오 데이터
* **생체 신호**: 심전도(ECG)와 같은 비정상 생체 신호

#### 실질적인 변환 단계

**1. 다중 해상도 분석 수행**

샘플 데이터 $\mathbf{x}$에 대해 다중 해상도 분석(Multi-resolution Analysis, MRA)을 수행하여 다양한 해상도로 신호를 분해한다. 이 과정은 고주파 성분과 저주파 성분을 분리하는 것을 포함하며, 신호의 특성을 파악하는 데 유용하다. 다중 해상도 분석을 통해 신호를 레벨 $j$에서 저주파 성분 $\mathbf{A}\_j$와 고주파 성분 $\mathbf{D}\_j$로 분해할 수 있다.

$$
\mathbf{x} = \mathbf{A}*j + \sum*{k=1}^j \mathbf{D}\_k
$$

**2. 특정 레벨에서의 필터링 및 재구성**

각 분해 레벨에서 얻은 저주파 및 고주파 성분은 필터링 과정을 거쳐 재구성할 수 있다. 이 필터링은 주로 웨이블릿 필터 $\mathbf{h}$와 스케일링 필터 $\mathbf{g}$를 사용하여 수행되며, 각각 저주파 성분과 고주파 성분을 추출한다. 이때 필터의 적용은 다음과 같이 수식화할 수 있다.

* 저주파 성분 추출:

$$
\mathbf{A}\_{j+1}\[n] = \sum\_k \mathbf{h}\[k] \cdot \mathbf{A}\_j\[n - k]
$$

* 고주파 성분 추출:

$$
\mathbf{D}\_{j+1}\[n] = \sum\_k \mathbf{g}\[k] \cdot \mathbf{A}\_j\[n - k]
$$

#### 구현 예시

1차원 신호 $\mathbf{x}$에 대해 위의 과정에 따라 특정 스케일의 웨이블릿 변환을 적용한 후, 필터링된 저주파 및 고주파 성분을 재구성할 수 있다. C++ 코드에서 이 과정을 구현할 때는 기본적인 필터링 알고리즘을 사용해 신호를 분리할 수 있다.

#### 필터링 및 재구성 과정의 C++ 구현

샘플 데이터 $\mathbf{x}$에 대해 웨이블릿 변환을 수행하고 필터링을 적용하기 위해, 일반적으로 두 가지 필터 $\mathbf{h}$와 $\mathbf{g}$를 사용하는 C++ 코드 예시를 설명한다. 이때 필터 $\mathbf{h}$는 저주파 성분을, $\mathbf{g}$는 고주파 성분을 추출한다.

**3. 필터의 설계 및 적용**

필터 $\mathbf{h}$와 $\mathbf{g}$는 주로 Haar 또는 Daubechies 웨이블릿과 같은 고정된 커널을 기반으로 설계된다. 각 필터는 특정 스케일에 맞추어 신호의 주파수 성분을 조정하며, 이를 적용하여 저주파 및 고주파 성분을 추출한다. 다음은 C++에서 필터링을 적용하는 과정의 간단한 예시이다.

```cpp
#include <vector>

// 예시: Haar 웨이블릿 필터 커널
std::vector<float> h = { 0.5, 0.5 };  // 저주파 필터
std::vector<float> g = { 0.5, -0.5 }; // 고주파 필터

// 필터 적용 함수
void applyFilter(const std::vector<float>& input, std::vector<float>& lowPass, std::vector<float>& highPass) {
    int len = input.size();
    lowPass.resize(len / 2);
    highPass.resize(len / 2);

    for (int i = 0; i < len / 2; i++) {
        lowPass[i] = input[2 * i] * h[0] + input[2 * i + 1] * h[1];
        highPass[i] = input[2 * i] * g[0] + input[2 * i + 1] * g[1];
    }
}
```

위 코드에서는 벡터 `input`에 저장된 원본 신호를 필터링하여 `lowPass`와 `highPass` 벡터에 각각 저주파 및 고주파 성분을 저장한다. 이 필터링 과정을 반복하여 원하는 해상도 수준까지 신호를 분해할 수 있다.

**4. 신호 재구성**

필터링된 저주파 및 고주파 성분을 바탕으로 원본 신호를 재구성하기 위해, 각 분해 레벨에서 역 웨이블릿 변환을 수행한다. 이 과정은 기본적으로 분해 과정의 역순으로 필터를 적용하여 수행되며, 다음과 같은 수식으로 표현된다.

$$
\mathbf{x}\[n] = \sum\_k \left( \mathbf{h}\[k] \cdot \mathbf{A}\_j\[n - k] + \mathbf{g}\[k] \cdot \mathbf{D}\_j\[n - k] \right)
$$

C++에서 이 재구성 과정을 구현하는 간단한 코드는 다음과 같다.

```cpp
// 신호 재구성 함수
void reconstructSignal(const std::vector<float>& lowPass, const std::vector<float>& highPass, std::vector<float>& output) {
    int len = lowPass.size() * 2;
    output.resize(len);

    for (int i = 0; i < len / 2; i++) {
        output[2 * i] = lowPass[i] * h[0] + highPass[i] * g[0];
        output[2 * i + 1] = lowPass[i] * h[1] + highPass[i] * g[1];
    }
}
```

이 코드는 필터링된 저주파 및 고주파 성분을 사용하여 `output` 벡터에 재구성된 신호를 저장한다. 이러한 재구성 과정은 각 분해 수준에서 반복 수행될 수 있다.

#### 샘플 데이터 적용 결과의 해석

이와 같은 웨이블릿 변환과 필터링을 통해 얻은 저주파 및 고주파 성분은 샘플 데이터의 주파수 성분을 보다 명확하게 구분하는 데 유용하다. 예를 들어, 저주파 성분은 주로 신호의 전반적인 트렌드를 나타내며, 고주파 성분은 신호 내 급격한 변화나 노이즈를 반영하는 특성을 갖는다. 이를 통해 샘플 데이터의 특정 부분을 강조하거나 노이즈를 제거하는 처리를 수행할 수 있다.

이와 같이 웨이블릿 변환을 사용하여 샘플 데이터를 분해하고 분석하는 과정을 통해 다양한 응용이 가능하며, 특히 신호의 특징을 세밀하게 분석할 수 있다.
