Python SciPy

SciPy 신호 간 상관 분석

PyExplorer 2025. 3. 14. 09:59
728x90

SciPy 신호 간 상관 분석

1. 서론

신호 처리 분야에서 서로 다른 두 신호 간의 유사성을 분석하는 방법 중 하나는 상관 분석(correlation analysis)입니다. 상관 분석은 한 신호가 다른 신호와 얼마나 유사한지를 정량적으로 평가하는 방법으로, 특히 신호 정렬, 잡음 제거, 패턴 인식 등 다양한 분야에서 활용됩니다.

이 글에서는 Python의 SciPy 라이브러리를 활용하여 신호 간 상관 분석을 수행하는 방법을 상세히 다룹니다. 상관 분석의 기본 개념을 설명하고, 실제 예제를 통해 SciPy의 scipy.signal.correlatescipy.signal.correlate2d 함수를 사용하는 방법을 소개합니다.


2. 상관 분석의 기본 개념

상관 분석은 두 신호의 유사성을 측정하는 통계적 방법입니다. 일반적으로 사용되는 상관 계수는 다음과 같이 정의됩니다.

$$
R_{xy}(\tau) = \sum_{n} x(n) y(n-\tau)
$$

여기서,

  • $ x(n) $: 기준이 되는 첫 번째 신호
  • $ y(n) $: 비교 대상이 되는 두 번째 신호
  • $ \tau $: 시간 지연(shift) 값

이 값이 클수록 두 신호가 해당 지연에서 높은 유사성을 가진다는 의미입니다.

상관 분석은 다음과 같이 크게 두 가지로 나뉩니다.

  1. 자기 상관(Auto-correlation): 신호와 자기 자신 간의 상관 관계를 분석하는 방법입니다. 특정 주기성을 찾는 데 유용합니다.
  2. 교차 상관(Cross-correlation): 서로 다른 두 신호 간의 상관 관계를 분석하는 방법입니다.

3. SciPy를 이용한 상관 분석

3.1 필요 라이브러리 설치

SciPy는 Python의 표준 과학 계산 라이브러리 중 하나입니다. 다음과 같이 설치할 수 있습니다.

pip install scipy

3.2 상관 분석을 위한 기본 예제

다음은 SciPy의 signal.correlate 함수를 이용해 두 신호 간 상관 분석을 수행하는 예제입니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate

# 두 개의 샘플 신호 생성
x = np.sin(np.linspace(0, 2 * np.pi, 100))
y = np.roll(x, 10)  # x 신호를 10 샘플만큼 이동시킨 신호

# 상관 분석 수행
correlation = correlate(x, y, mode='full')
lag = np.arange(-len(x) + 1, len(x))

# 결과 시각화
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
plt.plot(x, label='신호 x')
plt.legend(loc='upper right')

plt.subplot(3, 1, 2)
plt.plot(y, label='신호 y (10 샘플 이동)')
plt.legend(loc='upper right')

plt.subplot(3, 1, 3)
plt.plot(lag, correlation, label='상관 계수')
plt.axvline(x=10, color='r', linestyle='--', label='최대 상관 위치')
plt.legend(loc='upper right')
plt.xlabel('지연 (샘플)')
plt.ylabel('상관 계수')
plt.tight_layout()
plt.show()

3.3 결과 분석

위의 예제에서 주요 포인트는 다음과 같습니다.

  • 신호 xy는 10 샘플만큼 시프트된 관계입니다.
  • 상관 분석 결과, 최대 상관 값이 지연 10에서 발생함을 확인할 수 있습니다.

4. 2차원 신호 상관 분석

scipy.signal.correlate2d는 이미지와 같은 2차원 데이터를 분석할 때 사용됩니다. 다음은 간단한 2D 상관 분석 예제입니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate2d

# 2D 신호 생성
x = np.zeros((10, 10))
x[3:6, 3:6] = 1

y = np.zeros((10, 10))
y[5:8, 5:8] = 1

# 상관 분석 수행
correlation = correlate2d(x, y, mode='full')

# 결과 시각화
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.imshow(x, cmap='gray')
plt.title('신호 x')

plt.subplot(1, 3, 2)
plt.imshow(y, cmap='gray')
plt.title('신호 y')

plt.subplot(1, 3, 3)
plt.imshow(correlation, cmap='hot')
plt.title('상관 분석 결과')
plt.colorbar()
plt.tight_layout()
plt.show()

4.1 결과 분석

이 예제에서 신호 xy는 위치만 다르고 형태는 동일한 2D 패턴입니다. 상관 분석 결과, 가장 높은 상관 계수가 두 패턴이 일치하는 지점을 정확히 식별하는 것을 확인할 수 있습니다.


5. 상관 분석의 실전 활용 사례

5.1 신호 정렬

상관 분석은 서로 다른 신호를 정렬하는 데 유용합니다. 특히, 지연을 식별하여 두 신호의 정확한 시작점을 맞출 때 사용됩니다.

5.2 잡음 제거

원본 신호와 노이즈가 포함된 신호 간의 상관 분석을 통해, 불필요한 잡음을 제거하고 신호를 복원할 수 있습니다.

5.3 패턴 인식

이미지 처리에서도 상관 분석은 특정 패턴을 탐지하는 데 활용됩니다. 예를 들어, 특정 물체를 이미지 내에서 찾을 때 2D 상관 분석을 사용합니다.


6. 결론

SciPy를 활용한 상관 분석은 신호 처리에서 필수적인 도구입니다. 이를 통해 두 신호 간의 유사성을 쉽게 분석하고, 다양한 실무 분야에서 활용할 수 있습니다. 특히 scipy.signal.correlatescipy.signal.correlate2d를 적절히 활용하면, 1차원 및 2차원 신호의 상관 관계를 효율적으로 분석할 수 있습니다.

728x90