メインコンテンツ

cwt

連続 1 次元ウェーブレット変換

説明

wt = cwt(x) は、x の連続ウェーブレット変換 (CWT) を返します。CWT は、対称性パラメーターであるガンマ (γ) が 3 に等しく時間-帯域積が 60 に等しい解析 Morse ウェーブレットを使用して得られます。cwt で使用されるオクターブあたりの音の数は 10 です。最小スケールと最大スケールは、ウェーブレットの周波数と時間におけるエネルギーの広がりに基づいて自動的に決まります。

cwt 関数は、L1 正規化を使用します。L1 正規化では、振幅の等しい振動成分がスケールの異なるデータ内にある場合、そのような振動成分は CWT で等しい大きさをもちます。L1 正規化を使用すると信号の表現の精度が高くなります。CWT の L1 ノルムおよび2 つの複素指数の連続ウェーブレット変換を参照してください。

wt = cwt(x,wname) は、wname で指定された解析ウェーブレットを使用して CWT を計算します。

[wt,f] = cwt(___,fs) は、サンプリング周波数 fs をヘルツ単位で指定し、スケールから周波数への変換 f をヘルツ単位で返します。サンプリング周波数を指定しない場合、cwtf をサンプルあたりのサイクル数で返します。

構文 cwt(x,fs,wname) は、cwt(x,wname,fs) と等価です。

[wt,period] = cwt(___,ts) は、サンプリング周期 ts を正の duration スカラーとして指定します。cwt は、ts を使用して、スケールから周期への変換である period を計算します。period は、ts と同じ形式プロパティをもつ duration の配列です。

[wt,f,coi] = cwt(___) は、円錐状影響圏 coi をサンプルあたりのサイクル数で返します。円錐状影響圏をヘルツの単位で返すには、サンプリング周波数 fs をヘルツ単位で指定します。

[wt,period,coi] = cwt(___,ts) は、円錐状影響圏 coi を、ts と同じ形式プロパティをもつ duration の配列として返します。

[___,coi,fb] = cwt(___) は、CWT で使用されるフィルター バンクを返します。cwtfilterbank を参照してください。

[___,fb,scalingcfs] = cwt(___) は、ウェーブレット変換のスケーリング係数を返します。

[___] = cwt(___,Name=Value) は、名前と値の引数を 1 つ以上追加で指定します。たとえば、wt = cwt(x,TimeBandwidth=40,VoicesPerOctave=20) は、時間-帯域積を 40、オクターブあたりの音の数を 20 と指定します。

出力引数なしで cwt(___) を使用すると、現在の Figure ウィンドウまたは指定されたターゲットの親コンテナーに CWT スカログラムがプロットされます。スカログラムは、時間と周波数の関数としてプロットされた CWT の絶対値です。対数スケールで周波数がプロットされます。エッジの影響が顕著になる円錐状影響圏もプロットされます。白い破線の外側のグレーの領域がエッジの影響が顕著になる領域です。

入力信号が複素数値の場合、ターゲットの親コンテナーを指定しないと、関数は正 (反時計回り) と負 (時計回り) の成分を、現在の Figure ウィンドウ内の別々のスカログラムにプロットします。それ以外の場合、関数は正と負の成分を連結したものをターゲットの親コンテナーにプロットします。

サンプリング周波数またはサンプリング周期を指定しない場合、周波数はサンプルあたりのサイクル数としてプロットされます。サンプリング周波数を指定した場合、周波数の単位はヘルツです。サンプリング周期を指定した場合は、スカログラムが時間と周期の関数としてプロットされます。入力信号が timetable の場合は、スカログラムが時間と周波数の関数として Hz 単位でプロットされ、RowTimes が時間軸の基底として使用されます。

スカログラムの点の時間、周波数、および振幅を表示するには、Figure の座標軸のツール バーでデータ ヒントを有効にし、スカログラムで目的の点をクリックします。

The figure shows the scalogram of a signal. A point in the scalogram has a data tip.

メモ

cwt 関数は、スカログラムをプロットする前に現在の Figure をクリアします。スカログラムをサブプロットに表示する方法については、CWT のスカログラムのサブプロットへのプロットを参照してください。

すべて折りたたむ

既定値を使用して、音声サンプルの連続ウェーブレット変換を取得します。

load mtlb;
w = cwt(mtlb);

mtlb ファイルを読み込みます。このファイルには、音声サンプル mtlb とサンプル レート Fs が含まれています。

load mtlb

解析 Morlet ウェーブレットを使用して得られた音声サンプルのスカログラムを表示します。

cwt(mtlb,"amor",Fs)

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (ms), ylabel Frequency (kHz) contains 3 objects of type image, line, area.

既定の Morse ウェーブレットを使用して取得したスカログラムと比較します。

cwt(mtlb,Fs)

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (ms), ylabel Frequency (kHz) contains 3 objects of type image, line, area.

阪神淡路大震災のデータの CWT を取得します。このデータは、オーストラリアのホバートにあるタスマニア大学の地震計で 1995 年 1 月 16 日 20:56:51 (GMT) から 51 分間にわたって記録された測定値 (垂直加速度、nm/sq.sec) です。サンプリング周波数は 1 Hz です。

load kobe

地震データをプロットします。

plot((1:numel(kobe))./60,kobe)
xlabel("Time (mins)")
ylabel("Vertical Acceleration (nm/s^2)")
title("Kobe Earthquake Data")
grid on
axis tight

Figure contains an axes object. The axes object with title Kobe Earthquake Data, xlabel Time (mins), ylabel Vertical Acceleration (nm/s Squared baseline ) contains an object of type line.

CWT、周波数、および円錐状影響圏を求めます。

[wt,f,coi] = cwt(kobe,1);

円錐状影響圏を含むスカログラムを表示します。

cwt(kobe,1)

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (mins), ylabel Frequency (mHz) contains 3 objects of type image, line, area.

サンプリング周波数の代わりにサンプリング周期を指定して、CWT、期間、および円錐状影響圏を求めます。

[wt,periods,coi] = cwt(kobe,minutes(1/60));

