✅ 操作成功!

dct变换

发布时间:2023-06-07 作者:admin 来源:文学

dct变换

dct变换

情绪实验-鹤壁市委书记

2023年2月22日发(作者:支气管图片)

DCT变换的原理及算法

离散傅立叶变换(DiscreteFourierTransform)

离散傅立叶变换概述

傅立叶分析以法国数学家和物理学家JeanBaptisteJosephFourier命名,是一种

将信号分解为谐波的方法。如下三图所示,一个包含16个点的离散信号可以用9个余弦

和9个正弦波来表示。在表达任意一个离散信号时,这些三角波的周期是一定的,不同的

只是振幅(amplitude)。

图1-1离散信号与对应的三角波

信号可以是连续的或离散的,同时也可以是周期性的或非周期性的,根据信号的这两

个特点,傅立叶变换可以分为四种类型:

傅立叶变换(FourierTransform),处理非周期性的连续信号(Aperiodic-

Continuous)。

傅立叶序列(FourierSeries),处理周期性的连续信号(Periodic-

Continuous)。

离散时间域傅立叶变换(DiscreteTimeFourierTransform),处理非周期性

的离散信号(Aperiodic-Discrete)。

离散傅立叶变换(DiscreteFourierTransform),处理周期性的离散信号

(Periodic-Discrete)。计算机只能处理离散的和有限长度的信号,因此只有离散傅立

叶变换(DFT)能在计算

机中以算法实现。

图1-2四种不同类型的傅立叶分析

实数离散傅立叶变换(RealDFT)的格式和表示

如图1-3所示,离散傅立叶变换将包含N个点的输入波转为两个包含N/2+1个点的输

出波。输入波常被称作时间域,因为信号的波形基本上都是随时间变化,输出波常被称

作频率域。

时间域与频率域中存储的信息是一样的,只是表现方式不一样。将时间域转为频率域的

过程叫离散傅立叶变换(DFT),将频率域转换为时间域的过程叫反变换(IDFT)。频率

域可以分为两部分,实数部分ReX[]和虚数部分ImX[],分别存放余弦函数

(Cosine)的振幅和正弦函数(Sine)的振幅。

图1-3实数傅立叶变换示意图

DFT基函数

DFT中使用的正弦和余弦函数统称为基函数(BasisFunction),这些三角函数的周

期是固定的,变化的只是振幅。DFT基函数的表达式:

Ck[i]=cos(2ki/N)

Sk[i]=sin(2ki/N)

公式1-1

其中,Ck[i]和Sk[i]表示由N个点组成的离散正弦曲线,i的取值范围是张倒N-1。k

决定了曲线的周期,取值范围是0到N/2。

多余的系数

完成DFT后,系数由原来的N个变为N+2个,似乎产生了两个多余的系数。在频率

域中,的确有两个系数是多余的,它们是ImX[0]和ImX[n/2]。它们的存在使得频率域中

的其他系数相互独立,并且它们的值永远为0,因此不会影响反变换。

反变换的计算(IDFT)

公式1-2

在上面的公式中,振幅使用的是和,而不是ImX[k]和Re

X[k]。两者的关系可以用下面的公式来表示:

公式1-3

反变换的算法实现

下面是反变换算法的伪代码实现:

100'THEINVERSEDISCRETEFOURIERTRANSFORM

110'Thetimedomainsignal,heldinXX[],iscalculatedfromthefrequency

domainsignals,

120'heldinREX[]andIMX[].

130'

140DIMXX[511]'XX[]holdsthetimedomainsignal

150DIMREX[256]'REX[]holdstherealpartofthefrequencydomain

160DIMIMX[256]'IMX[]holdstheimaginarypartofthefrequency

domain

170'

180PI=3.14159265'Settheconstant,PI

190N%=512'N%isthenumberofpointsinXX[]

200'

210GOSUBXXXX'MythicalsubroutinetoloaddataintoREX[]and

IMX[]

220'

230

240'

'FindthecosineandsinewaveamplitudesusingEq.1-3

250FORK%=0TO256

260REX[K%]=REX[K%]/(N%/2)

270IMX[K%]=-IMX[K%]/(N%/2)

280NEXTK%

290'

300REX[0]=REX[0]/2

310REX[256]=REX[256]/2

320'

330'

340FORI%=0TO511

'ZeroXX[]soitcanbeusedasanaccumulator

