DiscreteWaveletTransform[data]
data の配列の離散ウェーブレット変換(DWT)を与える.
DiscreteWaveletTransform[data,wspec]
ウェーブレット wspec を使って離散ウェーブレット変換を与える.
DiscreteWaveletTransform[data,wave,r]
レベル r の細分化を使って離散ウェーブレット変換を与える.
DiscreteWaveletTransform
DiscreteWaveletTransform[data]
data の配列の離散ウェーブレット変換(DWT)を与える.
DiscreteWaveletTransform[data,wspec]
ウェーブレット wspec を使って離散ウェーブレット変換を与える.
DiscreteWaveletTransform[data,wave,r]
レベル r の細分化を使って離散ウェーブレット変換を与える.
詳細とオプション
- DiscreteWaveletTransformはウェーブレット係数配列の木を表すDiscreteWaveletDataオブジェクトを与える.
- DiscreteWaveletDataの特性 dwd は dwd["prop"]で求まる.使用可能な特性のリストは dwd["Properties"]で求まる.
- data は任意の深さの矩形配列である.
- data は次のいずれでもよい.
-
list 任意階数の数値配列 image 任意のImageオブジェクト audio AudioオブジェクトまたはサンプルされたSoundオブジェクト - 使用可能なウェーブレット wave
-
BattleLemarieWavelet[…] Bスプラインに基づいたBattle–Lemariéウェーブレット BiorthogonalSplineWavelet[…] Bスプラインに基づいたウェーブレット CoifletWavelet[…] Daubechiesウェーブレットの対称性変種 DaubechiesWavelet[…] Daubechiesウェーブレット HaarWavelet[…] 古典的なHaarウェーブレット MeyerWavelet[…] 周波数領域で定義されるウェーブレット ReverseBiorthogonalSplineWavelet[…] Bスプラインに基づいたウェーブレット( 逆双対ウェーブレットと主ウェーブレット) ShannonWavelet[…] シンク関数に基づいたウェーブレット SymletWavelet[…] 最小非対称直交ウェーブレット - デフォルトの wave はHaarWavelet[]である.
- 細分化レベル r の設定値を高くすると,スケールの大きい特徴が解決される.
- デフォルトの細分化レベル r は
で与えられる.ただし,
は data の最小次元である. » - レベル
のウェーブレット係数の木は,粗い係数
と詳細化係数
からなる.
は入力 data を表す. - 前方変換は
と
で与えられる. » - 逆変換は
で与えられる. »
はローパスフィルタ係数で,
はハイパスフィルタ係数である.どちらもそれぞれのウェーブレット族で定義される.
と
の次元は
で与えられる.ただし,
は入力 data の次元であり,fl は対応する wspec のフィルタ長である. »- 使用可能なオプション
-
Method Automatic 使用するメソッド Padding "Periodic" 境界を越えてデータをどのように延長するか WorkingPrecision MachinePrecision 内部計算で使用する精度 - Paddingの設定値はArrayPadで使用できるものと同じである.
- InverseWaveletTransformは逆変換を与える.
例題
すべて開く すべて閉じる例 (3)
HaarWaveletを使って離散ウェーブレット変換を計算する:
DiscreteWaveletTransform[{56, 40, 8, 24, 48, 48, 40, 16}]Normalを使ってすべての係数を見る:
Normal[%]a = Audio["ExampleData/rule30.wav"]dwd = DiscreteWaveletTransform[a, Automatic, 3]dwd[All, "Audio"]InverseWaveletTransform[dwd]Imageオブジェクトを変換する:
dwd = DiscreteWaveletTransform[[image], Automatic, 2]dwd[All, "Image"]InverseWaveletTransform[dwd]スコープ (36)
基本的な用法 (6)
dwd = DiscreteWaveletTransform[{0, 0, 1, 0, 0}]結果のDiscreteWaveletDataは変換係数の木構造を表している:
dwd["TreeView"]InverseWaveletTransform[dwd]DiscreteWaveletDataオブジェクトから有用な特性を抽出することができる:
dwd = DiscreteWaveletTransform[RandomReal[1, {16}], DaubechiesWavelet[4], 2]dwd["Properties"]dwd["DataDimensions"]dwd["Dimensions"]Normalを使ってウェーブレットのすべての係数を明示的に求める:
dwd = DiscreteWaveletTransform[Range[8]];Normal[dwd]Allを引数として使ってすべての係数を得ることもできる:
dwd[All]Automaticを使って逆変換に使われた係数だけを求める:
dwd[Automatic]"TreeView"あるいは"WaveletIndex"を使ってどのウェーブレット係数が使えるかを明らかにする:
dwd = DiscreteWaveletTransform[Range[8], HaarWavelet[], 2];dwd["TreeView"]dwd["WaveletIndex"]dwd[{0}]dwd[{0, 0}]ウェーブレットの指標指定リストに対応するいくつかのウェーブレット係数を抽出する:
dwd[{{0}, {0, 1}}]ウェーブレット指標がパターンにマッチするすべての係数を抽出する:
dwd[{_}]dwd[{{_, 0}, {_, 1}}]WaveletListPlot等の関数では,デフォルトでAutomatic係数が使われている:
dwd = DiscreteWaveletTransform[Table[Sin[x ^ 2], {x, 0, 10, 0.2}], Automatic, 4];First /@ dwd[Automatic]WaveletListPlot[dwd, Ticks -> Full]data = Table[Sin[x ^ 2] + RandomReal[{-0.2, 0.2}], {x, 0, 10, 0.02}];ListLinePlot[data]細分化レベルを下げるとより多くの信号エネルギーが{0,0,0}に残される:
dwt1 = DiscreteWaveletTransform[data, DaubechiesWavelet[4], 3];WaveletListPlot[dwt1, PlotLayout -> "CommonYAxis"]細分化レベルをより高めると,{0,0,0}はさらに多くの成分に分解される:
dwt2 = DiscreteWaveletTransform[data, DaubechiesWavelet[4], 4];WaveletListPlot[dwt2, PlotLayout -> "CommonYAxis"]ウェーブレット族 (10)
いろいろなウェーブレット族を使って離散ウェーブレット変換を計算する:
data = Table[Sin[x ^ 2], {x, 0, 10, 0.02}];dwd1 = DiscreteWaveletTransform[data, DaubechiesWavelet[4], 3];
dwd2 = DiscreteWaveletTransform[data, SymletWavelet[4], 3];{WaveletListPlot[dwd1], WaveletListPlot[dwd2]}data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];ListLinePlot[data]HaarWavelet(デフォルト):
dwd = DiscreteWaveletTransform[data, HaarWavelet[], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, DaubechiesWavelet[2], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, BattleLemarieWavelet[3], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, BiorthogonalSplineWavelet[4, 2], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, CoifletWavelet[2], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, MeyerWavelet[3], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]ReverseBiorthogonalSplineWavelet:
data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, ReverseBiorthogonalSplineWavelet[4, 2], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, -3π, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, ShannonWavelet[8], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]data = Table[Sin[t^2], {t, 0, 3π, 0.01}];dwd = DiscreteWaveletTransform[data, SymletWavelet[3], 3];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis", Filling -> Axis]ベクトルデータ (6)
WaveletListPlotを使って,係数を共通水平軸上でプロットする:
dwd = DiscreteWaveletTransform[Table[Sin[x ^ 2], {x, 0, 10, 0.02}], Automatic, 3];WaveletListPlot[dwd]WaveletListPlot[dwd, PlotLayout -> "CommonYAxis"]WaveletScalogramを使い,係数を時間と細分化レベルの関数として可視化する:
dwd = DiscreteWaveletTransform[Table[Sin[20x] + Sin[10x], {x, 1, 10, 0.01}], Automatic, 4];マウスポインタが係数上にくると,係数指標がツールチップとして現れる:
WaveletScalogram[dwd, All]data = Table[1, {x, 0, 10, 0.02}];ListLinePlot[data]dwd = DiscreteWaveletTransform[data, DaubechiesWavelet[4], 3];WaveletListPlot[dwd, All, PlotLayout -> "CommonYAxis"]分解可能な最高の周波数(ナイキスト(Nyquist)周波数)で振動するデータ:
data = Table[(-1)^n, {n, 80}];ListLinePlot[data]dwd = DiscreteWaveletTransform[data, Automatic, 3];WaveletListPlot[dwd, All, PlotLayout -> "CommonYAxis", Ticks -> Full]data = Table[Piecewise[{{1, 1 < x < 3.1}}, 0], {x, 0, 4, 0.02}];ListLinePlot[data]粗い係数{0,…}はデータと同じ大きいスケールの構造を持つ:
dwd = DiscreteWaveletTransform[data, Automatic, 3];WaveletListPlot[dwd, {0..}, FrameTicks -> Full]WaveletListPlot[dwd, Except[{0..}], FrameTicks -> Full]data = Table[Piecewise[{{5, n <= 30}, {2 + (-1)^n, Inequality[30, Less, n, LessEqual, 60]}, {5, 60 < n}}], {n, 90}];ListLinePlot[data, PlotRange -> {0, 5}]dwd = DiscreteWaveletTransform[data, Automatic, 3];WaveletListPlot[dwd, {0..}, Ticks -> Full]WaveletListPlot[dwd, {1, 0...}, Ticks -> Full]WaveletListPlot[dwd, All, PlotLayout -> "CommonYAxis", AxesOrigin -> {0, -5}]行列データ (5)
dwd = DiscreteWaveletTransform[(| | | | | |
| - | - | - | - | - |
| 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 0 | 0 | 1 | 0 | 0 |)]dwd[{"TreeView", Left}]InverseWaveletTransform[dwd]//Chop//MatrixFormWaveletMatrixPlotを使ってさまざまなウェーブレット係数を可視化する:
dwd = DiscreteWaveletTransform[DiamondMatrix[32], Automatic, 2]WaveletMatrixPlot[dwd, ImageSize -> Small]より高い細分化レベルでのウェーブレット変換のWaveletMatrixPlot:
WaveletMatrixPlot[DiscreteWaveletTransform[DiamondMatrix[32], Automatic, 3], ImageSize -> Small]二次元では,各方向のフィルタリング操作のベクトルが計算できる:
Tuples[{0, 1}, 2] /. {0 -> "lowpass", 1 -> "highpass"}これらのベクトルを二進数展開として解釈するとウェーブレット指標の数が得られる:
FromDigits[#, 2]& /@ Tuples[{0, 1}, 2]Haarウェーブレットのローパスフィルタとハイパスフィルタを得る:
{lp, hp} = Map[Last, WaveletFilterCoefficients[HaarWavelet[], {"PrimalLowpass", "PrimalHighpass"}], {2}]Apply[KroneckerProduct, Tuples[{lp, hp}, 2], {1}]Map[MatrixPlot, %]step[{a_, b_, c_, d_}] :=
ArrayFlatten[{{ConstantArray[a, {3, 3}], ConstantArray[b, {3, 5}]}, {ConstantArray[c, {5, 3}], ConstantArray[d, {5, 5}]}}];MatrixPlot[step[{0, 1, 0, 1}], FrameTicks -> False]垂直詳細化係数,つまりウェーブレット指標{…,1}のみが非零である:
WaveletMatrixPlot[DiscreteWaveletTransform[step[{0, 1, 0, 1}]], ImageSize -> Small]MatrixPlot[step[{0, 0, 1, 1}], FrameTicks -> False]水平詳細化係数,つまりウェーブレット指標{…,2}のみが非零である:
WaveletMatrixPlot[DiscreteWaveletTransform[step[{0, 0, 1, 1}]], ImageSize -> Small]MatrixPlot[Reverse@IdentityMatrix[8], FrameTicks -> False]対角詳細化係数,つまりウェーブレット指標{…,3}のみが非零である:
WaveletMatrixPlot[DiscreteWaveletTransform[Reverse@IdentityMatrix[8]], ImageSize -> Small]配列データ (2)
data = RandomReal[1, {16, 16, 16}];dwd = DiscreteWaveletTransform[data, Automatic, 2]dwd["TreeView"]Norm[Flatten[data - InverseWaveletTransform[dwd]]]data = CrossMatrix[All, {8, 8, 8}];Graphics3D[{Red, Cuboid /@ Position[data, 1]}]dwd = DiscreteWaveletTransform[data, Automatic, 1]Table[i -> Graphics3D[{If[Positive[Extract[dwd[i][[1, 2]], #]], Red, Green], Cuboid[#]}& /@ Position[dwd[i][[1, 2]], u_ /; Abs[u] > 0], PlotRange -> Automatic], {i, dwd["IndexMap"]}]もとのデータのエネルギーは変換された係数内に保存されている:
Total[Flatten[data]^2] == Total[Flatten[dwd[Automatic][[All, 2]]]^2]画像データ (4)
Imageオブジェクトを変換する:
img = Image[DiamondMatrix[All, {64, 64}]]dwd = DiscreteWaveletTransform[img, HaarWavelet[], 3]逆変換するとImageオブジェクトが再構築される:
InverseWaveletTransform[dwd]ウェーブレット係数は通常各画像チャンネルのデータのリストとして与えられる:
dwd = DiscreteWaveletTransform[[image], HaarWavelet[], 2];Dimensions[{0, 0} /. Normal[dwd]]すべての係数をImageオブジェクトとして得る:
dwd[All, {"Image", ImageSize -> 80}]カラーレベルの再スケールを施していない生のImageオブジェクトを得る:
dwd[All, {"Image", "ImageFunction" -> Identity, ImageSize -> 80}]{0,1}係数の逆変換をImageオブジェクトとして得る:
dwd[{0, 1}, {"Image", "Inverse"}]WaveletImagePlotを使って逆変換に使われた係数を階層的格子レイアウトでプロットする:
dwd = DiscreteWaveletTransform[[image], HaarWavelet[], 3];WaveletImagePlot[dwd, BaseStyle -> Red]Imageウェーブレット係数がImageTypeの有効範囲の外側にある:
img = [image];dwd = DiscreteWaveletTransform[img, CDFWavelet["9/7"], 1];"ImageFunction"->Identityは正規化されていない画像のウェーブレット係数を与える:
i1 = First[dwd[{0}, {"Values", {"Image", "ImageFunction" -> Identity}}]];{r1, g1, b1} = Flatten /@ ImageData /@ ColorSeparate[i1];{i1, BoxWhiskerChart[{r1, g1, b1}, ChartStyle -> {Red, Green, Blue}]}デフォルトで,係数の正規化には"ImageFunction"->ImageAdjustが使われる:
i2 = First[dwd[{0}, {"Values", {"Image", "ImageFunction" -> ImageAdjust}}]];{r2, g2, b2} = Flatten /@ ImageData /@ ColorSeparate[i2];{i2, BoxWhiskerChart[{r2, g2, b2}, ChartStyle -> {Red, Green, Blue}]}サウンドデータ (3)
Soundオブジェクトを変換する:
snd = ExampleData[{"Sound", "Apollo11ReturnSafely"}]dwd = DiscreteWaveletTransform[snd]逆変換するとSoundオブジェクトが再構築される:
InverseWaveletTransform[dwd]デフォルトで,係数は各サウンドチャンネルのデータのリストとして与えられる:
dwd = DiscreteWaveletTransform[ExampleData[{"Sound", "PianoScale"}]];Dimensions[{0, 0, 1} /. Normal[dwd]]{0,1}係数をSoundオブジェクトとして得る:
dwd[{0, 0, 1}, "Sound"]Soundオブジェクトとしての{0,0,1}係数の逆変換:
dwd[{0, 0, 1}, {"Sound", "Inverse"}]MenuViewを使ってすべての係数をブラウズする:
dwd = DiscreteWaveletTransform[ExampleData[{"Sound", "Clarinet"}]];MenuView[dwd[All, "Sound"]]一般化と拡張 (3)
DiscreteWaveletTransformは記号による量の配列に使うことができる:
dwd = DiscreteWaveletTransform[{a, b, c, d}, WorkingPrecision -> ∞];Normal[dwd]//SimplifyInverseWaveletTransform[dwd]//Simplifydwd = DiscreteWaveletTransform[{1, 2, 5, 2}, WorkingPrecision -> 20];Normal[dwd]data = Exp[I RandomReal[1, 4]];dwd = DiscreteWaveletTransform[data]dwd[Automatic]Norm[InverseWaveletTransform[dwd] - data]オプション (5)
Padding (2)
Paddingの設定値は"Periodic"を含みArrayPadのメソッドのものと同じである:
ArrayPad[{a, b, c}, 4, "Periodic"]ArrayPad[{a, b, c}, 4, "Reversed"]ArrayPad[{a, b, c}, 4, "ReversedNegation"]ArrayPad[{a, b, c}, 4, "Reflected"]ArrayPad[{a, b, c}, 3, "ReflectedDifferences"]ArrayPad[{a, b, c}, 4, "ReversedDifferences"]ArrayPad[{a, b, c}, 3, "Extrapolated"]data = Table[UnitStep[x], {x, -2, 2, 4 / 255}];ListLinePlot[data]dwt1 = DiscreteWaveletTransform[data, DaubechiesWavelet[2], 5];WaveletListPlot[dwt1]"Extrapolated"充填を使うと非周期的なデータでは境界効果が薄くなる:
dwt2 = DiscreteWaveletTransform[data, DaubechiesWavelet[2], 5, Padding -> "Extrapolated"];WaveletListPlot[dwt2]WorkingPrecision (3)
デフォルトで,WorkingPrecision->MachinePrecisionが使われる:
data = RandomInteger[1, {10}];dwd1 = DiscreteWaveletTransform[data]dwd2 = DiscreteWaveletTransform[data, WorkingPrecision -> MachinePrecision]dwd1 == dwd2data = {0, 0, 1, 1};dwd = Normal@DiscreteWaveletTransform[data, WorkingPrecision -> 30]ゼロに近い数では,桁数が正しい数字のよりよい指標として確度が使える:
{Precision[dwd], Accuracy[dwd]}WorkingPrecision->∞を使って厳密計算を行う:
data = RandomInteger[10, {4}];Normal@DiscreteWaveletTransform[data, WorkingPrecision -> ∞]//Simplifyアプリケーション (11)
ウェーブレットの圧縮 (1)
data = Table[t^3, {t, -1, 1, 2 / 2047}];ListLinePlot[data]SymletWavelet[n]には n 個のバニッシングモーメントがあり,次数 n の多項式を表す:
dwd = Table[DiscreteWaveletTransform[data, SymletWavelet[n], Padding -> "Extrapolated"], {n, 5}];Countはゼロに近いウェーブレット係数の数を数える:
Table[n -> Count[Flatten[dwd[[n]][Automatic][[All, 2]]], u_ /; Chop[Abs[u], 10^-3] == 0], {n, 5}]不連続箇所と辺を見付ける (2)
data = Table[HeavisideLambda[x], {x, -2, 2, 4 / 1023}];ListLinePlot[data]dwd = DiscreteWaveletTransform[data, DaubechiesWavelet[3], 5, Padding -> "Reflected"];WaveletScalogram[dwd, {___, 1}, Method -> "Inverse" -> True, ColorFunction -> "BlueGreenYellow"]dwd = DiscreteWaveletTransform[[image], SymletWavelet[2], 4];WaveletImagePlot[dwd, Automatic, ImageAdjust[ImageAdjust[#], {1, 0.2, 1.9}]&]imgEdge[img_, {0, 0, 0, 0}] := ImageApply[# 0.0&, img]
imgEdge[img_, ___] := ImageApply[# 2&, img]Sharpen[InverseWaveletTransform[WaveletMapIndexed[imgEdge, dwd]]]エネルギー比較 (1)
信号中の累積エネルギー,そのウェーブレット係数,フーリエ係数を比較する:
data = Table[N[2 - 5t + 5 Exp[-500(t - 0.5)^2]], {t, 0, 1, 1 / 63}];ListLinePlot[data]cumulativeEnergy[data_] := Module[{c = Sort[Flatten[data]^2, Greater]}, Accumulate[c] / Total[c]]ListLinePlot[cumulativeEnergy[data]]dwd = DiscreteWaveletTransform[data];dft = Fourier[data];離散ウェーブレット変換は離散フーリエ変換より少ない係数で多くのエネルギーを捉えることができる:
ListLinePlot[{cumulativeEnergy[data], cumulativeEnergy[Last /@ dwd[Automatic]], cumulativeEnergy[Abs[dft]]}, BaseStyle -> Thick, PlotStyle -> {Red, Blue, Orange}, PlotRange -> All]ノイズ除去 (3)
data = Table[Sin[x] + RandomReal[{-0.1, 0.1}], {x, 0, 2π, 0.01}];ListLinePlot[data]dwd = DiscreteWaveletTransform[data, SymletWavelet[4], 6];efrac = dwd["EnergyFraction"]含んでいるエネルギーが1%より少ないウェーブレット係数を0に設定する:
eth[x_, ind_] := If[(ind /. efrac) < 0.01, x * 0., x] /; MemberQ[efrac[[All, 1]], ind]
eth[x_, ___] := xWaveletMapIndexed[eth, dwd];ListLinePlot[InverseWaveletTransform[%]]data = Table[N[5Exp[-100(t - 0.5)^2] + 5Exp[-10t]], {t, 0, 1, 1 / 511}];
noise = RandomVariate[NormalDistribution[0, 0.2], Length[data]];ListLinePlot[data + noise]dwd = DiscreteWaveletTransform[data + noise, DaubechiesWavelet[4]];WaveletThresholdを使って"Universal"閾値化を行う:
WaveletThreshold[dwd];ListLinePlot[{InverseWaveletTransform[%], data}]WaveletThreshold[dwd, "SURE"];ListLinePlot[{InverseWaveletTransform[%], data}]Imageからノイズを除去する:
nimg = ImageEffect[[image], {"GaussianNoise", 0.2}];dwd = DiscreteWaveletTransform[nimg, BiorthogonalSplineWavelet[5, 5]];各レベルで適応的に計算された閾値"SURE"で"Soft"閾値化を行う:
wtdwd = WaveletThreshold[dwd, {"Soft", "SURELevel"}, {1 | 2 | 3}];{Image[InverseWaveletTransform[wtdwd], ImageSize -> All], Image[nimg, ImageSize -> All]}周波数フィルタリング (1)
d1 = Table[Sin[x] + Cos[2x], {x, -2π, 2π, (4π/2047)}];d2 = Table[(ArcSin[Sin[20x]]/5), {x, -2π, 2π, (4π/2047)}];ListLinePlot[d1 + d2]2つの信号をフィルタで除去するため,まずウェーブレット変換を行う:
dwd = DiscreteWaveletTransform[d1 + d2, SymletWavelet[4], 6];次にWaveletListPlotを使って周波数の分布を可視化する:
WaveletListPlot[dwd, PlotLayout -> "CommonXAxis", DataRange -> {-2π, 2π}]低い周波数をフィルタで除去するために粗い係数のみを保つようにする:
rdwd1 = WaveletMapIndexed[(# * 0.0)&, dwd, {___, 1}];{ListLinePlot[d1, PlotLabel -> "data"], ListLinePlot[InverseWaveletTransform[rdwd1], PlotLabel -> "filtered coarse data"]}高い周波数をフィルタで除去するために,詳細化係数のみを保つようにする:
rdwd2 = WaveletMapIndexed[(# * 0.0)&, dwd, {___, 0}];{ListLinePlot[d2, PlotLabel -> "data"], ListLinePlot[InverseWaveletTransform[rdwd2], PlotLabel -> "filtered fine data"]}金融 (3)
price = FinancialData["IBM", "Jan. 1, 2000"];DateListPlot[price, Joined -> True, Frame -> False]dwd = DiscreteWaveletTransform[QuantityMagnitude[price["Values"]], BiorthogonalSplineWavelet[3, 3], 4];WaveletListPlot[dwd, PlotLayout -> "CommonYAxis"]すべての詳細化係数の閾値化と時系列の反転化でトレンドが与えられる:
tr = InverseWaveletTransform[WaveletThreshold[dwd, {"Hard", 100}]];DateListPlot[Transpose[{price["Times"], tr}], Joined -> True, Frame -> False]price = FinancialData["AAPL", "Jan. 1, 2009"];DateListPlot[price, Joined -> True, Frame -> False]dwd = DiscreteWaveletTransform[QuantityMagnitude[price["Values"]], SymletWavelet[2], 4, Padding -> "Extrapolated"]WaveletListPlot[dwd]dtr = InverseWaveletTransform[WaveletMapIndexed[# 0.0&, dwd, {___, 0}]];DateListPlot[Transpose[{price["Times"], dtr}], Joined -> True]ret = FinancialData["GE", "Return", {{1962, 1, 1}, {1963, 1, 1}, "Day"}];DateListPlot[ret, PlotRange -> All]HaarWaveletとSymletWaveletを使ってウェーブレット変換を行う:
dwd1 = DiscreteWaveletTransform[QuantityMagnitude[ret["Values"]], HaarWavelet[], 4];
dwd2 = DiscreteWaveletTransform[QuantityMagnitude[ret["Values"]], SymletWavelet[8], 4];時系列でのGEの利益は低周波振動を示していないので,高スケールの詳細化係数はゼロからの大幅な変動を示しはしない:
WaveletListPlot[{dwd1, dwd2}, PlotLayout -> "CommonYAxis"]どちらのフィルタも時系列の分散を捉えはするが,大域通過特性に幅があるため分布のさせ方は異なる:
hvar = Variance[#[[2]]]& /@ dwd1[Automatic];symvar = Variance[#[[2]]]& /@ dwd2[Automatic];SymletWaveletはHaarWaveletよりも特定の周波数間隔にある特徴をよりうまく分離する:
BarChart[Transpose@{hvar, symvar}, ChartLabels -> {Placed[dwd1[Automatic, "IndexMap"], Axis, Rotate[#, -Pi / 4]&], None}, ChartLegends -> {"Haar Wavelet", "Symlet Wavelet"}, ChartStyle -> {Orange, Green}]特性と関係 (15)
DiscreteWaveletPacketTransformはウェーブレット係数の完全木を計算する:
dwpt = DiscreteWaveletPacketTransform[{1, 1, 3, 1, 1}];dwpt[{"TreeView", Left}]DiscreteWaveletTransformは係数の完全木の部分木を計算する:
dwt = DiscreteWaveletTransform[{1, 1, 3, 1, 1}];dwt[{"TreeView", Left}]DiscreteWaveletTransform係数は細分化の各レベルで長さが半分になる:
Normal[DiscreteWaveletTransform[{1, 2, 3, 4}]]Normal[DiscreteWaveletTransform[{2, 3, 4, 1}]]StationaryWaveletTransform係数はもとのデータと同じ長さである:
Normal[StationaryWaveletTransform[{1, 2, 3, 4}]]Normal[StationaryWaveletTransform[{2, 3, 4, 1}]]多次元離散ウェーブレット変換は一次元パケット変換に関係している:
dwt = DiscreteWaveletTransform[(| | |
| - | - |
| a | b |
| c | d |), WorkingPrecision -> ∞];Simplify[dwt[Automatic]]dwpt = DiscreteWaveletPacketTransform[{a, b, c, d}, WorkingPrecision -> ∞];Simplify[dwpt[Automatic]]Haarウェーブレット(デフォルト)でデータ長が
の場合,計算される係数はどれも等しい:
Sort[Expand@Simplify@Flatten[dwt[Automatic, "Values"]]] == Sort[Flatten[Expand[dwpt[Automatic, "Values"]]]]data = RandomReal[1, {100}];r = Floor[Log2[Length[data]] + (1/2)]DiscreteWaveletTransform[data] == DiscreteWaveletTransform[data, Automatic, r]data = RandomReal[1, {100, 10, 10}];r = Floor[Log2[Min[Dimensions[data]]] + (1/2)]DiscreteWaveletTransform[data] == DiscreteWaveletTransform[data, Automatic, r]data = RandomReal[1, {100}];dwt = DiscreteWaveletTransform[data, Padding -> 0.];Norm[data] == Norm[Flatten[Last /@ dwt[Automatic]]]双直交ウェーブレット族用のエネルギーのノルムはほぼ保存される:
data = RandomReal[1, {100}];dwt = DiscreteWaveletTransform[data, BiorthogonalSplineWavelet[2, 4], Padding -> 0.];Norm[data]Norm[Flatten[Last /@ dwt[Automatic]]]data = RandomReal[1, {64}];dwt = DiscreteWaveletTransform[data, HaarWavelet[]];r = dwt["Refinement"]dwt[ConstantArray[0, {r}]]%[[1, 2, 1]] / (Sqrt[2])^rMean[data]data = Table[DiscreteDelta[n], {n, -2, 2}]dwt = DiscreteWaveletTransform[data];dwt["TreeView"]data1 = InverseWaveletTransform[dwt, Automatic, {0, 0}]data2 = InverseWaveletTransform[dwt, Automatic, {0, 1}]data3 = InverseWaveletTransform[dwt, Automatic, {1}]data1 + data2 + data3x = Range[8];dwd = DiscreteWaveletTransform[x, HaarWavelet[]];J = dwd["Refinement"];lp = WaveletFilterCoefficients[HaarWavelet[], "PrimalLowpass"];
hp = WaveletFilterCoefficients[HaarWavelet[], "PrimalHighpass"];a[n_] := If[1 ≤ n ≤ Length[lp], lp[[n, 2]], 0]
b[n_] := If[1 ≤ n ≤ Length[hp], hp[[n, 2]], 0]SetAttributes[c, Listable]c[0, n_] := x[[n]];
c[j_, n_] := Sqrt[2] Underoverscript[∑, m = -20, 20]a[m - 2 n + 2] c[j - 1, Mod[m, Length[x], 1]]dwd[{___, 0}, "Values"] == Table[c[j, Range[2^J - j]], {j, 1, J}]SetAttributes[d, Listable];d[j_, n_] := Sqrt[2]Underoverscript[∑, m = -20, 20]b[m - 2 n + 2] c[j - 1, Mod[m, Length[x], 1]]dwd[{___, 1}, "Values"] == Table[d[j, Range[2^J - j]], {j, 1, J}]x = Range[8];dwd = DiscreteWaveletTransform[x, HaarWavelet[]];J = dwd["Refinement"];lp = WaveletFilterCoefficients[HaarWavelet[], "PrimalLowpass"];
hp = WaveletFilterCoefficients[HaarWavelet[], "PrimalHighpass"];a[n_] := If[1 ≤ n ≤ Length[lp], lp[[n, 2]], 0]
b[n_] := If[1 ≤ n ≤ Length[hp], hp[[n, 2]], 0]SetAttributes[c, Listable]c[0, n_] := x[[n]];
c[j_, n_] := c[j, n] = Sqrt[2] Underoverscript[∑, m = -20, 20]a[m - 2 n + 2] c[j - 1, Mod[m, Length[x], 1]]SetAttributes[d, Listable];d[j_, n_] := d[j, n] = Sqrt[2]Underoverscript[∑, m = -20, 20]b[m - 2 n + 2] c[j - 1, Mod[m, Length[x], 1]]SetAttributes[iwt, Listable];iwt[j_Integer, n_Integer] := Sqrt[2]Underoverscript[∑, m = -20, 20]a[n - 2 m + 2]c[j + 1, Mod[m, 2^J - (j + 1), 1]] + Sqrt[2]Underoverscript[∑, m = -20, 20]b[n - 2 m + 2]d[j + 1, Mod[m, 2^J - (j + 1), 1]]iwt[2, Range[2]] == First[dwd[{0, 0}, "Values"]]iwt[1, Range[4]] == First[dwd[{0}, "Values"]]dwd = DiscreteWaveletTransform[RandomReal[1, {99}], SymletWavelet[4], 3];fl = Length[WaveletFilterCoefficients[dwd["Wavelet"]]];細分化レベル
では,ウェーブレット係数の次元は
で与えられる.ただし,
は入力 data の次元を表す:
wd[0] := dwd["DataDimensions"];wd[j_] := Ceiling[(1/2) (wd[j - 1] + fl - 2)]Table[j -> wd[j], {j, dwd["Refinement"]}]Length[#[[1]]] -> #[[2]]& /@ (dwd["Dimensions"])low[v_] := Partition[v, 2].{(1/Sqrt[2]), (1/Sqrt[2])}
high[v_] := Partition[v, 2].{(1/Sqrt[2]), -(1/Sqrt[2])}HaarDWT[v_] := {{0} -> low[v], {1} -> high[v]};HaarDWT[{a, b, c, d}]DiscreteWaveletTransformと比較する:
DiscreteWaveletTransform[{a, b, c, d}, HaarWavelet[], 1, WorkingPrecision -> ∞][All]f2d[fx_, fy_] := Composition[Map[fy, #]&, Map[fx, #]&]low[v_] := Partition[v, 2].{(1/Sqrt[2]), (1/Sqrt[2])}
high[v_] := Partition[v, 2].{(1/Sqrt[2]), -(1/Sqrt[2])}data = Table[Sin[x y], {x, -2, 2, 4 / 63}, {y, -2, 2, 4 / 63}];Table[MatrixPlot[f2d[fx, fy][data], PlotLabel -> {fx, fy}, FrameTicks -> None], {fx, {low, high}}, {fy, {low, high}}]//FlattenHaarWaveletを使ってDiscreteWaveletTransformと比較する:
dwd = DiscreteWaveletTransform[data, HaarWavelet[], 1];Table[MatrixPlot[Last[p], PlotLabel -> First[p], FrameTicks -> None], {p, Normal[dwd]}]dwds = Map[DiscreteWaveletTransform, ColorSeparate[[image]]]w = Image[Table[First[{0} /. Normal[t]], {t, dwds}], Interleaving -> False]もと画像のDiscreteWaveletTransformの{0}係数と比較する:
dwd = DiscreteWaveletTransform[[image]];{0} /. dwd[All, {"Image", "ImageFunction" -> Identity}]ImageSubtract[w, %]離散ウェーブレット変換は充填に必要な余分な係数のあるLiftingWaveletTransformに似ている:
data = Table[2Sin[x] + x / 2, {x, 0, 15, 15 / 63}];dwt = DiscreteWaveletTransform[data, Automatic, 1];
lwt = LiftingWaveletTransform[data, Automatic, 1];WaveletListPlot[dwt, PlotLayout -> "CommonYAxis"]WaveletListPlot[lwt, PlotLayout -> "CommonYAxis"]考えられる問題 (1)
充填はウェーブレット係数の総エネルギーに影響することがある:
data = RandomReal[1, {10}];dwd1 = DiscreteWaveletTransform[data, DaubechiesWavelet[4], Padding -> "Fixed"];{Norm[data]^2, Norm[Flatten[Last /@ dwd1[Automatic]]]^2}dwd2 = DiscreteWaveletTransform[data, DaubechiesWavelet[4], Padding -> 0];{Norm[data]^2, Norm[Flatten[Last /@ dwd2[Automatic]]]^2}おもしろい例題 (1)
data = ArrayPad[IdentityMatrix[4], 8, "Reflected"];ListPlot3D[data, InterpolationOrder -> 0, Mesh -> None, Filling -> Axis]Haar離散ウェーブレット変換係数の3Dプロットを作成する:
WaveletPlot3D[wr_] := Map[First[#] -> ListPlot3D[Last[#], InterpolationOrder -> 0, Mesh -> None, Filling -> Axis]&, wr[All]]WaveletPlot3D[DiscreteWaveletTransform[data, HaarWavelet[], 2]]関連するガイド
-
▪
- ウェーブレット ▪
- 信号の可視化と解析 ▪
- 信号変換 ▪
- 信号フィルタリングとフィルタ設計 ▪
- フーリエ(Fourier)解析 ▪
- データの変換と平滑化 ▪
- 信号処理 ▪
- 総和変換 ▪
- コンピュータビジョン
テキスト
Wolfram Research (2010), DiscreteWaveletTransform, Wolfram言語関数, https://reference.wolfram.com/language/ref/DiscreteWaveletTransform.html (2017年に更新).
CMS
Wolfram Language. 2010. "DiscreteWaveletTransform." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2017. https://reference.wolfram.com/language/ref/DiscreteWaveletTransform.html.
APA
Wolfram Language. (2010). DiscreteWaveletTransform. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/DiscreteWaveletTransform.html
BibTeX
@misc{reference.wolfram_2026_discretewavelettransform, author="Wolfram Research", title="{DiscreteWaveletTransform}", year="2017", howpublished="\url{https://reference.wolfram.com/language/ref/DiscreteWaveletTransform.html}", note=[Accessed: 07-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_discretewavelettransform, organization={Wolfram Research}, title={DiscreteWaveletTransform}, year={2017}, url={https://reference.wolfram.com/language/ref/DiscreteWaveletTransform.html}, note=[Accessed: 07-September-2026]}