サンプリング周期を指定するときに生成されるスカログラムを表示します。

cwt(kobe,minutes(1/60))

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (mins), ylabel Period (mins) contains 3 objects of type image, line, area.

周波数が 32 Hz と 64 Hz の振幅が異なる 2 つの複素指数を作成します。データは 1000 Hz で 1 秒間サンプリングされます。指数の時間のサポートは互いに素です。

Fs = 1e3;
t = 0:1/Fs:1;
z = exp(1i*2*pi*32*t).*(t>=0.1 & t<0.3) + ...
    2*exp(-1i*2*pi*64*t).*(t>0.7);

標準偏差 0.05 の複素ホワイト ガウス ノイズを付加します。

wgnNoise = 0.05/sqrt(2)*(randn(size(t))+1i*randn(size(t)));
z = z+wgnNoise;

Morse ウェーブレットを使用して、CWT を求めてプロットします。

cwt(z,Fs)

Figure contains 2 axes objects. Axes object 1 with title Magnitude Scalogram Positive Component (Counterclockwise Rotation), ylabel Frequency (Hz) contains 3 objects of type image, line, area. Axes object 2 with title Negative Component (Clockwise Rotation), xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area.

カラー バーの複素指数成分の大きさは、スケールが異なっていても基本的にそれらの振幅になることに注意してください。これは L1 正規化による直接的な結果です。これは、このスクリプトを実行し、データ カーソルで各サブプロットを調べると確認できます。

The figure shows the scalogram of the complex-valued signal. The positive component in the upper plot and negative component in the the lower plot each have a data tip showing the time, frequency, and magnitude of the points.

R2026a 以降

NPG2006 データセット[5]を読み込みます。複素数値で表されたこのデータは、渦に捕捉された海中フロートの軌跡です。東方向と北方向への変位をプロットします。三角形は初期位置を示します。

load npg2006
plot(npg2006.cx)
hold on
plot(npg2006.cx(1),"^",MarkerSize=11,Color="r", ...
    MarkerFaceColor="r")
hold off
grid on
xlabel("Eastward Displacement (km)")
ylabel("Northward Displacement (km)")

Figure contains an axes object. The axes object with xlabel Eastward Displacement (km), ylabel Northward Displacement (km) contains 2 objects of type line. One or more of the lines displays its values using only markers

データの連続ウェーブレット変換を可視化します。サンプリング周期は 4 時間です。データが複素数値であるため、関数は正 (反時計回り) と負 (時計回り) の成分を別々のスカログラムにプロットします。フロートの時計回りの回転は、時計回りの回転のスカログラムで捉えられます。

cwt(npg2006.cx,hours(4))

Figure contains 2 axes objects. Axes object 1 with title Magnitude Scalogram Positive Component (Counterclockwise Rotation), ylabel Period (hrs) contains 3 objects of type image, line, area. Axes object 2 with title Negative Component (Clockwise Rotation), xlabel Time (hrs), ylabel Period (hrs) contains 3 objects of type image, line, area.

この例では、信号の振動成分の振幅が対応するウェーブレット係数の振幅と一致することを示します。

時間のサポートが互いに素である 2 つの正弦波で構成される信号を作成します。一方の正弦波は周波数が 32 Hz で振幅は 1 です。もう一方の正弦波は周波数が 64 Hz で振幅は 2 です。この信号を 1000 Hz で 1 秒間サンプリングします。信号をプロットします。

frq1 = 32;
amp1 = 1;
frq2 = 64;
amp2 = 2;

Fs = 1e3;
t = 0:1/Fs:1;
x = amp1*sin(2*pi*frq1*t).*(t>=0.1 & t<0.3)+... 
    amp2*sin(2*pi*frq2*t).*(t>0.6 & t<0.9);

plot(t,x)
grid on
xlabel("Time (sec)")
ylabel("Amplitude")
title("Signal")

Figure contains an axes object. The axes object with title Signal, xlabel Time (sec), ylabel Amplitude contains an object of type line.

信号に適用できる CWT フィルター バンクを作成します。信号の成分の周波数がわかっているため、フィルター バンクの周波数範囲をそれらの周波数を含む狭い範囲に設定します。範囲を確認するには、フィルター バンクの振幅周波数応答をプロットします。

fb = cwtfilterbank(SignalLength=numel(x),SamplingFrequency=Fs,...
    FrequencyLimits=[20 100]);
freqz(fb)

Figure contains an axes object. The axes object with title CWT Filter Bank, xlabel Frequency (Hz), ylabel Magnitude contains 24 objects of type line.

cwt とフィルター バンクを使用して信号のスカログラムをプロットします。

cwt(x,FilterBank=fb)

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area.

データ カーソルを使用して、ウェーブレット係数の振幅が正弦波成分の振幅と基本的に等しいことを確認します。

The figure shows the scalogram of the signal. There are data tips at two scalogram points. The magnitudes of the points approximately equal the amplitudes of the sinusoidal components.

R2026a 以降

この例では、さまざまな境界拡張がスカログラムにどのような影響を与えるかを示します。

時間のサポートが互いに素である 2 つの正弦波で構成される信号を生成します。正弦波の周波数はそれぞれ 100 Hz および 400 Hz です。信号は 10 kHz で 1/10 秒間サンプリングされます。

frq1 = 100;
frq2 = 400;

Fs = 10e3;
tm = 0:1/Fs:0.1-1/Fs;
len = length(tm);
brk = tm(floor(len/2)+1);

sig = sin(2*pi*frq1*tm).*(tm>=0 & tm<brk)+ ... 
    sin(2*pi*frq2*tm).*(tm>=brk & tm<=tm(end));
plot(tm,sig)
grid on
title("Signal")
xlabel("Time (s)")
ylabel("Amplitude")

Figure contains an axes object. The axes object with title Signal, xlabel Time (s), ylabel Amplitude contains an object of type line.

サポートされている境界拡張ごとに、その拡張を使用して信号の CWT を求めます。

[wtr,f] = cwt(sig,Fs,Boundary="reflection");
wtp = cwt(sig,Fs,Boundary="periodic");
wtz = cwt(sig,Fs,Boundary="zeropad");