350XX[I%]=0

360NEXTI%

370'

380'Eq.1-2SYNTHESISMETHOD#rougheach

390'frequencygeneratingtheentirelengthofthesineandcosine

400'waves,andaddthemtotheaccumulatorsignal,XX[]

410'

420FORK%=0TO256'K%loopsthrougheachsampleinREX[]and

IMX[]

430FORI%=0TO511'I%loopsthrougheachsampleinXX[]

440'

450XX[I%]=XX[I%]+REX[K%]*COS(2*PI*K%*I%/N%)

460XX[I%]=XX[I%]+IMX[K%]*SIN(2*PI*K%*I%/N%)

470'

480NEXTI%

490NEXTK%

500'

510END

图1-4IDCT示意图

图1-4解释了IDCT的过程以及频率域与反变换时振幅的不同。图1-4a中是我们需要

进行转换的时间域曲线,在0点坐标处振幅为32的一条曲线;图1-4b是进行DFT变换后

的曲线,实数部分(ReX)的值为32,虚数部分的值全部为0,因此这里没有画虚数部分

的曲线;公式1-3将频率域信号(图1-4b所示)转换为余弦函数的振幅(图1-4c所示)。

虚数部分(用正弦函数表示)的系数全部为0,因此这里没有显示。

频率域与三角函数振幅之所以不同,是因为频率域被定义为谱密度(spectral

density)。

图1-4显示的是一个由32个点组成的信号在频率域中的实数部分,由编号从0到16

的17个采样点组成。谱密度是指单位带宽所能表达的信号量(振幅),其计算方法是使用

三角函数的振幅除以相应的带宽(bandwidth)。

图1-4中的虚线解释了带宽的计算,即在采样点之间进行平均分割。采样点0和16的

带宽为1/N,其他采样点(1-15)的带宽为2/N。这就是公式1-3中ReX[0]和Re

X[N/2]与其他ReX不同的原因。

图1-5频率域的带宽(bandwidth)

DFT的分析与计算

DFT的计算有三种方法:第一种是解线性方程祖,这种方法简单但计算量很大,实

际应用中很少使用;第二种是关联法(correlation),基于已知的另一条的曲线;第三

中方法是快速傅立叶变换(FFT),FFT算法将对一条含N个点曲线的计算转为对N条

含1个点的曲线的计算,从而大大降低了计算量。

线性方程组求解DFT

使用这种方法来计算DFT是很自然的,从N个方程求解N个未知数。但这种方法

计算量很大,实际应用中很少使用。

关联法(correlation)求解DFT

通过correlation求解DFT是求解DFT的标准方法,下面使用一个例子来说明这

种方法。求解一个包含64个点的信号的DFT,意味着我们要计算频率域中实数部分的

33个系数和虚数部分的33个系数。在这个例子中,我们只解一个系数,ImX[3]。

ImX[3]是一条包含三个完整周期的正弦函数的振幅,这个正弦函数曲线分布在点

0到点63之间,如图1-6a所示。

在图1-6中,a和b是两个时间域的示例信号,在这里分别称之为x1[]和x2[]。曲

线x1[]是一个包含3个完整周期、分布在0到63之间的正弦函数曲线;x2[]由多条正弦

函数曲线和余弦函数曲线混合而成,在组成x2[]的三角函数曲线中,没有任何一条在0

到63之间有完整的三个周期。

通过这两条曲线可以解释算法要实现的功能:当输入函数为x1[]时,算法的计算结

果应该是32,也就是信号中正弦曲线的振幅;而当输入函数为x2[]时,算法的计算结果

应该为0,因为x2[]所表示的曲线并不在这个信号中。

之所以非x1[]的曲线与x1[]相乘结果为0,是因为除x1[]外的任意一个函数与正弦

函数相乘时,在0到63(3个完整周期)上的积分都为0。在图1-6中,图e是图a和

图c相乘的结果,将各个点的值相加即可得到32;图f是图b和图d相乘的结果,将各

个点的值相加得到的结果为0。

上面的计算过程可以用公式1-4来表示。

公式1-4

图1-6关联法(correlation)求DFT

下面是关联法计算DFT的算法伪代码:

100'THEDISCRETEFOURIERTRANSFORM

110'Thefrequencydomainsignals,heldinREX[]andIMX[],are

calculatedfrom

