このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
周波数ブレークの連続および離散ウェーブレット解析
この例では、離散ウェーブレット変換 (DWT) と連続ウェーブレット変換 (CWT) の違いを示します。
連続解析が離散解析より適切である場合
これに回答するために、関連する質問について検討します。信号を正確に再構築するには連続分解のすべての値を知っている必要がありますか。非冗長解析を実行できますか。信号のエネルギーが有限である場合、いくつかのアドミッシブル条件を満たすウェーブレットを使用している場合であれば、元の信号を正確に再構築するために分解のすべての値が必要となるわけではありません。通常のウェーブレットはこの条件を満たします。この場合、連続時間信号は離散変換の知識によって特徴付けられます。このような場合、離散解析は十分であり、連続解析は冗長です。
連続解析は、その冗長性によって特徴が強化される傾向があり、すべての情報がより視覚的になることから、多くの場合、解釈はより簡単です。これは、非常に繊細な情報について特に当てはまります。したがって、解析にはスペースを節約するという観点で失われるものの "読みやすさ" と解釈の容易さが得られます。
周波数ブレークをもつ信号の DWT および CWT
ウェーブレットを使用する解析によって、信号が変化する際の正確な瞬時の検出が行われる方法を示します。遅い正弦波の後に突然続く中程度の正弦波から構成される、不連続な信号を使用します。
load freqbrk;
signal = freqbrk;
Haar ウェーブレットを使用してレベル 5 で離散ウェーブレット変換 (DWT) を実行します。
lev = 5;
wname = 'db1';
nbcol = 64;
[c,l] = wavedec(signal,lev,wname);
プロット用に離散ウェーブレット係数を展開します。
len = length(signal); cfd = zeros(lev,len); for k = 1:lev d = detcoef(c,l,k); d = d(:)'; d = d(ones(1,2^k),:); cfd(k,:) = wkeep(d(:)',len); end cfd = cfd(:); I = find(abs(cfd)<sqrt(eps)); cfd(I) = zeros(size(I)); cfd = reshape(cfd,lev,len); cfd = wcodemat(cfd,nbcol,'row'); h211 = subplot(2,1,1); h211.XTick = []; plot(signal,'r'); title('Analyzed signal.'); ax = gca; ax.XLim = [1 length(signal)]; subplot(2,1,2); colormap(cool(128)); image(cfd); tics = 1:lev; labs = int2str(tics'); ax = gca; ax.YTickLabelMode = 'manual'; ax.YDir = 'normal'; ax.Box = 'On'; ax.YTick = tics; ax.YTickLabel = labs; title('Discrete Transform, absolute coefficients.'); ylabel('Level');
連続ウェーブレット変換 (CWT) を実行し、結果を可視化します。
figure; [cfs,f] = cwt(signal,1,'waveletparameters',[3 3.1]); hp = pcolor(1:length(signal),f,abs(cfs)); hp.EdgeColor = 'none'; set(gca,'YScale','log'); xlabel('Sample'); ylabel('log10(f)');
最も細かいスケールの CWT 係数を確認するだけで、周波数の変化の位置を正確に特定できます。
plot(abs(cfs(1,:))); grid on;
この例では、フーリエと比較したウェーブレット解析の重要な利点を示します。同じ信号をフーリエ変換によって解析していたら、信号の周波数が変化したときにその瞬間を検出することはできなかったでしょう。一方、こちらでは明確に観測可能です。