各 CWT のスカログラムをプロットします。境界で異なる周波数が現れるため、周期的な境界拡張 ("periodic") を使用するとラップ アラウンド効果が生じます。対称境界拡張 ("reflection") を使用すると、正弦波を反射するため、アーティファクトが生じます。この信号では、ゼロ パディング ("zeropad") を使用しても境界アーティファクトが生じません。

figure(Position=[0 0 600 600]);
t=tiledlayout(3,1);

nexttile
pcolor(tm,f,abs(wtp),EdgeColor="none")
xticks([])
yscale("log")
ylabel("Frequency (Hz)")
title("Boundary Extension: Periodic")

nexttile
pcolor(tm,f,abs(wtr),EdgeColor="none")
xticks([])
yscale("log")
ylabel("Frequency (Hz)")
title("Boundary Extension: Reflection")

nexttile
pcolor(tm,f,abs(wtz),EdgeColor="none")
yscale("log")
title("Boundary Extension: Zero Padding")
xlabel("Time (s)")
ylabel("Frequency (Hz)")
title(t,"Scalograms")

Figure contains 3 axes objects. Axes object 1 with title Boundary Extension: Periodic, ylabel Frequency (Hz) contains an object of type surface. Axes object 2 with title Boundary Extension: Reflection, ylabel Frequency (Hz) contains an object of type surface. Axes object 3 with title Boundary Extension: Zero Padding, xlabel Time (s), ylabel Frequency (Hz) contains an object of type surface.

この例では、CWT フィルター バンクを使用することで、複数の時系列の CWT を取得する場合の計算効率がどのように高まる可能性があるかを示します。

100 行 1024 列の行列 x を作成します。1024 個のサンプルをもつ信号に適した CWT フィルター バンクを作成します。

x = randn(100,1024);
fb = cwtfilterbank;

既定の設定で cwt を使用して、1024 個のサンプルをもつ信号の CWT を取得します。100 個の信号の CWT 係数を格納できる 3 次元配列を作成します。各信号には、1,024 個のサンプルがあります。

cfs = cwt(x(1,:));
res = zeros(100,size(cfs,1),size(cfs,2));

関数 cwt を使用して、行列 x の各行の CWT を取得します。経過時間を表示します。

tic
for k=1:100
    res(k,:,:) = cwt(x(k,:));
end
toc
Elapsed time is 0.928160 seconds.

次に、フィルター バンクのオブジェクト関数 wt を使用して、x の各行の CWT を取得します。経過時間を表示します。

tic
for k=1:100
    res(k,:,:) = wt(fb,x(k,:));
end
toc
Elapsed time is 0.393524 seconds.

この例では、MEX ファイルを生成し、生成された CUDA® コードを使用して連続ウェーブレット変換 (CWT) を実行する方法について説明します。

まず、CUDA 対応 GPU と NVCC コンパイラがあることを確認します。GPU 環境のチェックおよびアプリの設定 (GPU Coder)を参照して、適切な構成があることを確認してください。

GPU Coder 構成オブジェクトを作成します。

cfg = coder.gpuConfig("mex");

1,000 Hz で 100,000 サンプルの信号を生成します。この信号は、時間のサポートが互いに素である 2 つの余弦波で構成されています。

t = 0:.001:(1e5*0.001)-0.001;
x = cos(2*pi*32*t).*(t > 10 & t<=50)+ ...
    cos(2*pi*64*t).*(t >= 60 & t < 90)+ ...
    0.2*randn(size(t));

単精度を使用するように信号をキャストします。GPU 計算は、ほとんどの場合、単精度で実行するほうが効率が高くなります。ただし、NVIDIA® GPU が倍精度をサポートしている場合、倍精度のコードを生成することもできます。

x = single(x);

GPU MEX ファイルとコード生成レポートを生成します。MEX ファイルの生成を許可するには、次の 3 つの入力パラメーターのプロパティ (クラス、サイズ、実数/複素数) を指定しなければなりません。

  • coder.typeof(single(0),[1 1e5]) は、実数の single 値を含む長さ 100,000 の行ベクトルを指定します。

  • coder.typeof('c',[1 inf]) は、任意の長さの文字配列を指定します。

  • coder.typeof(0) は、実数の double 値を指定します。

sig = coder.typeof(single(0),[1 1e5]);
wav = coder.typeof('c',[1 inf]);
sfrq = coder.typeof(0);
codegen cwt -config cfg -args {sig,wav,sfrq} -report
Code generation successful: View report

-report フラグはオプションです。-report を使用すると、コード生成レポートが生成されます。レポートの [概要] タブに、[GPU コード メトリクス] リンクが表示され、ここで、生成された CUDA カーネルの数、割り当てられたメモリ量などの詳細情報が提供されます。

データに対して MEX ファイルを実行し、スカログラムをプロットします。プロットが 2 つの互いに素な余弦波と一致することを確認します。

[cfs,f] = cwt_mex(x,'morse',1e3);
image("XData",t,"YData",f,"CData",abs(cfs),"CDataMapping","scaled")
set(gca,"YScale","log")
axis tight
xlabel("Time (Seconds)")
ylabel("Frequency (Hz)")
title("Scalogram of Two-Tone Signal")

_mex を付けずに上記の CWT コマンドを実行します。MATLAB® と GPU MEX のスカログラムが同一であることを確認します。

[cfs2,f2] = cwt(x,'morse',1e3);
max(abs(cfs2(:)-cfs(:)))
ans = single
    7.3380e-07

この例では、出力引数なしでプロットを取得した場合の CWT の既定の周波数軸ラベルを変更する方法を示します。

周波数が 32 Hz と 64 Hz の 2 つの正弦波を作成します。データは 1000 Hz でサンプリングされます。2 つの正弦波の時間のサポートは互いに素です。標準偏差 0.05 のホワイト ガウス ノイズを付加します。既定の Morse ウェーブレットを使用して、CWT を求めてプロットします。

