# 시간-주파수 해상도 간단 예시

시간-주파수 해상도를 살펴보기 위해 간단한 신호 예시를 생각한다. 어떤 신호 $x(t)$가 매우 짧은 시간 구간에서만 고주파 성분을 포함하고, 나머지 구간에서는 비교적 저주파 성분이 일정하게 존재한다고 가정한다. 일반적인 푸리에 변환은 전체 구간에 대한 주파수 스펙트럼을 제공하지만, 특정 시간 구간에서 고주파 성분이 어떻게 나타나는지에 대한 정보는 제공하지 않는다. 이와 달리 웨이블릿 변환에서는 파동 모양의 모함수 $\psi(t)$를 스케일과 위치를 변화시키며 신호와 내적을 취함으로써 특정 시간 구간에 국한된 주파수 특성을 얻을 수 있다.

웨이블릿 변환을 수학적으로 표현하면 $W\_{\psi}(a, b)$ 형태로 나타낸다. 스케일 변수 $a$는 주파수 대역에 대응하며, 시간 변수 $b$는 변환 창이 신호 상에서 어떤 위치를 중심으로 잡히는지를 결정한다. 예시는 다음과 같다.

$$
W\_{\psi}(a, b) = \int\_{-\infty}^{\infty} x(t) \frac{1}{\sqrt{a}} \psi\Bigl(\frac{t - b}{a}\Bigr) , dt
$$

이 방식으로 얻는 시간-주파수 평면(time-frequency plane) 상에서, $a$가 작은 경우에는 시간축으로 매우 짧게 모함수가 국소화되어 고주파 성분을 정밀하게 파악할 수 있다. 반대로 $a$가 크면 모함수의 폭이 넓어져 저주파 분석에 유리하지만 시간축 해상도는 떨어지게 된다. 이렇게 스케일 파라미터를 변화시키며 얻은 변환 계수를 통해, 신호의 시간 구간별 주파수 에너지를 관찰할 수 있다.

아래 그림은 단순화한 시간-주파수 해상도를 예시적으로 나타낸 것이다.

