Main Content

hilbert

힐베르트 변환을 사용한 이산시간 해석적 신호

설명

x = hilbert(xr)은 실수 데이터 시퀀스 xr에서 해석적 신호 x를 반환합니다. xr이 행렬이면 hilbert는 각 열에 대응되는 해석적 신호를 찾습니다.

예제

x = hilbert(xr,n)n개 점을 갖는 고속 푸리에 변환(FFT)을 사용하여 힐베르트 변환을 계산합니다. 입력 데이터는 길이 n에 맞게 적절하게 0으로 채워지거나 잘립니다.

예제

예제

모두 축소

시퀀스를 정의하고 hilbert를 사용하여 이 시퀀스의 해석적 신호를 계산합니다.

xr = [1 2 3 4]';
x = hilbert(xr)
x = 4×1 complex

   1.0000 + 1.0000i
   2.0000 - 1.0000i
   3.0000 - 1.0000i
   4.0000 + 1.0000i

x의 허수부는 xr의 힐베르트 변환이고, 실수부는 xr 그 자체입니다.

imx = imag(x)
imx = 4×1

     1
    -1
    -1
     1

rex = real(x)
rex = 4×1

     1
     2
     3
     4

x의 이산 푸리에 변환(DFT)의 마지막 절반은 0입니다. (이 예제에서 변환의 마지막 절반은 마지막 요소입니다.) fft(x)의 DC 요소와 나이퀴스트 요소는 순수 실수입니다.

dft = fft(x)
dft = 4×1 complex

  10.0000 + 0.0000i
  -4.0000 + 4.0000i
  -2.0000 + 0.0000i
   0.0000 + 0.0000i

hilbert 함수는 유한한 데이터 블록에 대해 정확한 해석적 신호를 구합니다. 또한 유한 임펄스 응답(FIR) 힐베르트 변환기 필터를 사용하여 허수부에 대한 근삿값을 계산하는 방법으로 해석적 신호를 생성할 수도 있습니다.

주파수가 203Hz, 721Hz, 1001Hz인 3개의 정현파로 구성된 시퀀스를 생성합니다. 이 시퀀스는 약 1초 동안 10kHz로 샘플링됩니다. hilbert 함수를 사용하여 해석적 신호를 계산합니다. 0.01초와 0.03초 사이의 해석적 신호를 플로팅합니다.

fs = 1e4;
t = 0:1/fs:1; 

x = 2.5 + cos(2*pi*203*t) + sin(2*pi*721*t) + cos(2*pi*1001*t);

y = hilbert(x);

plot(t,real(y),t,imag(y))
xlim([0.01 0.03])
legend('real','imaginary')
title('hilbert Function')
xlabel('Time (s)')

Figure contains an axes object. The axes object with title hilbert Function, xlabel Time (s) contains 2 objects of type line. These objects represent real, imaginary.

원래 시퀀스와 해석적 신호의 파워 스펙트럼 밀도에 대한 Welch 추정값을 계산합니다. 시퀀스를 길이가 256이며 해밍 윈도우가 적용된 겹치지 않는 조각으로 나눕니다. 음수 주파수에서는 해석적 신호가 전력을 가지지 않는 것을 확인합니다.

