포락선 추출
이 예제에서는 신호의 포락선을 추출하는 방법을 보여줍니다.
양측파대 진폭 변조 신호를 생성합니다. 반송 주파수는 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')