120'thetimedomainsignal,heldinXX[].

130'

140DIMXX[511]'XX[]holdsthetimedomainsignal

150DIMREX[256]'REX[]holdstherealpartofthefrequencydomain

160DIMIMX[256]'IMX[]holdstheimaginarypartofthefrequency

domain

170'

180PI=3.14159265'Settheconstant,PI

190N%=512'N%isthenumberofpointsinXX[]

200'

210GOSUBXXXX'MythicalsubroutinetoloaddataintoXX[]

220'

230'

240FORK%=0TO256'ZeroREX[]&IMX[]sotheycanbeusedas

accumulators

250REX[K%]=0

260IMX[K%]=0

270NEXTK%

280'

290''CorrelateXX[]withthecosineandsinewaves,Eq.8-4

300'

310FORK%=0TO256'K%loopsthrougheachsampleinREX[]and

IMX[]

320FORI%=0TO511'I%loopsthrougheachsampleinXX[]

330'

340REX[K%]=REX[K%]+XX[I%]*COS(2*PI*K%*I%/N%)

350IMX[K%]=IMX[K%]-XX[I%]*SIN(2*PI*K%*I%/N%)

360'

370NEXTI%

380NEXTK%

390'

400END

二元性(Duality)

DFT和IDFT变换公式很类似。从一个域到另一个域,都是用已有的值乘以基函数,

然后将相应的值相加。实际上,DFT和IDFT的区别仅仅是时间域中包含N个点,而频

率域中包含N/2+1个点。在复数傅里叶变换中,时间域和频率域中的信号都包含N个点,

这使得两个域具有一种对称的性质,而在两个域之间的转换公式也就几乎一样了。

时间域和频率域的这种对称被称之为对称性(Duality),二元性可以产生很多有趣

的性质。例如:在频率域中的一个单点对应于时间域中的一条三角函数曲线,由于

Duality,这种性质反过来也成立,在时间域中的一个点对应于频率域中的一条三角函数曲

线。

快速傅立叶变换(FastFourierTransform)

FFT算法是由和在论文”Analgorithmforthe

machinecalculationofcomplexFourierSeries”中提出的。FFT是基于Complex

DFT来实现的。

通过ComplexDFT来计算RealDFT

尽管FFT算法是基于ComplexDFT实现的,但我们仍可以用其来计算Real

DFT,因为RealDFT可以方便地转换为ComplexDFT。从图2-1中可以看出Real

DFT和ComplexDFT的区别。在RealDFT中,时间域是一个包含N个点的信号,

频率域则包括实数部分和虚数部分两个长度为N/2+1的信号;在ComplexDFT中,时

间域也有两个部分,分别是实数部分和虚数部分,长度为N。频率域的实数部分和虚数

部分则长度增至N。

如图2-1所示,RealDFT和ComplexDFT的区别仅在于后者在时间域增加了一

个虚数部分,频率域长度的变化正是由这个虚数部分引起的。

图2-1RealDFT和ComplexDFT的区别

产生这个区别的原因是实数的虚数部分为0,因此将实数表达为虚数很简单,加上一

个系数为0的虚数部分即可。例如在图2-1中的ComplexDFT,若将时间域的虚数部

分设为0,频率域中多出的部分也置为0,那么图2-1中的RealDFT和ComplexDFT

就相等了。当包含负频率时,DFT的频率域会具有周期性。在ComplexDFT中,

频率域中0到N/2为正频率,N/2+1到N-1为负频率。

与使用ComplexDFT计算RealDFT相比,使用ComplexInverseDFT计算

RealInverseDFT更为困难。这是因为频率域中N/2+1到N-1部分的系数需要计算。

其计算过程也不复杂,系数N/2+1对应系数N/2-1的相反数,N/2+2对应N/2-2的相反

数,即:

系数(N/2+1)=—系数(N/2-1)

系数(N/2+2)=—系数(N/2-2)

注意,0与N/2没有相应的点与之对应。进行RealInverseDFT计算时,首先将

0到N/2复制到complexDFT的系数0到N/2,然后使用一个子过程来计算系数

N/2+1到N-1。这个子过程的伪代码实现如下:

6000'NEGATIVEFREQUENCYGENERATION

6010'Thissubroutinecreatesthecomplexfrequencydomainfromthe

realfrequencydomain.