Fs = 1e3;
t = 0:1/Fs:1;
x = cos(2*pi*32*t).*(t>=0.1 & t<0.3)+sin(2*pi*64*t).*(t>0.7);
wgnNoise = 0.05*randn(size(t));
x = x+wgnNoise;
cwt(x,1000)

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area.

CWT の周波数は対数であるため、プロットでは対数の周波数軸が使用されます。MATLAB の対数軸の単位は 10 のべき乗です。cwtfreqboundsを使用すると、特定の信号長、サンプリング周波数、およびウェーブレットについて、ウェーブレット バンドパスの最小周波数と最大周波数を特定できます。

[minf,maxf] = cwtfreqbounds(numel(x),1000);

MATLAB の既定の設定により、最小周波数から最大周波数までの間の 10 のべき乗である 10 と 100 の位置に周波数の目盛りがあることがわかります。周波数軸の目盛りを増やす場合は、最小周波数から最大周波数までの間の対数的に等間隔である一連の周波数を以下を使用して求めることができます。

numfreq = 10;
freq = logspace(log10(minf),log10(maxf),numfreq);

次に、以下を使用して、現在の座標軸のハンドルを取得し、周波数軸の目盛りとラベルを置き換えます。

AX = gca;
AX.YTickLabelMode = "auto";
AX.YTick = freq;

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area.

CWT では、周波数が 2 のべき乗で計算されます。2 のべき乗の周波数の目盛りと目盛ラベルを作成するには、以下を実行します。

newplot
cwt(x,1000)
AX = gca;
freq = 2.^(round(log2(minf)):round(log2(maxf)));
AX.YTickLabelMode = "auto";
AX.YTick = freq;

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area.

この例では、プロットする各レベルの最大絶対値でスカログラムの値をスケーリングする方法を示します。

信号を読み込み、既定のスカログラムを表示します。カラーマップを pink(240) に変更します。

load noisdopp
cwt(noisdopp)
colormap(pink(240))

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (Samples), ylabel Normalized Frequency (cycles/sample) contains 3 objects of type image, line, area.

信号の CWT を実行し、ウェーブレット係数と周波数を求めます。

[cfs,frq] = cwt(noisdopp);

各周波数 (レベル) の係数の最大値を効率的に見つけるには、最初に係数の絶対値を転置します。各レベルの最小値を求めます。それぞれのレベルについて、そのレベルの最小値を減算します。

tmp1 = abs(cfs);
t1 = size(tmp1,2);
tmp1 = tmp1';
minv = min(tmp1);
tmp1 = (tmp1-minv(ones(1,t1),:));

tmp1 の各レベルの最大値を求めます。それぞれのレベルについて、そのレベルの最大値で各値を除算します。結果をカラーマップの色の数で乗算します。ゼロのエントリをすべて 1 に設定します。結果を転置します。

maxv = max(tmp1);
maxvArray = maxv(ones(1,t1),:);
indx = maxvArray<eps;
tmp1 = 240*(tmp1./maxvArray);
tmp2 = 1+fix(tmp1);
tmp2(indx) = 1;
tmp2 = tmp2';

結果を表示します。スカログラムの値が各レベルの最大絶対値でスケーリングされます。周波数が線形スケールで表示されます。

t = 0:length(noisdopp)-1;
pcolor(t,frq,tmp2)
shading interp
xlabel("Time (Samples)")
ylabel("Normalized Frequency (cycles/sample)")
title("Scalogram Scaled By Level")
colormap(pink(240))
colorbar

Figure contains an axes object. The axes object with title Scalogram Scaled By Level, xlabel Time (Samples), ylabel Normalized Frequency (cycles/sample) contains an object of type surface.

この例では、Morse ウェーブレットの時間-帯域積 P2 が大きくなるとウェーブレットの包絡線下部の振動が増えることを示します。P2 が大きくなると、ウェーブレットの周波数が狭まります。

2 つのフィルター バンクを作成します。1 つ目のフィルター バンクの TimeBandwidth の値は既定の 60 です。2 つ目のフィルター バンクの TimeBandwidth の値は 10 です。SignalLength はどちらのフィルター バンクも 4096 サンプルです。

sigLen = 4096;
fb60 = cwtfilterbank(SignalLength=sigLen);
fb10 = cwtfilterbank(SignalLength=sigLen,TimeBandwidth=10);

フィルター バンクの時間領域のウェーブレットを求めます。

[psi60,t] = wavelets(fb60);
[psi10,~] = wavelets(fb10);

関数 scales を使用して各フィルター バンクのマザー ウェーブレットを検出します。

sca60 = scales(fb60);
sca10 = scales(fb10);
[~,idx60] = min(abs(sca60-1));
[~,idx10] = min(abs(sca10-1));
m60 = psi60(idx60,:);
m10 = psi10(idx10,:);

fb60 フィルター バンクの方が時間-帯域積が大きいため、m60 ウェーブレットの方が m10 ウェーブレットよりも包絡線の下の振動が多いことを確認します。

tiledlayout(2,1)
nexttile
plot(t,abs(m60))
grid on
hold on
plot(t,real(m60))
plot(t,imag(m60))
hold off
xlim([-30 30])
legend("abs(m60)","real(m60)","imag(m60)")
title("TimeBandwidth = 60")
nexttile
plot(t,abs(m10))
grid on
hold on
plot(t,real(m10))
plot(t,imag(m10))
hold off
xlim([-30 30])
legend("abs(m10)","real(m10)","imag(m10)")
title("TimeBandwidth = 10")

Figure contains 2 axes objects. Axes object 1 with title TimeBandwidth = 60 contains 3 objects of type line. These objects represent abs(m60), real(m60), imag(m60). Axes object 2 with title TimeBandwidth = 10 contains 3 objects of type line. These objects represent abs(m10), real(m10), imag(m10).

m60m10 の振幅周波数応答のピークを揃えます。m60 ウェーブレットの周波数応答が m10 ウェーブレットの周波数応答よりも狭いことを確認します。

cf60 = centerFrequencies(fb60);
cf10 = centerFrequencies(fb10);

m60cFreq = cf60(idx60);
m10cFreq = cf10(idx10);