pwelch([x;y].',256,0,[],fs,'centered')
legend('Original','hilbert')

Figure contains an axes object. The axes object with title Power Spectral Density, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 2 objects of type line. These objects represent Original, hilbert.

designfilt 함수를 사용하여 60차 힐베르트 변환기 FIR 필터를 설계합니다. 천이 폭을 400Hz로 지정합니다. 필터의 주파수 응답을 시각화합니다.

fo = 60;

d = designfilt('hilbertfir','FilterOrder',fo, ...
       'TransitionWidth',400,'SampleRate',fs); 

freqz(d,1024,fs)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (kHz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

정현파 시퀀스에 필터를 적용하여 해석적 신호의 허수부에 대한 근삿값을 구합니다.

hb = filter(d,x);

필터의 군지연 grd는 필터 차수의 절반과 동일합니다. 이 지연을 보정합니다. 허수부의 처음 grd개 샘플과 실수부와 시간 벡터의 마지막 grd개 샘플을 제거합니다. 0.01초와 0.03초 사이의 결과를 플로팅합니다.

grd = fo/2;
   
y2 = x(1:end-grd) + 1j*hb(grd+1:end);
t2 = t(1:end-grd);

plot(t2,real(y2),t2,imag(y2))
xlim([0.01 0.03])
legend('real','imaginary')
title('FIR Filter')
xlabel('Time (s)')

Figure contains an axes object. The axes object with title FIR Filter, xlabel Time (s) contains 2 objects of type line. These objects represent real, imaginary.

해석적 신호 근삿값의 파워 스펙트럼 밀도(PSD)를 추정하고 이를 hilbert 결과와 비교합니다.

pwelch([y;[y2 zeros(1,grd)]].',256,0,[],fs,'centered')
legend('hilbert','FIR Filter')

Figure contains an axes object. The axes object with title Power Spectral Density, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 2 objects of type line. These objects represent hilbert, FIR Filter.

입력 인수

모두 축소

입력 신호로, 실수 값 벡터나 행렬로 지정됩니다. xr이 복소수이면 hilbert는 허수부를 무시합니다.

예: sin(2*pi*(0:15)/16)은 정현파의 한 기간을 지정합니다.

예: sin(2*pi*(0:15)'./[16 8])은 2채널 정현파 신호를 지정합니다.

데이터형: single | double

DFT 길이로, 양의 정수 스칼라로 지정됩니다.

데이터형: single | double

출력 인수

모두 축소

해석적 신호로, 벡터나 행렬로 반환됩니다.

세부 정보

모두 축소

해석적 신호

hilbert는 실수 데이터 시퀀스에서, 해석적 신호라고도 하는 복소수 나선형 시퀀스를 반환합니다.

해석적 신호 x = xr + jxi는 원래 데이터에 해당하는 실수부 xr과 힐베르트 변환을 포함하는 허수부 xi를 갖습니다. 허수부는 원래 실수 시퀀스에 90° 위상 변위를 적용한 것입니다. 따라서 사인은 코사인으로 변환되고, 반대로 코사인은 사인으로 변환됩니다. 힐베르트 변환된 계열은 원래 시퀀스와 동일한 진폭과 주파수 성분을 가집니다. 변환에는 원래 시퀀스의 위상에 따라 달라지는 위상 정보가 포함되어 있습니다.

힐베르트 변환은 시계열의 순시적 특성, 특히 진폭과 주파수를 계산하는 데 유용합니다. 순시 진폭은 복소 힐베르트 변환의 진폭이고, 순시 주파수는 순간 위상각의 시간 변화율입니다. 순수 정현파의 경우, 순시 진폭과 주파수가 일정합니다. 그러나 순시 위상은 톱니 모양으로 국소 위상각이 한 주기 동안 선형적으로 어떻게 변하는지를 반영냅니다. 정현파 혼합체의 경우, 특성은 단기적, 즉 국소적이어서 평균값이 2개 또는 3개 이하의 점에 걸쳐 있습니다. 예를 보려면 힐베르트 변환과 순시 주파수 항목을 참조하십시오.

참고 문헌 [1]에 최소 위상을 복원할 때 사용하는 콜모고로프(Kolmogorov) 방법에 대한 설명이 나와 있습니다. 이 방법은 시계열의 스펙트럼 밀도의 로그에 대한 힐베르트 변환을 수행합니다. 툴박스 함수 rceps를 통해 복원할 수 있습니다.

알고리즘

시퀀스 xr의 해석적 신호는 단측 푸리에 변환을 가집니다. 즉, 음수 주파수에 대해 이 변환은 0이 됩니다. 해석적 신호의 근삿값을 구하기 위해 hilbert는 입력 시퀀스의 FFT를 계산하고, 음수 주파수에 대응되는 이러한 FFT 계수를 0으로 바꾸고, 그 결과의 역 FFT를 계산합니다.

hilbert는 다음 4단계의 알고리즘을 사용합니다.

  1. 입력 시퀀스의 FFT를 계산하고 벡터 x에 결과를 저장합니다.

  2. 요소 h(i)가 다음과 같은 값을 가지는 벡터 h를 생성합니다.

    • i = 1, (n/2)+1의 경우 1

    • i = 2, 3, … , (n/2)의 경우 2

    • i = (n/2)+2, … , n의 경우 0

  3. xh의 요소별 곱을 계산합니다.

  4. 3단계에서 구한 시퀀스의 역 FFT를 계산하고 결과의 처음 n개 요소를 반환합니다.

이 알고리즘은 [2]에서 처음으로 소개되었습니다. 이 기법은 입력 신호 x가 유한한 데이터 블록인 것으로 가정합니다. 이러한 가정을 통해 함수가 x에서 중복된 스펙트럼 요소를 정확하게 제거할 수 있습니다. FIR 필터 방식을 기반으로 한 방법은 해석적 신호의 근삿값만 구할 수 있지만, 데이터에 대해 지속적으로 동작하는 강점이 있습니다. FIR 필터를 사용하여 계산된 힐베르트 변환에 대한 또 다른 예제는 Single-Sideband Amplitude Modulation 항목을 참조하십시오.

참고 문헌

[1] Claerbout, Jon F. Fundamentals of Geophysical Data Processing with Applications to Petroleum Prospecting. Oxford, UK: Blackwell, 1985.

[2] Marple, S. L. “Computing the Discrete-Time Analytic Signal via FFT.” IEEE® Transactions on Signal Processing. Vol. 47, 1999, pp. 2600–2603.

[3] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.

버전 내역

R2006a 이전에 개발됨

모두 확장

참고 항목

| |