6020'Uponentrytothissubroutine,N%containsthenumberofpointsin

thesignals,and

6030'REX[]andIMX[]containtherealfrequencydomaininsamples0

toN/2.

6040'Onreturn,REX[]andIMX[]containthecomplexfrequency

domaininsamples0toN-1.

6050'

6060FORK%=(N%/2+1)TO(N%-1)

6070REX[K%]=REX[N%-K%]

6080IMX[K%]=-IMX[N%-K%]

6090NEXTK%

6100'

6110RETURN

FFT的实现原理

FFT算法很复杂,本文不讨论细节,只描述其实现原理。在虚数域中,时间域和频

率域表达的都是由N个虚数点组成的信号,每个虚数点都由实数部分和虚数部分的两个

数字来表达。例如虚数点X[6],就是由实数部分ReX[6]和虚数部分ImX[6]组成。

FFT算法的核心思想是将时间域中一个包含N个点的信号分解为N个包含一个点

的信号。然后分别计算这N个信号的频率域对应值,最后将这N个频率域的信号综合为

频率域中的一个信号。

图2-2描述了一个包含12个点的示例信号在FFT中的分解过程。

图2-2FFT中的分解(decompose)过程

图2-2中的过程看似复杂,实际上可以通过如图2-3所示的位反转算法(bit

reversalsorting)来实现。算法将各点的二进制位反转为对称的形式,即可完成N个点

的信号到N个单点信号的分解过程。

图2-3位反转排序

FFT算法的下一步是分别求出这N个单点信号在频率域的振幅。这是算法中最容易

的一步,单点的振幅等于它自己本身的值,这意味着在这一步什么也不必做。算法的

最后一步是将这N个频率域的点按在时间域分解时的反序结合(combine)起

来,这里不能使用位反转算法,这一步是算法中最复杂的部分。

图2-4展现了两个长度为4的频率域信号组合为一个长度为8的频率域信号的过

程。组合(synthesis)的顺序必须与在时间域中分解(decompose)的过程完全相逆。以时

间域的信号abcd和信号efgh为例,要将其整合为一个包含8个点的信号需要经过这两

步:首先将这两个信号进行稀释(dilute),即用0填充为长度为8的信号,然后两者相

加即可得到新的信号。如abcd稀释后得到a0b0c0d0,efgh稀释后得到0e0f0g0h,

两者相加可得abcdefgh。

图2-4FFT组合(synthesis)

当时间域用0稀释时,对应的频率域会复制自己。

当时间域先移位再用0填充时,对应的频率域会乘以一个三角函数,然后再复制自己。

abcd与efgh的稀释方法并不相同,abcd稀释为a0b0c0d0,其偶数位为0;efgh

稀释为0e0f0g0h,其奇数位为0。也就是说efgh向右移动了一位,这个在时间域的移

位对应于频率域乘以一个三角函数。

图2-5展示了在两个频率域中长度为4的信号组合的过程。左侧的Odd-Four

PointFrequencySpectrum指的是对应奇数位为0的时间域信号的频率域信号,如

EFGH;右侧的Even-FourPointFrequencySpectrum指的是对应偶数位为0的时间

域信号的频率域信号,如ABCD。

为了更清楚地表达这个过程,图2-6将其中的两个点拿出来,因为这个图形很想一只

张开翅膀的蝴蝶,因此人们也将这个图所代表的过程称之为butterfly。

图2-5FFT组合过程

图2-6Butterfly

图2-7显示了FFT变换的流程图,包含了FFT变换的三个部分。1.时间域的分解过程可以通过位

变换算法来实现。2.将时间域分解后得到的N个单点转换为频率域并不需要任何计算,因为对于单点而

言,在频率域的振幅等于时间域的振幅。3.第三部分是整个算法的核心,是图中重点要表达的部分。

图2-7FFT流程图

在图2-7中,最外面的循环表示要在lgN个层次上进行组合(synthesis),中间那层

循环指在每一层上的组合过程,最内部的循环表示butterfly过程。

下面是FFT算法的一段Basic代码:

1000'THEFASTFOURIERTRANSFORM

1010'Uponentry,N%containsthenumberofpointsintheDFT,REX[]and

1020'IMX[]turn,

1030'REX[]andIMX[]nalsrunfrom0toN%-1.

1040'

1050PI=3.14159265'Setconstants

1060NM1%=N%-1