freqShift = 2*pi*(m60cFreq-m10cFreq);
x10 = m10.*exp(1j*freqShift*(-sigLen/2:sigLen/2-1));

figure
plot([abs(fft(m60)).' abs(fft(x10)).'])
grid on
legend("Time-Bandwidth = 60","Time-Bandwidth = 10")
title("Magnitude Frequency Responses")

Figure contains an axes object. The axes object with title Magnitude Frequency Responses contains 2 objects of type line. These objects represent Time-Bandwidth = 60, Time-Bandwidth = 10.

この例では、CWT のスカログラムを Figure のサブプロットにプロットする方法を示します。

音声サンプルを読み込みます。データは 7418 Hz でサンプリングされます。CWT の既定のスカログラムをプロットします。

load mtlb
cwt(mtlb,Fs)

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (ms), ylabel Frequency (kHz) contains 3 objects of type image, line, area.

信号の CWT および CWT のスケールから周波数への変換を取得します。

[cfs,frq] = cwt(mtlb,Fs);

関数 cwt により、時間と周波数の座標軸がスカログラムで設定されます。サンプル時間を表すベクトルを作成します。

tms = (0:numel(mtlb)-1)/Fs;

新しい Figure で、元の信号を上のサブプロットにプロットし、スカログラムを下のサブプロットにプロットします。対数スケールで周波数をプロットします。

figure
tiledlayout(2,1)
nexttile
plot(tms,mtlb)
axis tight
title("Signal and Scalogram")
xlabel("Time (s)")
ylabel("Amplitude")
nexttile
surface(tms,frq,abs(cfs))
axis tight
shading flat
xlabel("Time (s)")
ylabel("Frequency (Hz)")
set(gca,"yscale","log")

Figure contains 2 axes objects. Axes object 1 with title Signal and Scalogram, xlabel Time (s), ylabel Amplitude contains an object of type line. Axes object 2 with xlabel Time (s), ylabel Frequency (Hz) contains an object of type surface.

R2026a 以降

指定したターゲット座標軸とパネル コンテナーに 4 つの信号の CWT スカログラムをプロットします。

ターゲット座標軸での CWT スカログラムのプロット

音声サンプルを読み込みます。サンプル レートは 7418 Hz です。阪神淡路大震災のデータを読み込みます。サンプル レートは 1 Hz です。

load mtlb
FsSpeech = 7418;
load kobe
FsKobe = 1;

新しい Figure ウィンドウの南西隅と北東隅に 2 つの座標軸を作成します。

fig = figure(Position=[100 100 600 600]);
ax1 = axes(fig,Position=[0.1 0.1 0.55 0.35]);
ax2 = axes(fig,Position=[0.4 0.6 0.55 0.35]);

音声データと阪神淡路大震災のデータの CWT スカログラムを、Figure の南西軸と北東軸にそれぞれプロットします。

cwt(mtlb,FsSpeech,Parent=ax1)
title(ax1,"Magnitude Scalogram - Speech")
cwt(kobe,FsKobe,Parent=ax2)
title(ax2,"Magnitude Scalogram - Kobe")

Figure contains 2 axes objects. Axes object 1 with title Magnitude Scalogram - Speech, xlabel Time (ms), ylabel Frequency (kHz) contains 3 objects of type image, line, area. Axes object 2 with title Magnitude Scalogram - Kobe, xlabel Time (mins), ylabel Frequency (mHz) contains 3 objects of type image, line, area.

ターゲット UI 座標軸での CWT スカログラムのプロット

ノイズがある Doppler 信号を読み込みます。

load noisdopp

新しい UI Figure ウィンドウの南西隅に座標軸を作成します。

uif = uifigure(Position=[100 100 720 540]);
ax3 = uiaxes(uif,Position=[60 70 400 200]);

ノイズを含む Doppler 信号の CWT スカログラムを Figure の座標軸にプロットします。

cwt(noisdopp,Parent=ax3)
title(ax3,"Magnitude Scalogram - Doppler")

Figure contains an axes object. The axes object with title Magnitude Scalogram - Doppler, xlabel Time (Samples), ylabel Normalized Frequency (cycles/sample) contains 3 objects of type image, line, area.

ターゲット パネル コンテナーでの CWT スカログラムのプロット

時間のサポートが互いに素である 2 つの正弦波で構成される信号を作成します。一方の正弦波は周波数が 32 Hz で振幅は 1 です。もう一方の正弦波は周波数が 64 Hz で振幅は 2 です。この信号を 1000 Hz で 1 秒間サンプリングします。

frq1 = 32;
amp1 = 1;
frq2 = 64;
amp2 = 2;

Fs = 1e3;
t = 0:1/Fs:1;
x = amp1*sin(2*pi*frq1*t).*(t>=0.1 & t<0.3)+... 
    amp2*sin(2*pi*frq2*t).*(t>0.6 & t<0.9);

UI Figure ウィンドウの北東隅にパネル コンテナーを追加します。

p = uipanel(uif,Position=[310 330 350 200], ...
    Title="CWT Scalogram in Panel Container");

正弦波信号の CWT スカログラムをパネル コンテナーにプロットします。

cwt(x,Fs,Parent=p)

Figure contains 2 axes objects and another object of type uipanel. Axes object 1 with title Magnitude Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area. Axes object 2 with title Magnitude Scalogram - Doppler, xlabel Time (Samples), ylabel Normalized Frequency (cycles/sample) contains 3 objects of type image, line, area.

R2026a 以降

1 kHz で 1 秒間サンプリングされた信号を生成します。この信号は、3 つの複素数値の正弦波とホワイト ノイズで構成されます。各正弦波はそれぞれ異なる周波数をもちます。そのうち 2 つの周波数は負の値です。正弦波の時間のサポートは互いに素です。

Fs = 1e3;
t = 0:1/Fs:1;
z = exp(1i*2*pi*150*t).*(t>=0.1 & t<0.3) + ...
    exp(-1i*2*pi*300*t).*(t>=0.3 & t<0.7) + ...
    exp(-1i*2*pi*100*t).*(t>0.7);

