Main Content

포락선 추출

이 예제에서는 신호의 포락선을 추출하는 방법을 보여줍니다.

양측파대 진폭 변조 신호를 생성합니다. 반송 주파수는 1kHz입니다. 변조 주파수는 50Hz입니다. 변조 깊이는 100%입니다. 샘플 레이트는 10kHz입니다.

t = 0:1e-4:0.1;
x = (1+cos(2*pi*50*t)).*cos(2*pi*1000*t);

plot(t,x)
xlim([0 0.04])

Figure contains an axes object. The axes object contains an object of type line.

hilbert 함수를 사용하여 포락선을 추출합니다. 포락선은 hilbert로 계산된 해석적 신호의 크기입니다. 원래 신호와 함께 포락선을 플로팅합니다. 나중에 사용할 수 있도록 plot 함수의 이름-값 쌍 인수를 셀형 배열로 저장합니다. 위상은 고주파수 정보를 포함하는 반면, 해석적 신호의 크기는 천천히 변화하는 신호의 특징을 캡처합니다.

y = hilbert(x);
env = abs(y);
plot_param = {'Color', [0.6 0.1 0.2],'Linewidth',2}; 

plot(t,x)
hold on
plot(t,[-1;1]*env,plot_param{:})
hold off
xlim([0 0.04])
title('Hilbert Envelope')

Figure contains an axes object. The axes object with title Hilbert Envelope contains 3 objects of type line.

또한 envelope 함수를 사용하여 신호 포락선을 직접 생성하고 신호 포락선이 계산되는 방식을 수정할 수도 있습니다. 예를 들어, 해석적 포락선을 구하는 데 사용한 힐베르트 필터의 길이를 조정할 수 있습니다. 너무 작은 필터 길이를 사용하면 왜곡된 포락선이 생성됩니다.

fl1 = 12;
[up1,lo1] = envelope(x,fl1,'analytic');
fl2 = 30;
[up2,lo2] = envelope(x,fl2,'analytic');
param_small = {'Color',[0.9 0.4 0.1],'Linewidth',2};
param_large = {'Color',[0 0.4 0],'Linewidth',2};

plot(t,x)
hold on
p1 = plot(t,up1,param_small{:});
plot(t,lo1,param_small{:});
p2 = plot(t,up2,param_large{:});
plot(t,lo2,param_large{:});
hold off

legend([p1 p2],'fl = 12','fl = 30')
xlim([0 0.04])
title('Analytic Envelope')

Figure contains an axes object. The axes object with title Analytic Envelope contains 5 objects of type line. These objects represent fl = 12, fl = 30.

슬라이딩 윈도우를 사용하여 이동 RMS 포락선을 생성할 수 있습니다. 너무 작은 윈도우 길이를 사용하면 왜곡된 포락선이 생성됩니다. 너무 큰 윈도우 길이를 사용하면 포락선이 완만해집니다.

wl1 = 3;
[up1,lo1] = envelope(x,wl1,'rms');
wl2 = 5;
[up2,lo2] = envelope(x,wl2,'rms');
wl3 = 300;
[up3,lo3] = envelope(x,wl3,'rms');

plot(t,x)
hold on
p1 = plot(t,up1,param_small{:});
plot(t,lo1,param_small{:});
p2 = plot(t,up2,plot_param{:});
plot(t,lo2,plot_param{:});
p3 = plot(t,up3,param_large{:});
plot(t,lo3,param_large{:})
hold off

legend([p1 p2 p3],'wl = 3','wl = 5','wl = 300')
xlim([0 0.04])
title('RMS Envelope')

Figure contains an axes object. The axes object with title RMS Envelope contains 7 objects of type line. These objects represent wl = 3, wl = 5, wl = 300.

샘플 개수를 조정하여 국소 최댓값들을 분리하고, 분리된 최댓값에 스플라인 보간을 사용하여 피크 포락선을 생성할 수 있습니다. 샘플을 너무 넓게 펼치면 포락선이 완만해집니다.

np1 = 5;
[up1,lo1] = envelope(x,np1,'peak');
np2 = 50;
[up2,lo2] = envelope(x,np2,'peak');

plot(t,x)
hold on
p1 = plot(t,up1,param_small{:});
plot(t,lo1,param_small{:})
p2 = plot(t,up2,param_large{:});
plot(t,lo2,param_large{:})
hold off

legend([p1 p2],'np = 5','np = 50')
xlim([0 0.04])
title('Peak Envelope')

Figure contains an axes object. The axes object with title Peak Envelope contains 5 objects of type line. These objects represent np = 5, np = 50.

피크 분리 파라미터를 늘리면 잡음으로 인해 발생하는 스퓨리어스 피크의 영향을 줄일 수 있습니다. 랜덤 잡음을 신호에 추가합니다. 샘플 5개 단위로 나뉜 구간을 사용하여 잡음이 피크 포락선에 어떤 영향을 미치는지 확인할 수 있습니다. 샘플 25개 단위로 나뉜 구간을 사용하여 이 작업을 반복합니다.

rng default
q = x + randn(size(x))/10;
np1 = 5;
[up1,lo1] = envelope(q,np1,'peak');
np2 = 25;
[up2,lo2] = envelope(q,np2,'peak');

plot(t,q)
hold on
p1 = plot(t,up1,param_small{:});
plot(t,lo1,param_small{:})
p2 = plot(t,up2,param_large{:});
plot(t,lo2,param_large{:})
hold off

legend([p1 p2],'np = 5','np = 25')
xlim([0 0.04])
title('Peak Envelope')

Figure contains an axes object. The axes object with title Peak Envelope contains 5 objects of type line. These objects represent np = 5, np = 25.

참고 항목

|