「DCT(離散コサイン変換)」の編集履歴(バックアップ)一覧に戻る
DCT(離散コサイン変換)」を以下のとおり復元します。
離散コサイン変換(DCT)とは、波はSIN関数の合成で表現できるというフーリエ級数の
考え方に従った変換で、物理学的な意味は時間振動する波から周波数成分へと数学的に
変換するための方法。

同じ手法として比較的良く知られているのは離散フーリエ変換(DFT)や高速フーリエ変換(FFT)
であるが、離散コサイン変換はコンパクトで実数のみで計算ができることから実装しやすく、
JPEGやMPEGなどの動画、MP3などの音声圧縮などに多く用いられている。
MMXなどで計算することも可能で、コーデックのDCTがMMX/SSEに対応している場合は、
PentiumMMXなどのCPUでもMPEG1動画を容易に再生することができた。

離散コサイン変換(DCT)は時間振動する波形を周波数成分に変換し、逆離散コサイン変換
(InverseDCT)は、周波数成分の分布から時間波形を再構成する。
時間波形を周波数変換する場合は、フーリエ級数の考え方に従い、さまざまな周波数の
振動波形(DCTの場合はCos関数)にたいして源信号との間で積分し、その後に周波数成分を
得ている。
通常、DCTと言う場合はDCT-2の式を意味し、IDCTがDCT-3の式を表す。下記のDCTはDCT-2となり、
DCTはデータ数は任意に指定できる。DCTで得られた数列に大して絶対値/Abs/を計算する
ことでパワースペクトルを得られる。
DCTは複素関数を含まないので、コードは比較的短く簡単。

高速DCTは昔からいくつかの方法が提案されテいるが、
高速化の方法としては、FFTのようにバタフライ演算/バタフライソート演算/を用いる方法、
単純に求めたいデータを間引いて計算を少なくする方法、MPEGで用いられているような
整数DCTを用いる方法、スレッドやparallel~forなどを用いる方法などが考えられる。


DCT
#asciiart(blockquote){
#console

'DCT
'離散コサイン変換サンプル

Dim dat(10) As Double
Dim ret(10) As Double
Dim a As Double
Dim b As Double
Dim d As Double
Dim pi As Double

Dim i As Long
Dim j As Long
Dim L As Long

'定数
pi=3.14159
L=10

'データ定義(時間波形)
dat(0)=1
dat(1)=1
dat(2)=1
dat(3)=0
dat(4)=0
dat(5)=0
dat(6)=1
dat(7)=1
dat(8)=1
dat(9)=0


'--- DCT Main
a=2*L
d=Sqr(2/L)

for i=0 to L
	b=i*pi
	ret(i)=0
	
	for j=0 to L
		ret(i)=ret(i)+dat(j)*Cos( ((2*j+1)*b)/a )
	Next j
	ret(i)=ret(i)*d
	
	if i=0 then ret(i)=ret(i)/Sqr(2)
Next i

'結果表示(周波数成分)
for i=0 to L
	print ret(i),
Next i
}

iDCT
#asciiart(blockquote){
#console

'iDCT
'逆離散コサイン変換サンプル
'

Dim dat(10) As Double
Dim ret(10) As Double
Dim a As Double
Dim b As Double
Dim d As Double
Dim pi As Double

Dim i As Long
Dim j As Long
Dim L As Long

'定数
pi=3.14159	'PI
L=10		'Array Length(データ数)

'入力データ定義(周波数成分)
dat(1)=1

'--- idct main
a=2*L
d=Sqr(2/L)

for i=0 to L
	b=2*i+1
	ret(i)=0

	for j=0 to L
		ret(i)=ret(i)+dat(j)*Cos( (j*pi*b)/a )
		if i=0 then ret(i)=ret(i)/Sqr(2)
	Next j
	ret(i)=ret(i)*d
Next i

'結果表示(時間波形)
for i=0 to L
	print ret(i),
Next i
}

復元してよろしいですか?