包絡線を求める関数はありますか?

24 visualizzazioni (ultimi 30 giorni)
MathWorks Support Team
MathWorks Support Team il 25 Ott 2013
時間軸上の信号や、周波数軸上の信号線に対する包絡線を求めたいのですが、適切な方法があれば教えてください。

Risposta accettata

MathWorks Support Team
MathWorks Support Team il 4 Ago 2020
Modificato: MathWorks Support Team il 23 Feb 2021
包絡線を求める関数は Signal Processing Toolbox で R2015b より envelope関数として提供されています。 
ご利用のバージョンが R2015a 以前の場合、または R2015b 以降で Signal Processing Toolbox をお持ちでない場合は、下記方法のご検討をお願いします。
方法.1: ローパスフィルタ
ディジタル通信で利用されるようなアップコンバートされたような信号に対し有効です。
プログラム例
Fs = 1000; % サンプリング周波数
t = 0:1/Fs:1; % 時間ベクトル
x = sin(2*pi*5*t) .* sin(2*pi*100*t); % 時間軸信号
F = fft(2*abs(x).^2);
f = Fs * [0:length(F)-1] / length(F);
F( f>10 & f< (Fs-10) ) = 0;
y = ifft(F);
plot(t,x,t,sqrt(y))
方法.2 : ヒルベルト変換
方法.1 同様に、ディジタル通信で利用されるようなアップコンバートされたような信号に対し有効です。
プログラム例
Fs = 1000; % サンプリング周波数
t = 0:1/Fs:1; % 時間ベクトル
x = sin(2*pi*5*t) .* sin(2*pi*100*t); % 時間軸信号
z = hilbert(x); % Hilbert 変換
plot(t,x,t,abs(z))
方法.3: findpeaks 関数を利用して周辺の値と比較して相対的に極大値となる信号点を検出する
Fs = 1000; % サンプリング周波数
t = 0:1/Fs:1; % 時間ベクトル
x = sin(2*pi*5*t) .* sin(2*pi*100*t); % 時間軸信号
[pks,ind] = findpeaks(x,'MINPEAKDISTANCE',3);
ind = [1 ind length(x)];
xi = 1 : length(x);
y = interp1(ind, x(ind), xi, 'cubic', 'extrap');
plot(t,x,t,y)
方法.4: 1サンプル前との差分を取得し、差分の符号が反転しているかどうかでピークと判定する
下記 MATLAB Central に方法3 を用いたサンプルプログラムが掲載されています。

Più risposte (0)

Prodotti


Release

R2010a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!