{% @mermaid/diagram content="flowchart LR
A(짧은 윈도우<br>높은 주파수<br>좋은 시간 해상도) --> B(긴 윈도우<br>낮은 주파수<br>좋은 주파수 해상도)" %}

신호가 특정 시점에서 급격하게 변화하고 이때 고주파 성분이 집중적으로 나타난다면, 작은 스케일 $a$를 활용한 웨이블릿 변환으로 그 부분을 효과적으로 포착할 수 있다. 긴 스케일에서는 시간 해상도가 낮아지지만 전체적으로 어떤 저주파 구조가 긴 시간 간격에서 어떻게 형성되는지 파악할 수 있다. 이는 고정된 창을 사용하는 단시간 푸리에 변환과 달리 스케일이 다변하는 창을 사용하기 때문에 가능한 방식이다.

#### 시간-주파수 해상도 간단 예시 (계속)

파형 분석에서 시간 해상도와 주파수 해상도는 상호 견제 관계에 놓여 있다. 특정 구간에서 신호가 급격히 변할 때, 푸리에 변환은 주파수 성분에 대한 전체 스펙트럼만 제공하기 때문에 그 변화가 어느 시점에서 일어났는지를 분명히 보여주지 못한다. 단시간 푸리에 변환(STFT)에서는 윈도우 함수를 고정해 놓고 이동하면서 푸리에 변환을 수행하기 때문에 시간 해상도와 주파수 해상도가 동시에 제한을 받는다.

웨이블릿 변환에서는 모함수의 스케일링을 통해 좁은 구간에서의 높은 주파수 현상을 더욱 세밀하게 포착할 수 있고, 넓은 구간에서는 저주파 특성을 포괄적으로 살펴볼 수 있다. 이를 좀 더 수학적으로 이해하기 위해, STFT와 웨이블릿 변환의 변환 창(window)의 차이를 비교한다. STFT에서 윈도우 함수를 $g(t)$라고 할 때, STFT는 아래와 같은 꼴로 표현된다.

$$
X(\tau, \omega) = \int\_{-\infty}^{\infty} x(t),g(t - \tau), e^{-j \omega t},dt
$$

여기서 $g(t - \tau)$는 단 하나의 고정된 형태를 갖는 윈도우이며, $\tau$ 방향으로만 평행 이동된다. 반면 웨이블릿 변환에서는 모함수 $\psi$가 스케일 $a$에 따라 축소 또는 확장되므로, 주파수 해상도와 시간 해상도가 스케일에 의존적이다.

아래는 간단히 시간축과 스케일(주파수) 축에서 변환 창이 변화하는 모습을 직관적으로 나타낸 것이다.

{% @mermaid/diagram content="flowchart LR
A(규모가 작은 모함수<br>짧은 시간 구간<br>고주파 분석에 유리) --> B(규모가 큰 모함수<br>긴 시간 구간<br>저주파 분석에 유리)" %}

웨이블릿 변환에서는 신호의 짧은 구간에서 큰 변화를 보이는 구간을 높은 해상도로 포착하기 위해 작은 스케일을 사용한다. 이렇게 작은 스케일에서의 변환 창은 시간축으로 매우 좁기 때문에, 신호가 아주 짧은 시간 동안 발생시키는 고주파 성분에 민감하게 반응한다. 반대로, 신호가 서서히 변하면서 큰 스케일의 구조를 지닌다면, 스케일 $a$를 크게 하여 넓은 시간 구간을 관찰하는 것이 더 유용하다.

#### 시간-주파수 해상도 간단 예시 (계속)

두 가지 다른 종류의 신호를 가정해 본다. 하나는 비교적 일정한 저주파 구성으로 이루어져 있고, 다른 하나는 짧은 시간 동안만 나타나는 고주파 펄스 형태 신호라고 하자. 이 두 신호가 합쳐져서 생성된 합성 신호를 $x(t)$로 표현한다. 일반적인 푸리에 변환으로 $x(t)$를 분석하면, 고주파 펄스가 존재한다는 사실을 주파수 도메인 전체 스펙트럼에서 확인할 수 있지만, 그 펄스가 정확히 어느 시점에서 나타났는지는 명확하게 알기 어렵다.

웨이블릿 변환은 시간축에서 특정 위치 $b$를 중심으로 모함수 $\psi$를 스케일 $a$에 맞추어 변화시키며 변환 계수를 계산한다. 작은 스케일에서는 모함수가 시간축으로 짧게 국소화되므로, 고주파 펄스가 발생하는 시점을 더 정교하게 포착할 수 있다. 큰 스케일에서는 모함수가 시간축으로 넓게 펼쳐지므로, 저주파 기반의 긴 시간 변화를 잘 포착할 수 있다.

신호 $x(t) = x\_{\text{low}}(t) + x\_{\text{pulse}}(t)$를 예시로 든다면, $x\_{\text{low}}(t)$는 긴 구간에 걸쳐 서서히 변하는 신호이고, $x\_{\text{pulse}}(t)$는 특정 구간에 국소화된 짧은 펄스 형태 신호다. 푸리에 변환 $X(\omega)$는 이 합성 신호에 대한 전체 주파수 스펙트럼을 보여주지만, 시간 축에서 어떠한 구간에서 $x\_{\text{pulse}}(t)$가 강하게 나타나는지는 명확히 드러나지 않는다.

웨이블릿 변환 계수 $W\_{\psi}(a, b)$를 시간-주파수(혹은 시간-스케일) 평면에 매핑하면, $b$ 축에서 $x\_{\text{pulse}}(t)$가 등장하는 구간을 선명하게 구분하고, 동시에 $a$ 축에서 해당 신호의 주파수 대역(스케일)에 따른 에너지 분포를 확인할 수 있다. 이는 다음과 같은 Python 예시 코드로 간단히 시뮬레이션해 볼 수 있다.

```python
import numpy as np
import pywt
import matplotlib.pyplot as plt

t = np.linspace(0, 1, 1000)
x_low = np.sin(2 * np.pi * 5 * t)  # 예: 5Hz 정현파
x_pulse = np.zeros_like(t)
x_pulse[300:320] = 1.0            # 짧은 구간의 펄스
x = x_low + x_pulse

scales = np.arange(1, 128)
coeffs, freqs = pywt.cwt(x, scales, 'morl', sampling_period=1/1000)

plt.imshow(np.abs(coeffs),
           extent=[t[0], t[-1], scales[-1], scales[0]],
           aspect='auto', cmap='jet')
plt.title("Wavelet Transform of x(t)")
plt.ylabel("Scale")
plt.xlabel("Time (s)")
plt.show()
```

이 코드에서는 `pywt.cwt` 함수를 통해 모함수 `'morl'`(Morlet 웨이블릿)을 사용하여 연속 웨이블릿 변환(CWT)을 수행한다. `scales` 배열을 작게 설정할수록 시간축 해상도가 높아져 고주파 성분을 잘 포착하고, 크게 설정할수록 저주파 성분의 변화를 넓은 구간에서 살펴볼 수 있다.

#### 시간-주파수 해상도 간단 예시 (계속)

고전적인 주파수 해석 관점에서는 시간축 정보를 무시하고 전체 신호에 대한 주파수 성분을 얻어낸다. 이런 방식은 신호가 전역적으로 어떠한 주파수로 구성되어 있는지는 알려주지만, 각 주파수 성분이 시간축에서 어떻게 분포되어 있는지를 바로 보여주지는 않는다. 웨이블릿 변환은 특정 시간 인접 구간에서의 신호 구조를 파악할 수 있도록 설계된 도구다. 스케일 파라미터가 커질수록 모함수의 폭이 커지기 때문에 시간축에 대한 분해능은 떨어지지만 주파수 축 해상도는 상대적으로 좋아진다. 반면 스케일 파라미터가 작아질수록 시간축에 대한 분해능이 좋아지며 짧은 구간에서 발생하는 국소적 변화를 잘 포착한다.

이러한 특성은 신호가 비정상(non-stationary)하거나 시간에 따라 특성이 급변하는 경우에 유용하다. 예를 들어, 지진파나 음성 신호처럼 특정 구간에서 큰 변동이 발생하는 경우, 작은 스케일의 모함수를 이용해 그 구간에서 발생하는 급격한 변화를 검출할 수 있다. 상대적으로 오랜 시간 구간에 걸쳐 나타나는 주파수 성분을 확인하려면 더 큰 스케일로 분석하여 전체 흐름과 구조를 살펴볼 수 있다.

신호 해석을 위한 시간-주파수 해상도는 헤이젠베르크 부등식(Heisenberg’s uncertainty principle)과 유사한 개념으로 설명된다. 시간축과 주파수축(또는 스케일 축)의 분해능은 동시에 무한정 높일 수 없기 때문에, 웨이블릿 변환에서는 스케일 파라미터에 따라 이러한 분해능의 균형점을 유연하게 조정한다. 특정 상황에서 주파수 해상도보다 시간 해상도가 중요한 경우에는 작은 스케일 중심으로 세밀한 분석을 수행하고, 반대로 시간 해상도보다 주파수 해상도가 중요한 경우에는 큰 스케일 쪽을 집중적으로 살펴보는 방식이다.

아래의 단순한 그림은 모함수의 스케일 변화에 따른 시간축 길이 변화를 직관적으로 나타낸다.

{% @mermaid/diagram content="flowchart LR
subgraph 시간축
T1(모함수 폭이 작은 경우) --> T2(모함수 폭이 큰 경우)
end
subgraph 주파수 또는 스케일 축
F1(높은 주파수 대역) --> F2(낮은 주파수 대역)
end" %}

이때 모함수는 단 한 종류로 고정되지만, 스케일과 시간 위치를 변화시켜 신호 전 구간을 분석한다. 그 결과로 얻어지는 변환 계수는 시간축과 스케일 축에서의 에너지 분포를 종합적으로 보여준다. 실제 계산 과정에서는 연속 웨이블릿 변환(CWT)을 그대로 사용하기보다는, 필터뱅크 구조를 갖는 이산 웨이블릿 변환(DWT)을 활용해 데이터 길이에 맞는 빠른 계산을 수행하기도 한다.

#### 시간-주파수 해상도 간단 예시 (계속)

비정상 신호를 더 구체적으로 살펴보기 위해, 시간에 따라 주파수가 서서히 변하는 이른바 첩(chirp) 신호를 예시로 들어볼 수 있다. 첩 신호는 특정 시간 구간에서 주파수가 일정하지 않고 연속적으로 변하는 신호이므로, 전통적인 푸리에 변환만으로는 시간축에서의 주파수 변화를 뚜렷이 관찰하기 어렵다. 웨이블릿 변환을 통해 첩 신호를 분석하면, 시간에 따른 주파수 증가(또는 감소) 양상을 스케일 축에 대응시켜 시각적으로 확인할 수 있다.

연속 웨이블릿 변환(CWT)을 활용하여 0초부터 1초까지 선형적으로 주파수가 변하는 첩 신호를 간단히 시뮬레이션해 볼 수 있다. 다음 Python 예시 코드를 참조한다.

```python
import numpy as np
import matplotlib.pyplot as plt
import pywt

fs = 1000
t = np.linspace(0, 1, fs, endpoint=False)

# 시작 주파수 10Hz, 종료 주파수 100Hz로 선형 증가시키는 첩 신호
f0 = 10
f1 = 100
phi = 2 * np.pi * (f0 * t + (f1 - f0) / 2 * t**2)
x_chirp = np.sin(phi)

# 연속 웨이블릿 변환 수행
scales = np.arange(1, 128)
coeffs, freqs = pywt.cwt(x_chirp, scales, 'morl', sampling_period=1/fs)

plt.imshow(np.abs(coeffs),
           extent=[t[0], t[-1], scales[-1], scales[0]],
           aspect='auto', cmap='jet')
plt.title("Wavelet Transform of Chirp Signal")
plt.ylabel("Scale")
plt.xlabel("Time (s)")
plt.show()
```

위 첩 신호는 시간에 따라 주파수가 점차 증가하기 때문에, 웨이블릿 변환 계수를 시간축으로 펼쳐보면 낮은 스케일(고주파 영역)에서의 에너지가 시간이 지남에 따라 조금씩 강해지는 형상을 관찰할 수 있다. 스케일 값이 작을수록 웨이블릿 함수를 더 많이 축소한 형태가 되므로 고주파 성분을 주로 보여주게 되고, 스케일 값이 커질수록 웨이블릿 함수가 넓게 펼쳐져 저주파 성분을 강조한다.

웨이블릿 변환에서 첩 신호의 시간-주파수 해상도가 어떻게 보이는지를 간단히 요약하면, 낮은 스케일 대역에서는 시간축에서 국소적 변화를 빠르게 추적하며 주파수가 순간적으로 높아지는 구간을 더 세밀히 나타낸다. 높은 스케일 대역에서는 전체적으로 서서히 변하는 신호 구조를 넓은 시간 구간에 걸쳐 보여주기 때문에, 주파수 상승 경향을 전반적으로 관찰하기에 적합하다.

이러한 예시는 웨이블릿 변환이 단순히 국소화된 펄스 신호를 탐지하는 데 유용할 뿐 아니라, 시간에 따라 주파수가 달라지는 비정상 신호에도 적합하다는 사실을 보여준다. 하나의 모함수 형태를 다양한 스케일과 시간 위치로 이동 및 축소·확장하여 신호와 내적을 취함으로써, 서로 다른 시간 구간에 대해 각기 다른 주파수 해상도로 분석이 가능하다는 점이 핵심이다.

#### 시간-주파수 해상도 간단 예시 (계속)

비교적 간단한 예시로, 계단 함수 형태의 불연속(discontinuous) 신호를 떠올릴 수 있다. 시간 축의 어느 지점에서 급격히 값이 바뀌는 신호를 푸리에 변환하면 전체 주파수 구간에 걸쳐 넓게 퍼진 스펙트럼 성분이 나타나지만, 그 불연속이 발생한 정확한 시간 지점을 식별하기는 어렵다. 웨이블릿 변환을 적용하면 시간축과 스케일 축을 아우르며, 모함수를 작은 스케일로 축소하여 급격한 변화가 발생한 지점을 세밀하게 포착할 수 있다. 큰 스케일로 확장했을 때는 불연속 부분을 세밀하게 구분하기는 힘들지만, 전반적인 저주파 구조나 전역적 변화를 큰 틀에서 살펴보기에 유리하다.

디지털 처리 관점에서는 이산 웨이블릿 변환(DWT)을 통해 필터뱅크 구조로 분석을 수행한다. 상향·하향 샘플링과 저주파·고주파 필터 쌍을 반복 적용함으로써, 신호가 다중 해상도 레벨에서 어떻게 구성되는지를 단계적으로 분해한다. 그 결과, 시간축 분할과 대역 분할을 함께 수행하여, 어떤 시간 구간에서 어떤 주파수(또는 스케일) 성분이 두드러지는지 비교적 적은 연산량으로 확인할 수 있다. 연속 웨이블릿 변환(CWT)의 무수히 많은 스케일을 모두 고려하지 않고, 2배씩 확장·축소되는 필터뱅크 계층 구조로 이산화(discretization)하는 방식이므로, 실제 구현과 신호 처리에서 이점이 크다.

이처럼 시간-주파수 해상도 문제를 해결하기 위해 고안된 웨이블릿 변환은, 모함수의 스케일링과 시프팅을 통해 비정상 신호나 불연속 신호를 효율적으로 분석한다. 시간축에서 특정 구간에 집중되는 에너지 분포를 파악하거나, 전체 구간에 걸친 저주파 구조를 한눈에 파악하는 데 모두 적용할 수 있다. 푸리에 변환에 비해 국소화가 가능하다는 점, STFT의 한정된 윈도우 크기에서 오는 해상도 타협을 극복한다는 점이 핵심적인 장점으로 꼽힌다.