wgnNoise = 0.05/sqrt(2)*(randn(size(t)) + ...
    1i*randn(size(t)));
sig = z + wgnNoise;

ターゲットの親コンテナーを指定せずに、信号のスカログラムをプロットします。信号が複素数値であるため、関数は正と負の成分を別々のスカログラムにプロットします。関数は周波数に対して対数スケールを使用します。

cwt(sig,Fs)

Figure contains 2 axes objects. Axes object 1 with title Magnitude Scalogram Positive Component (Counterclockwise Rotation), ylabel Frequency (Hz) contains 3 objects of type image, line, area. Axes object 2 with title Negative Component (Clockwise Rotation), xlabel Time (secs), ylabel Frequency (Hz) contains 3 objects of type image, line, area.

新しい Figure ウィンドウに座標軸を作成します。名前と値の引数 Parent の構文を使用して、座標軸にスカログラムをプロットします。また、CWT の係数と周波数を取得します。負の成分は、プロット内の負の周波数に対応します。関数は周波数に対して線形スケールを使用します。

fig = figure;
ax = axes(fig,Position=[0.1 0.1 0.5 0.6]);
[cfs,f] = cwt(sig,Fs,Parent=ax);

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains an object of type surface.

この関数は、CWT 係数を 3 次元配列で返します。1 ページ目は正 (反時計回り) 成分に対応し、2 ページ目は負 (時計回り) 成分に対応します。

係数と周波数を使用して、新しい Figure にターゲット座標軸のプロットを再作成できます。2 つのページを並べ替えて連結します。

flpdp = flip(cfs(:,:,2));
cfs2 = cat(1,cfs(:,:,1),flpdp);

周波数が正の値から負の値に並ぶように、周波数ベクトルを並べ替えて連結します。

flpdv = flip(-f);
f2 = cat(1,f,flpdv);

新しい Figure に座標軸 ax2 を追加します。surf 関数を使用して、連結した係数の絶対値を ax2 にプロットします。

ax2 = axes(figure);
surf(ax2,t,f2,abs(cfs2),EdgeColor="none")
view(ax2,[0,90])
axis(ax2,"tight")
set(ax2,YDir="normal")
xlabel(ax2,"Time (secs)")
ylabel(ax2,"Frequency (Hz)")
c = colorbar(ax2);
c.Label.String = "Magnitude";
title(ax2,"Recreated Scalogram")

Figure contains an axes object. The axes object with title Recreated Scalogram, xlabel Time (secs), ylabel Frequency (Hz) contains an object of type surface.

R2026a 以降

NPG2006 データ セットを読み込みます。この複素数値データは、渦に捕捉された海中フロートの軌跡です。サンプル周期は 4 時間です。東方向と北方向への変位をプロットします。三角形は初期位置を示します。

load npg2006
sig = npg2006.cx;
plot(sig)
hold on
plot(npg2006.cx(1),"^",MarkerSize=11,Color="r", ...
    MarkerFaceColor=[1 0 0 ])
hold off
grid on
xlabel("Eastward Displacement (km)")
ylabel("Northward Displacement (km)")

Figure contains an axes object. The axes object with xlabel Eastward Displacement (km), ylabel Northward Displacement (km) contains 2 objects of type line. One or more of the lines displays its values using only markers

新しい UI Figure ウィンドウに座標軸を作成します。名前と値の引数 Parent を使用して座標軸にスカログラムをプロットします。また、周期 p と円錐状影響圏 coi を取得します。サンプル周期を時間単位で指定すると、pcoi も時間単位の duration 配列になります。pcoi は duration 配列ですが、ターゲットの親コンテナーと複素数値信号を指定して cwt を呼び出すと、関数が周波数に対してスカログラムをプロットする点に注意してください。

uif = uifigure(Position=[100 100 720 540]);
axf = uiaxes(uif,Position=[15 105 575 400]);

[cfs,p,coi] = cwt(sig,hours(4),Parent=axf);

Figure contains an axes object. The axes object with title Magnitude Scalogram, xlabel Time (hrs), ylabel Frequency (μHz) contains an object of type surface.

スカログラムの時計回り成分と反時計回り成分を周期を基準にして可視化するには、ターゲットの親コンテナーや出力引数を指定せずに cwt を使用します。

figure
cwt(sig,hours(4))

Figure contains 2 axes objects. Axes object 1 with title Magnitude Scalogram Positive Component (Counterclockwise Rotation), ylabel Period (hrs) contains 3 objects of type image, line, area. Axes object 2 with title Negative Component (Clockwise Rotation), xlabel Time (hrs), ylabel Period (hrs) contains 3 objects of type image, line, area.

入力引数

すべて折りたたむ

入力信号。ベクトルまたは一定間隔でサンプリングされる単一変数 timetable として指定します。入力 x は少なくとも 4 つのサンプルをもたなければなりません。

データ型: single | double
複素数のサポート: あり

CWT の計算に使用する解析ウェーブレット。wname の有効なオプションは、"morse""amor"、および "bump" で、それぞれ Morse、Morlet (ガボール)、Bump のウェーブレットを示します。

既定では、対称性パラメーターであるガンマ (γ) が 3 に等しく時間-帯域積が 60 に等しい Morse ウェーブレットが使用されます。

データ型: char | string

ヘルツ単位のサンプリング周波数。正のスカラーとして指定します。fs を指定する場合、ts は指定できません。x が timetable の場合は fs は指定できません。fs は timetable の RowTimes から決定されます。

データ型: single | double

サンプリング周期 (期間とも呼ばれます)。スカラーの duration として指定します。有効な duration は、yearsdayshoursminutes、および seconds です。カレンダー期間は使用できません。ts を指定する場合、fs は指定できません。x が timetable の場合は ts は指定できません。ts は、PeriodLimits の名前と値の引数を設定したときに timetable の RowTimes から決定されます。

例: wt = cwt(x,hours(12))

データ型: duration

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: wt = cwt(x,"bump",VoicesPerOctave=10) は、Bump ウェーブレットとオクターブあたり 10 の音の数を使用して、x の CWT を返します。

