dct
離散コサイン変換.
idct
逆離散コサイン変換.
呼び出し手順
X = dct(A) X = dct(A, sign) X = dct(A, sign, selection) X = dct(A, sign, dims, incr) X = dct(.., option) X = idct(A) X = idct(A, selection) X = idct(A, dims, incr) X = idct(.., option)
引数
- A
実数/複素ベクトルまたは実数/複素配列 (ベクトル, 行列または N-D 配列).
- X
A
と同じ大きさの 実数または複素配列.- sign
- 整数.値は
1
または-1
となります. 順方向または逆変換を選択します. デフォルト値は-1
(順方向変換)です. - selection
A
の各配列次元への添字を有する ベクトル. 詳細は説明を参照ください.- dims
- 整数値を有する正の数値ベクトル, または正の整数のベクトル.
詳細は説明を参照ください.
各要素は
A
の要素の総数の約数となります.各要素の積は
A
の要素の総数よりも 小さな値とする必要があります. - incr
- 整数値を有する正の数値ベクトル, または正の整数のベクトル.
詳細は説明を参照ください.
incr
は,dims
の要素数と同じにする 必要があります.各要素は,
A
の要素の総数の約数とする 必要があります.incr
の要素は, 厳密に昇順とする必要があります. - option
- 文字列. 値は,順方向変換の場合,
"dct1"
,"dct2"
,"dct4"
または"dct"
, 逆変換の場合は"dct1"
,"dct3"
,"dct4"
または"idct"
です. デフォルト値は,順方向変換の場合に"dct"
, 逆変換の場合に"idct"
です. 詳細は説明を参照ください.
説明
変換の説明
この関数は,
パラメータ値option
で指定したシフト量を用いて
順方向または逆方向の1次元またはN次元離散コサイン変換を
行います.
長さnの1次元配列Aの場合:
"dct1"
の場合, この関数は 正規化しないDCT-I変換を計算します:"dct2"
の場合,この関数は 正規化しないDCT-II変換を計算します:"dct3"
の場合,この関数は 正規化しないDCT-III変換を計算します:"dct4"
の場合,この関数は 正規化しないDCT-IV変換を計算します:"dct"
の場合,この関数は 正規化されたDCT-II変換を計算します:"idct"
の場合,この関数は 正規化されたDCT-III変換を計算します:
多次元のDCT変換は,一般に, 配列の各次元方向の1次元変換の分離可能な積です. 正規化しない変換の場合, 順方向の後に逆方向多次元変換を行うと, 元の配列が各次元の大きさの積で拡大されたものと なります.
次元がn1,
n2, …, npの
配列A
の正規化された多次元DCT変換
は以下のように計算されます
次元がn1,
n2, …, npの
配列A
の正規化された多次元DCT逆変換
は以下のように計算されます
構文の説明
- 短縮構文
- 順方向
X=dct(A,-1 [,option])
またはX=dct(A [,option])
により, オプション値を指定した順方向変換が得られます. デフォルトは,正規化された DCT-II順方向変換です.A
がベクトルの場合 (1より大きい次元が1つだけの場合), 1次元の変換が行われ, その他の場合にはn次元変換が行われます.(引数
-1
は"inverse"ではなく, 指数の符号を意味します).- 逆方向
X=dct(A,1 [,option])
またはX=idct(A [,option])
は 逆変換を行います.A
がベクトルの場合 (1より大きい次元が1つだけの場合), 1次元の変換が行われ, その他の場合にはn次元変換が行われます.
- 指定した次元方向のDCTの長い構文
X=dct(A,sign,selection [,option])
により, 選択した次元方向のA
の"スライス"の 順方向または逆方向dctを 効率的に計算することができます.例えば,
A
が3次元配列の場合,X=dct(A,-1,2)
は以下と等価になります:そして
X=dct(A,-1,[1 3])
は 以下と等価になります:for i2=1:size(A,2), X(:,i2,:)=dct(A(:,i2,:),-1); end
X=dct(A,sign,dims,incr)
は 古い構文であり,この方法でも 指定した次元方向のA
のスライスの 順方向または逆方向のdctを行うことができます.例えば,
A
がn1*n2*n3
個の要素を有する配列の場合,X=dct(A,-1,n1,1)
はX=dct(matrix(A,[n1,n2,n3]),-1,1)
と等価で,X=dct(A,-1,[n1 n3],[1 n1*n2])
はX=dct(matrix(A,[n1,n2,n3]),-1,[1,3])
と等価です.
dctを最適化
注意: この関数は直近のパラメータをメモリに保持し,2回目に再利用します. これにより(同じパラメータで)連続的にコールした場合の 計算時間が著しく改善されます.
get_fftw_wisdom, set_fftw_wisdom 関数により dctを更に最適化することができます.
アルゴリズム
この関数は,fftw3ライブラリを 使用します.
例
1次元dct
// 信号の周波数要素 //---------------------------------- // 50および70Hzの信号を含む1000hzで標本化された信号を構築 sample_rate=1000; t = 0:1/sample_rate:0.6; N = size(t,'*'); //number of samples s = sin(2*%pi*50*t) + sin(2*%pi*70*t+%pi/4) + grand(1,N,'nor',0,1); d = dct(s); // 低エネルギー部分を0にする d(abs(d)<1) = 0; size(find(d<>0),'*') //only 30 non zero coefficients out of 600 clf; plot(s,'b') plot(dct(d,1),'r')
2次元 dct
function z=__milk_drop(x, y) sq = x.^2+y.^2; z = exp( exp(-sq).*(exp(cos(sq).^20)+8*sin(sq).^20+2*sin(2*(sq)).^8) ); endfunction x = -2:0.1:2; [X,Y] = ndgrid(x,x); A = __milk_drop(X,Y); d = dct(A); d(abs(d)<1)=0; size(find(d<>0),'*') A1 = dct(d,1); clf gcf().color_map = gray(128); subplot(121), grayplot(x,x,A) subplot(122), grayplot(x,x,A1)
参照
- fft — 高速フーリエ変換
- dst — 離散サイン変換.
- fftw_flags — fftプランナアルゴリズム選択用手法を設定する
- get_fftw_wisdom — fftw wisdomを返す
- set_fftw_wisdom — fftw wisdomを設定
- fftw_forget_wisdom — fftw wisdomをリセット
参考文献
Matteo Frigo and Steven G. Johnson, "FFTW Documentation" http://www.fftw.org/#documentation
Report an issue | ||
<< Transforms | Transforms | dst >> |