メインコンテンツ

包絡線抽出

R2026b

この例では、信号の包絡線の抽出方法を説明します。

両側波帯振幅変調信号を作成します。搬送波周波数は 1 kHz です。変調周波数は 50 Hz です。変調度は 100% です。サンプル レートは 10 kHz です。

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 によって計算された解析信号の振幅です。元の値とともに包絡線をプロットします。後で利用するために cell 配列に 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.

参考

|