1070ND2%=N%/2

1080M%=CINT(LOG(N%)/LOG(2))

1090J%=ND2%

1100'

1110FORI%=1TON%-2'Bitreversalsorting

1120IFI%>=J%THENGOTO1190

1130TR=REX[J%]

1140TI=IMX[J%]

1150REX[J%]=REX[I%]

1160IMX[J%]=IMX[I%]

1170REX[I%]=TR

1180IMX[I%]=TI

1190K%=ND2%

1200IFK%>J%THENGOTO1240

1210J%=J%-K%

1220K%=K%/2

1230GOTO1200

1240J%=J%+K%

1250NEXTI%

1260'

1270FORL%=1TOM%'Loopforeachstage

1280LE%=CINT(2^L%)

1290LE2%=LE%/2

1300UR=1

1310UI=0

1320SR=COS(PI/LE2%)'Calculatesine&cosinevalues

1330SI=-SIN(PI/LE2%)

1340FORJ%=1TOLE2%'LoopforeachsubDFT

1350JM1%=J%-1

1360FORI%=JM1%TONM1%STEPLE%'Loopforeachbutterfly

1370IP%=I%+LE2%

1380TR=REX[IP%]*UR–IMX[IP%]*UI'Butterflycalculation

1390TI=REX[IP%]*UI+IMX[IP%]*UR

1400REX[IP%]=REX[I%]-TR

1410IMX[IP%]=IMX[I%]-TI

1420REX[I%]=REX[I%]+TR

1430IMX[I%]=IMX[I%]+TI

1440NEXTI%

1450TR=UR

1460UR=TR*SR-UI*SI

1470UI=TR*SI+UI*SR

1480NEXTJ%

1490NEXTL%

1500'

1510RETURN

更快的FFT算法

有多种方法可以加速FFT算法,但也只能达到20%–40%的加速比。例如在时间

域分解时,提前两步、在每个信号包含四个点时结束分解。

另一种方法是将时间域的虚数部分设为0,从而使得频率域的振幅具有对称的性质,

即将复数FFT算法转换为实数FFT算法。下面是实数InverseFFT算法的伪代码:

4000'INVERSEFFTFORREALSIGNALS

4010'Uponentry,N%containsthenumberofpointsintheIDFT,REX[]and

4020'IMX[]containtherealandimaginarypartsofthefrequencydomainrunningfrom

4030'index0toN%/ainingsamplesinREX[]andIMX[]areignored.

4040'Uponreturn,REX[]containstherealtimedomain,IMX[]containszeros.

4050'

4060'

4070FORK%=(N%/2+1)TO(N%-1)'Makefrequencydomainsymmetrical

4080REX[K%]=REX[N%-K%]'(asinTable12-1)

4090IMX[K%]=-IMX[N%-K%]

4100NEXTK%

4110'

4120FORK%=0TON%-1'Addrealandimaginarypartstogether

4130REX[K%]=REX[K%]+IMX[K%]

4140NEXTK%

4150'

4160GOSUB3000‘CalculateforwardrealDFT(TABLE12-6)

4170'

4180FORI%=0TON%-1'Addrealandimaginarypartstogether

4190REX[I%]=(REX[I%]+IMX[I%])/N%'anddividethetimedomainbyN%

4200IMX[I%]=0

4210NEXTI%

4220'

4230RETURN

图2-8展示了FFT中使用的对称性原理。a和b分别表示同一个时间域信号,虚数部

分全部为0,c和d分别是对应在频率域实数部分和虚数部分。c具有偶对称的性质,d

具有奇对称的性质。

图2-8DFT中实数部分的对称

图2-9DFT中虚数部分的对称

图2-9与图2-8类似,其时间域实数部分a为0,虚数部分b非0,对应的频率域曲

线c和d分别具有奇对称和偶对称的性质。

上面介绍了时间域的某个部分为0的情况,如果时间域的实数部分和虚数部分都不

为0情况会怎样?频率域可以通过两个或多个频谱的相加获得。关键点在于:频率域具有

这两种对称性质(奇对称和偶对称)的波谱可以完美地分为两个分量。输入信号被分为来

两个部分,N/2个奇数位信号被放置在时间域信号的实数部分,N/2个偶数位信号被放

置在时间域信号的虚数部分,从而使得长度为N的FFT变换转化为长度为N/2的FFT

