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])

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')

또한 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')

슬라이딩 윈도우를 사용하여 이동 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')

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

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')

피크 분리 파라미터를 늘리면 잡음으로 인해 발생하는 스퓨리어스 피크의 영향을 줄일 수 있습니다. 랜덤 잡음을 신호에 추가합니다. 샘플 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')

참고 항목

|