CWT で使用する周波数の範囲。厳密に増加する正のエントリをもつ 2 要素ベクトルとして指定します。

  • 最初の要素は最も低いピーク通過帯域周波数を示し、ウェーブレットのピーク周波数 (Hz 単位) と 2 つの時間の標準偏差の積を信号長で除算した値以上でなければなりません。

  • 2 番目の要素は最も高いピーク通過帯域周波数を示し、ナイキスト周波数以下でなければなりません。

  • 周波数の下限 freqMin に対する周波数の上限 freqMax の比の基底 2 の対数は 1/NV 以上でなければなりません。ここで NV はオクターブあたりの音の数です。

    log2(freqMax/freqMin) ≥ 1/NV.

複素数値の信号の場合、反解析的な部分には (-1) × flimits が使用されます。ここで flimitsFrequencyLimits で指定されたベクトルです。

メモ

許容される範囲外の周波数範囲を指定した場合、cwt では有効な最小値と最大値まで範囲が切り詰められます。CWT の各種のパラメーター表現の周波数範囲を特定するには、cwtfreqbounds を使用します。

例: wt = cwt(x,1000,VoicesPerOctave=10,FrequencyLimits=[80 90])

データ型: double

CWT で使用する周期の範囲。厳密に増加する正のエントリをもつ 2 要素 duration 配列として指定します。

  • 最初の要素は 2 × ts 以上でなければなりません。ここで ts はサンプリング周期です。

  • 最大周期は、ウェーブレットの 2 つの時間の標準偏差とウェーブレットのピーク周波数の積で信号長を除算した値を超えることはできません。

  • 最大周期 maxP に対する最小周期 minP の比の基底 2 の対数は -1/NV 以下でなければなりません。ここで NV はオクターブあたりの音の数です。

    log2(pMin/pMax) ≤ -1/NV.

複素数値の信号の場合、反解析的な部分には (-1) × plimits が使用されます。ここで plimitsPeriodLimits で指定されたベクトルです。

メモ

許容される範囲外の周期範囲を指定した場合、cwt では有効な最小値と最大値まで範囲が切り詰められます。ウェーブレット変換の各種のパラメーター表現の周期範囲を求めるには、cwtfreqbounds を使用します。

例: wt = cwt(x,seconds(0.1),VoicesPerOctave=10,PeriodLimits=[seconds(0.2) seconds(3)])

データ型: duration

CWT に使用するオクターブあたりの音の数。1 ~ 48 までの整数として指定します。指定したオクターブあたりの音の数を使用して CWT のスケールが離散化されます。ウェーブレットの周波数と時間のエネルギーの広がりは、最小スケールと最大スケールによって自動的に決まります。

Morse ウェーブレットの時間-帯域積。3 以上 120 以下のスカラーとして指定します。対称性パラメーターのガンマ (γ) は 3 に固定されます。時間-帯域積が大きいウェーブレットほど、時間の広がりは大きくなり、周波数の広がりは狭くなります。Morse ウェーブレットの時間の標準偏差は約 sqrt(TimeBandwidth/2) です。Morse ウェーブレットの周波数の標準偏差は約 1/2 × sqrt(2/TimeBandwidth) です。

既定では、cwt 関数はウェーブレットに応じた周波数範囲を使用します。この範囲は、ウェーブレットの周波数および時間におけるエネルギー分布に基づいています。時間-帯域積を変更すると、既定の周波数範囲も変更されます (同様に、既定の周期範囲も変更されます)。異なる時間-帯域積を使用して得られた信号の連続ウェーブレット変換を比較するには、異なる変換の FrequencyLimits を同じ値に設定します。

TimeBandwidth を指定する場合、WaveletParameters は指定できません。対称性と時間-帯域積の両方を指定するには、代わりに WaveletParameters を使用します。

Morse ウェーブレット の表記法では、TimeBandwidthP2 です。

Morse ウェーブレットの対称性と時間-帯域積。スカラーの 2 要素ベクトルとして指定します。最初の要素は対称性 γ で、1 以上でなければなりません。2 番目の要素は時間-帯域積で、γ 以上でなければなりません。γ に対する時間-帯域積の比が 40 を超えることはできません。

γ が 3 に等しい場合、Morse ウェーブレットは周波数領域において完全に対称であり、歪度は 0 です。γ が 3 よりも大きい場合、歪度は正になります。γ が 3 よりも小さい場合、歪度は負になります。詳細については、Morse ウェーブレットを参照してください。

既定では、cwt 関数はウェーブレットに応じた周波数範囲を使用します。この範囲は、ウェーブレットの周波数および時間におけるエネルギー分布に基づいています。ウェーブレット パラメーターを変更すると、既定の周波数範囲も変更されます (同様に、既定の周期範囲も変更されます)。異なるウェーブレット パラメーターを使用して得られた信号の連続ウェーブレット変換を比較するには、異なる変換の FrequencyLimits を同じ値に設定します。

WaveletParameters を指定する場合、TimeBandwidth は指定できません。

R2026a 以降

信号の境界拡張。次のいずれかの値として指定します。

  • "reflection" — 信号を左境界と右境界で対称に拡張します。

  • "periodic" — 信号を周期的に拡張します。

  • "zeropad" — 信号を左境界と右境界でゼロ パディングによって拡張します。

"reflection" または "zeropad" を指定した場合、cwt 関数は入力信号を内部で元のサイズの 2 倍に拡張します。一方、"periodic" を指定した場合、関数は信号を周期信号として "処理します"。信号のサイズは変更されません。

メモ

スケーリング係数と近似合成フィルターをもつ icwt を使用して CWT を反転する場合は、Boundary"periodic" に設定します。

CWT の計算に使用する CWT フィルター バンク。cwtfilterbank オブジェクトとして指定します。FilterBank を設定する場合、他のオプションは指定できません。CWT の計算についてのすべてのオプションが、フィルター バンクのプロパティとして定義されます。詳細については、cwtfilterbank を参照してください。

x が timetable の場合、fb のサンプリング周波数またはサンプリング周期は timetable の RowTimes で決まるサンプリング周波数またはサンプリング周期と一致していなければなりません。