变换。频率域此时有两个长度为N/2的信号,将其组合起来(使用FFT中的方法)即可

得到RealFFT变换的结果。下面是这种算法的伪代码实现:

3000'FFTFORREALSIGNALS

3010'Uponentry,N%containsthenumberofpointsintheDFT,REX[]contains

3020'therealinputsignal,whilevaluesinIMX[]turn,

3030'REX[]andIMX[]nalsrunfrom0toN%-1.

3040'

3050NH%=N%/2-1'Separateevenandoddpoints

3060FORI%=0TONH%

3070REX(I%)=REX(2*I%)

3080IMX(I%)=REX(2*I%+1)

3090NEXTI%

3100'

3110N%=N%/2'CalculateN%/2pointFFT

3120GOSUB1000

3130N%=N%*2

3140'

3150NM1%=N%-1'Even/oddfrequencydomaindecomposition

3160ND2%=N%/2

3170N4%=N%/4-1

3180FORI%=1TON4%

3190IM%=ND2%-I%

3200IP2%=I%+ND2%

3210IPM%=IM%+ND2%

3220REX(IP2%)=(IMX(I%)+IMX(IM%))/2

3230REX(IPM%)=REX(IP2%)

3240IMX(IP2%)=-(REX(I%)-REX(IM%))/2

3250IMX(IPM%)=-IMX(IP2%)

3260REX(I%)=(REX(I%)+REX(IM%))/2

3270REX(IM%)=REX(I%)

3280IMX(I%)=(IMX(I%)-IMX(IM%))/2

3290IMX(IM%)=-IMX(I%)

3300NEXTI%

3310REX(N%*3/4)=IMX(N%/4)

3320REX(ND2%)=IMX(0)

3330IMX(N%*3/4)=0

3340IMX(ND2%)=0

3350IMX(N%/4)=0

3360IMX(0)=0

3370'

3380PI=3.14159265'CompletethelastFFTstage

3390L%=CINT(LOG(N%)/LOG(2))

3400LE%=CINT(2^L%)

3410LE2%=LE%/2

3420UR=1

3430UI=0

3440SR=COS(PI/LE2%)

3450SI=-SIN(PI/LE2%)

3460FORJ%=1TOLE2%

3470JM1%=J%-1

3480FORI%=JM1%TONM1%STEPLE%

3490IP%=I%+LE2%

3500TR=REX[IP%]*UR-IMX[IP%]*UI

3510TI=REX[IP%]*UI+IMX[IP%]*UR

3520REX[IP%]=REX[I%]-TR

3530IMX[IP%]=IMX[I%]-TI

3540REX[I%]=REX[I%]+TR

3550IMX[I%]=IMX[I%]+TI

3560NEXTI%

3570TR=UR

3580UR=TR*SR-UI*SI

3590UI=TR*SI+UI*SR

3600NEXTJ%

3610RETURN

离散余弦变换(DiscreteCosineTransform)

DCT变换和FFT变换都属于变换压缩方法(TransformCompression),变换压缩的

一个特点是将从前密度均匀的信息分布变换为密度不同的信息分布。在图像中,低频部分的

信息量要大于高频部分的信息量,尽管低频部分的数据量比高频部分的数据量要小的多。例

如删除掉占50%存储空间的高频部分,信息量的损失可能还不到5%。

变换编码有很多种。K–L变换的压缩效率很高,但算法实现困难;FFT变换算法实现

简单,但压缩效率不是很理想。经过多方面的比较,最终胜出的算法是DCT,一种源自

FFT的变换编码。

与FFT变换同时使用正弦和余弦函数来表达信号不同,DCT只使用余弦函数来表达信

号。DCT变换有多个版本,有一种常用的DCT实现过程是这样的:对一个长度为129

(0到128)的信号进行DCT变换。首先,复制点127到点1,使整个信号变为:

0,1,2,..,127,128,127,…,2,1

这串长度为256的时间域信号经过FFT变换后会生成一个长度为129的信号。

因为时间域的信号对称,根据二元性(duality),对应的频率域信号的虚数部分全部为

0。也就是说,我们输入的长度为129的时间域信号经过DCT变换后,产生一个长度

为129的频率域信号,并且频率域完全由余弦函数组成。

在图像处理中,每副图像都会被切成8×8的小块,块的大小可以是任意,只是因

