dct余弦离散c语言,离散余弦变换C语言实现(DCT)

离散余弦变换 实现了一维DCT、二维DCT及其反变换

void initDCTParam(int deg)

{

// deg 为DCT变换数据长度的幂

if(bHasInit)

{

return; //不用再计算查找表

}

int total, halftotal, i, group, endstart, factor;

total = 1 << deg;

if(C != NULL) delete []C;

C = (double *)new double[total];

halftotal = total >> 1;

for(i=0; i < halftotal; i++)

C[total-i-1]=(double)(2*i+1);

for(group=0; group < deg-1; group++)

{

endstart=1 << (deg-1-group);

int len = endstart >> 1;

factor=1 << (group+1);

for(int j = 0;j < len; j++)

C[endstart-j-1] = factor*C[total-j-1];

}

for(i=1; i < total; i++)

C[i] = 2.0*cos(C[i]*PI/(total << 1)); ///C[0]空着,没使用

bHasInit=true;

}

DCT变换过程可分为两部分:前向追底和后向回根

前向追底:

void dct_forward(double *f,int deg)

{

// f中存储DCT数据

int i_deg, i_halfwing, total, wing, wings, winglen, halfwing;

double temp1,temp2;

total = 1 << deg;

for(i_deg = 0; i_deg < deg; i_deg++)

{

wings = 1 << i_deg;

winglen = total >> i_deg;

halfwing = winglen >> 1;

for(wing = 0; wing < wings; wing++)

{

for(i_halfwing = 0; i_halfwing < halfwing; i_halfwing++)

{

temp1 = f[wing*winglen+i_halfwing];

temp2 = f[(wing+1)*winglen-1-i_halfwing];

if(wing%2)

swap(temp1,temp2); // 交换temp1与temp2的值

f[wing*winglen+i_halfwing] = temp1+temp2;

f[(wing+1)*winglen-1-i_halfwing] =

(temp1-temp2)*C[winglen-1-i_halfwing];

}

}

}

}

后向回根: void dct_backward(double *f,int deg)

{

// f中存储DCT数据

int total,i_deg,wing,wings,halfwing,winglen,i_halfwing,temp1,temp2;

total = 1 << deg;

for(i_deg = deg-1; i_deg >= 0; i_deg--)

{

wings = 1 << i_deg;

winglen = 1 << (deg-i_deg);

halfwing = winglen >> 1;

for(wing = 0; wing < wings; wing++)

{

for(i_halfwing = 0; i_halfwing < halfwing; i_halfwing++)

{

//f[i_halfwing+wing*winglen] = f[i_halfwing+wing*winglen];

if(i_halfwing == 0)

{

f[halfwing+wing*winglen+i_halfwing] =

0.5*f[halfwing+wing*winglen+i_halfwing];

}

else

{

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值