例: wt = cwt(x,FilterBank=cfb)

R2026a 以降

ターゲットの親コンテナー。Axes オブジェクト、UIAxes オブジェクト、または Panel オブジェクトとして指定します。

Parent=P を指定し、P が空でない場合、出力引数を指定しても、cwt 関数は指定したターゲットの親コンテナーに時間と周波数の関数としてスカログラムをプロットします。ターゲット座標軸とパネル コンテナーへの CWT スカログラムのプロットを参照してください。

入力信号が複素数値の場合、cwt は正 (反時計回り) と負 (時計回り) の成分を連結し、その結果をターゲットの親にプロットします。負の成分は、プロット内の負の周波数に対応します。ターゲット座標軸での複素数値信号の CWT スカログラムのプロットを参照してください。ウェーブレット時間-周波数アナライザー アプリでは、複素数値信号のスカログラムについても同じ可視化を得ることができます。これを行うには、[アナライザー] タブの [基本設定] にある [複素信号の正成分と負成分を分離] チェック ボックスをオフにします。

複素数値信号の場合、サンプリング周期を指定し、親が空でないとき、cwt はプロットに周波数を使用します。ただし、関数は関連する出力引数を引き続き duration 配列として返します。複素数値信号のサンプル周期と名前と値の引数 Parent の指定を参照してください。

ターゲット コンテナーおよび MATLAB® グラフィックスにおける親子関係の詳細については、グラフィックス オブジェクトの階層を参照してください。UIAxes オブジェクトおよび Panel オブジェクトの Parent を使用したアプリ設計の詳細については、Plot Spectral Representations of Signal in App Designerを参照してください。

出力引数

すべて折りたたむ

連続ウェーブレット変換。複素数値の行列として返されます。既定では、cwt は解析 Morse (3,60) ウェーブレットを使用します。3 は対称性で、60 は時間-帯域積です。cwt で使用されるオクターブあたりの音の数は 10 です。

  • x が実数値の場合、wtNaN 列の行列になります。Na はスケールの数で、Nx に含まれるサンプルの数です。

  • x が複素数値の場合、wt は 3 次元行列です。1 ページ目が正のスケール (解析的な部分または反時計回りの成分) の CWT で、2 ページ目が負のスケール (反解析的な部分または時計回りの成分) の CWT になります。

最小スケールと最大スケールは、ウェーブレットの周波数と時間におけるエネルギーの広がりに基づいて自動的に決まります。スケールが決定される方法の詳細については、アルゴリズムを参照してください。

データ型: single | double

CWT のスケールから周波数への変換。ベクトルとして返されます。サンプリング周波数 fs を指定した場合、f の単位はヘルツです。fs を指定しない場合、cwtf をサンプルあたりのサイクル数で返します。入力 x が複素数の場合、wt の両方のページにスケールから周波数への変換が適用されます。

スケールから周期への変換。ts と同じ形式プロパティをもつ duration の配列として返されます。各行が周期に対応しています。入力 x が複素数の場合、wt の両方のページにスケールから周期への変換が適用されます。

CWT の円錐状影響圏。サンプリング周波数 fs を指定した場合、円錐状影響圏の単位はヘルツです。スカラーの duration である ts を指定すると、円錐状影響圏は ts と同じ形式プロパティをもつ duration の配列になります。入力 x が複素数の場合、wt の両方のページに円錐状影響圏が適用されます。

円錐状影響圏は、CWT でエッジの影響が現れる箇所を示します。エッジの影響により、円錐状影響圏の外側やそれと重なる領域は信頼性が低くなります。詳細については、境界効果と円錐状影響圏を参照してください。

CWT で使用される CWT フィルター バンク。cwtfilterbank オブジェクトとして返されます。cwtfilterbank を参照してください。

CWT のスケーリング係数。実数値または複素数値のベクトルとして返されます。scalingcfs の長さは、入力 x の長さと等しくなります。

詳細

すべて折りたたむ

ヒント

  • 古い関数 cwt 用の構文は引き続き機能しますが、非推奨になりました。現在のバージョンの cwt を使用してください。古いバージョンと現在のバージョンの両方で同じ関数名が使用されています。関数への入力によって、使用されるバージョンが自動的に決定されます。関数 cwt の構文は変更済みを参照してください。

  • 複数の CWT を実行する場合 (for ループ内など)、まず cwtfilterbank オブジェクトを作成してから、オブジェクト関数 wt を使用するワークフローを推奨します。このワークフローにより、オーバーヘッドを最小限に抑え、パフォーマンスを最大限に向上することができます。複数の時系列での CWT フィルター バンクの使用を参照してください。

アルゴリズム

すべて折りたたむ

参照

[1] Lilly, J. M., and S. C. Olhede. “Generalized Morse Wavelets as a Superfamily of Analytic Wavelets.” IEEE Transactions on Signal Processing 60, no. 11 (November 2012): 6036–6041. https://doi.org/10.1109/TSP.2012.2210890.

[2] Lilly, J.M., and S.C. Olhede. “Higher-Order Properties of Analytic Wavelets.” IEEE Transactions on Signal Processing 57, no. 1 (January 2009): 146–160. https://doi.org/10.1109/TSP.2008.2007607.

[3] Lilly, J. M. jLab: A data analysis package for MATLAB, version 1.6.2. 2016. http://www.jmlilly.net/jmlsoft.html.

[4] Lilly, Jonathan M. “Element Analysis: A Wavelet-Based Method for Analysing Time-Localized Events in Noisy Time Series.” Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences 473, no. 2200 (April 30, 2017): 20160776. https://doi.org/10.1098/rspa.2016.0776.

[5] Lilly, J. M., and J.-C. Gascard. “Wavelet Ridge Diagnosis of Time-Varying Elliptical Signals with Application to an Oceanic Eddy.” Nonlinear Processes in Geophysics 13, no. 5 (September 14, 2006): 467–83. https://doi.org/10.5194/npg-13-467-2006.

拡張機能

すべて展開する

バージョン履歴

R2016b で導入

すべて展開する