为历史原因人们习惯于切为8×8的块。二维的图像处理与一维的信号处理原理是一致

的,只是一些计算公式不一样,在二维图像中,基函数的公式如下:

公式中x和y指像素在空间域(对应一维的时间域)的坐标,u和v指基函数频率

域中的坐标。这个基函数公式基于8×8的块,x,y,u,v的取值范围都是0–7。

图像经DCT变换后,低频信息集中在矩阵的左上角,高频信息则向右下角集中。

直流分量在[0,0]处,[0,1]处的基函数在一个方向上是一个半周期的余弦函数,在另一

个方向上是一个常数。[1,0]处的基函数与[0,1]类似,只不过方向旋转了90度。

图3-1DCT变换中使用的基函数

图3-1是一个8×8的基函数示意图,从中拿出了6个基函数并做出其在二维平面上

的示意图。这些基函数是不变的,在DCT变换中,这些基函数将与空间域中的每一个元

素进行分别相乘,并将结果累加起来,就完成了空间域到频率域的初步变换。此时还需要

两步就可以完成DCT变换:1.将第0行和第0列的值除以2(也就是说,[0,0]要除以

4)。2.所有64个元素都除以16。

DCT反变换(InverseDCT)更为容易,将频率域中的基函数分别与对应的振幅

(spectrum)相乘并累加,即可得到相应的空间域元素的值。

图3-2JPEG中DCT转换示例

在图3-2中,最右侧的那一栏表示使用不同比特数来表达频率域的效果。原始频率域需

要64个bit来存储,而g对应的频率域使用10个bit来存储频率域中的单个元素,h和i对

应的频率域分别使用8个bit和5个bit。然后对d,e和f分别进行InverseDCT变换,g,h

和i分别是使用原始空间域的值来减掉反变换(IDCT)后得到的残差。从图g可以看出,使用

DCT压缩将一个32bit的块压缩为10bit,但信息损失很小,几乎可以忽略。从图h和i可

以看出,随压缩率的增大,信息损失也逐渐变大。

经过DCT变换,压缩还可以通过丢弃64个振幅(Spectrum)中的一些信息量较小

的元素来实现,这样即可以实现压缩,还可以尽可能最大地保持信息。

图3-3显示了使用不同数量的频率域振幅(Spectrum)所得的重建图像(a,b和c)与

原始图像d的对比效果。从图c可以看出,即使弃掉占总数3/4的高频振幅(Spectrum),

使用占总数1/4的低频振幅(Spectrum)也可以得到与原始图像很接近的结果。而且误差看

起来是随机分布的,可以看作是随机噪声。

图3-3使用不同数量的Spectrum重建JPEG的效果

下面使用JPEG的压缩过程来介绍DCT变换在图像处理中的应用。JPEG的压缩过程

可以分为以下几步:1.将整副图像分解为8×8的小块。2.对每个小块做DCT变换。3.

对变换后得到的频率域使用前面所介绍的方法进行压缩:减少每个元素的bit值以及丢弃

一些元素。通过量化表(QuantizationTable),这两个压缩操作可以一步实现。

图3-4是两个JPEG量化表的示例,频率域中的每个振幅(Spectrum)与量化表中对

应的元素想除,即可得到压缩后的频率域。量化表a的压缩率较低,表b的压缩率比较高。

例如a中最右下角的值为16,将对应振幅(Spectrum)的取值范围由-127–127缩小为

-7–7。而在图b中右下角的值为256,将其清零,相当于将对应的高频信息删除。

图3-4JPEG量化表

JPEG压缩的第四步,8×8的块被扫描为线性序列,扫描顺序如图3-5所示。对块进

行量化处理后,再进行游程编码,那些振幅(Spectrum)为0的元素就被删除掉了。

图3-5线性扫描顺序

JPEG压缩第五步是对线性序列进行游程编码,第六步是对游程编码后的序列进行

Huffman编码。

JPEG的压缩率可以设定,图3-6显示不同压缩率的图像与原始图像的对比。

图3-6不同压缩率的JPEG对比

为什么DCT变换对图像的压缩效果要比DFT好?主要原因是DCT中使用了半周期

的基函数,而DFT使用的是整周期基函数。图像中大部分像素的变化都是渐变的,因此

DCT可以更好地表达图像,从而获得更高的压缩效率。

👁️ 阅读量:0