에너지 연산자의 이론적 배경
에너지 연산자(Energy Operator)는 신호의 순간적 특성(순간 진폭, 주파수, 위상 등)을 추출하기 위해 사용되는 비선형 미분 연산자입니다. 음성 신호 처리, 기계적 결함 진단, 생체 의학 신호 분석 등 다양한 분야에서 활용되며, 그중에서도 Teager-Kaiser 에너지 연산자(TKEO)가 가장 널리 사용됩니다.
1. 연속 및 이산 신호에서의 TKEO
연속 시간 신호 \(x(t)\)에 대한 Teager-Kaiser 에너지 연산자는 다음과 같이 정의됩니다.
\[ \Psi[x(t)] = \left( \frac{dx(t)}{dt} \right)^2 - x(t) \frac{d^2x(t)}{dt^2} \]
이는 특정 시점 \(t\)에서의 '순간 에너지'를 나타내며, 신호의 1차 도함수(변화율)와 2차 도함수(곡률)에 기반합니다. 단주파 정현파 \(x(t) = A\cos(\omega t + \phi)\)의 경우, 연산자 적용 시 포락선은 \(A^2\omega^2\)가 되어 신호의 에너지 수준을 반영합니다.
디지털 시스템에서는 이산 시퀀스 \(x(n)\)를 다루므로 도함수를 차분(Difference)으로 근사화합니다. 가장 보편적으로 사용되는 중심 차분(Central Difference) 기반의 이산 TKEO 수식은 다음과 같습니다.
\[ \Psi[x(n)] = x^2(n) - x(n-1)x(n+1) \]
이 형태는 인접한 세 개의 샘플만으로 계산이 가능하여 연산 효율이 매우 높습니다.
2. 경계 조건 처리
이산 신호의 시작점과 끝점(\(n=0\) 또는 \(n=N-1\))에서는 이전 또는 다음 샘플이 존재하지 않으므로 별도의 경계 처리가 필요합니다.
- 영 채움(Zero-padding): 경계 밖의 값을 0으로 설정 (\(x(-1)=0, x(N)=0\))
- 경계 복제(Replication): 가장자리 값을 그대로 복사 (\(x(-1)=x(0), x(N)=x(N-1)\))
- 대칭 확장(Symmetric Extension): 경계를 기준으로 대칭되도록 값 할당 (\(x(-1)=x(1)\))
MATLAB을 활용한 알고리즘 구현
1. 기본 1D TKEO (벡터화 적용)
반복문(Loop)을 사용하는 대신 MATLAB의 배열 인덱싱을 활용한 벡터화 연산을 적용하여 계산 속도를 최적화한 기본 1차원 TKEO 구현입니다.
function energy_out = compute_tkeo_1d(input_sig)
% 1차원 Teager-Kaiser 에너지 연산자 (벡터화 버전)
% input_sig: 입력 신호 (벡터)
% energy_out: 계산된 에너지 시퀀스
sig_col = input_sig(:); % 열 벡터로 강제 변환
% 경계 처리: 양 끝에 0을 추가 (Zero-padding)
padded_sig = [0; sig_col; 0];
% 배열 슬라이싱을 통한 벡터화 계산
x_current = padded_sig(2:end-1);
x_prev = padded_sig(1:end-2);
x_next = padded_sig(3:end);
% TKEO 수식 적용
energy_out = x_current.^2 - x_prev .* x_next;
end
2. 노이즈 저항성을 위한 정규화 TKEO
기본 TKEO는 고주파 노이즈에 민감하여 가짜 에너지 피크를 생성할 수 있습니다. 이를 완화하기 위해 신호의 국부적 에너지 합으로 나누어 정규화(Normalization)를 수행합니다.
\[ \Psi_{\text{norm}}[x(n)] = \frac{x^2(n) - x(n-1)x(n+1)}{x^2(n) + x^2(n-1) + x^2(n+1)} \]
function norm_energy = compute_normalized_tkeo(input_sig)
% 정규화된 TKEO (노이즈 영향 최소화)
sig_col = input_sig(:);
padded = [0; sig_col; 0];
x_c = padded(2:end-1);
x_p = padded(1:end-2);
x_n = padded(3:end);
numerator = x_c.^2 - x_p .* x_n;
denominator = x_c.^2 + x_p.^2 + x_n.^2;
% 분모가 0이 되는 것을 방지하기 위해 eps 추가
norm_energy = numerator ./ (denominator + eps);
end
3. 2D 이미지 엣지 검출 연산자
TKEO를 2차원 이미지 \(I(m,n)\)로 확장하면 수평 및 수직 방향의 에너지 변화를 통해 엣지(윤곽선)를 검출할 수 있습니다. 이중 반복문 대신 행렬 시프팅(Matrix Shifting) 기법을 사용하여 연산 효율을 극대화했습니다.
function edge_magnitude = detect_edges_2d_tkeo(img_matrix)
% 2차원 TKEO를 활용한 이미지 엣지 검출
% img_matrix: 2D 그레이스케일 행렬
% 경계 복제 패딩 적용
padded_img = padarray(img_matrix, [1, 1], 'replicate');
% 중심 및 주변 픽셀 행렬 추출
center = padded_img(2:end-1, 2:end-1);
% 수평 방향 이동 행렬
left = padded_img(2:end-1, 1:end-2);
right = padded_img(2:end-1, 3:end);
psi_h = center.^2 - left .* right;
% 수직 방향 이동 행렬
up = padded_img(1:end-2, 2:end-1);
down = padded_img(3:end, 2:end-1);
psi_v = center.^2 - up .* down;
% 총 에너지 산출 및 [0, 1] 범위로 정규화
edge_magnitude = sqrt(psi_h.^2 + psi_v.^2);
edge_magnitude = edge_magnitude / max(edge_magnitude(:));
end
실제 신호 처리 적용 사례
1. 정현파 신호의 순간 에너지 추출
단일 주파수를 갖는 정현파 신호에 TKEO를 적용하여 순간 에너지 포락선을 추출하는 예제입니다.
% 테스트 신호 생성
sample_rate = 200;
time_vec = 0:1/sample_rate:1-1/sample_rate;
target_freq = 15;
test_signal = 3 * sin(2 * pi * target_freq * time_vec);
% TKEO 연산 수행
extracted_energy = compute_tkeo_1d(test_signal);
% 결과 시각화
figure;
subplot(2,1,1); plot(time_vec, test_signal, 'LineWidth', 1.2);
title('Original 15Hz Sinusoidal Signal'); grid on;
subplot(2,1,2); plot(time_vec, extracted_energy, 'r', 'LineWidth', 1.2);
title('Extracted Instantaneous Energy via TKEO'); grid on;
2. 처프(Chirp) 신호의 순간 주파수 추적
시간에 따라 주파수가 선형적으로 증가하는 처프 신호에서 TKEO 에너지 포락선을 통해 주파수 변화 추이를 추적합니다.
% 선형 처프 신호 생성
fs = 250; t = 0:1/fs:2-1/fs;
f0 = 10; f1 = 40;
chirp_sig = sin(2*pi*(f0*t + 0.5*(f1-f0)*t.^2/2));
% 에너지 연산 및 포락선 추출
chirp_energy = compute_tkeo_1d(chirp_sig);
[env, ~] = envelope(chirp_energy, 60, 'peak');
% 시각화
figure;
plot(t, chirp_sig, 'b', 'DisplayName', 'Chirp Signal'); hold on;
plot(t, env/max(env), 'r--', 'LineWidth', 2, 'DisplayName', 'TKEO Envelope');
title('Instantaneous Frequency Tracking using TKEO Envelope');
xlabel('Time (s)'); ylabel('Normalized Amplitude');
legend('Location', 'best'); grid on;
3. 그레이스케일 이미지의 윤곽선 검출
2차원 에너지 연산자를 사용하여 이미지 내의 객체 경계면을 강조하는 예제입니다.
% 이미지 로드 및 전처리
original_img = imread('cameraman.tif');
img_double = im2double(original_img);
% 2D TKEO 엣지 검출 적용
detected_edges = detect_edges_2d_tkeo(img_double);
% 결과 비교 출력
figure;
subplot(1,2,1); imshow(img_double); title('Original Grayscale Image');
subplot(1,2,2); imshow(detected_edges, []); title('Edge Map via 2D TKEO');
성능 최적화 및 실무 고려사항
1. 노이즈 취약점 보완
TKEO는 미분 연산의 특성상 고주파 노이즈를 증폭시키는 경향이 있습니다. 이를 해결하기 위해 연산자를 적용하기 전에 버터워스(Butterworth) 저역통과필터(LPF)를 사용하여 신호를 평활화하거나, 앞서 구현한 정규화 TKEO를 사용하는 것이 권장됩니다. 또한, 가중치 \(a, b\)를 도입한 \(\Psi[x(n)] = a x^2(n) - b x(n-1)x(n+1)\) 형태를 실험해 볼 수 있습니다.
2. 다중 성분 신호의 분리
여러 주파수 성분이 혼합된 신호(\(x(n) = A_1\sin(\omega_1 n) + A_2\sin(\omega_2 n)\))에 TKEO를 직접 적용하면 교차 변조(Cross-modulation) 항이 발생하여 정확한 에너지 추출이 어렵습니다. 이 경우, 경험적 모드 분해(EMD) 또는 변분 모드 분해(VMD)와 같은 신호 분해 기법을 먼저 적용하여 단일 성분(IMF)으로 분리한 뒤, 각 성분에 개별적으로 TKEO를 적용해야 합니다.