BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #3036同步于 2008/3/28
Matlab机器人发帖

【求助】关于DCT变换

huicai1984
2008/3/28镜像同步0 回复
我用C#实现的快速DCT算法,和在matlab下得到的DCT变换,结果差太多了。 using System; namespace DCT { /// <summary> /// /// </summary> public class FDCT { public FDCT(params float[] data) { // // TODO: 在此处添加构造函数逻辑 // for(int i=0;i<64;i++) { this.data[i] = data[i]; } } public FDCT() { } private float tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7; private float tmp10,tmp11,tmp12,tmp13; private float z1,z2,z3,z4,z5,z11,z13; private float[] data = new float[8*8]; public void show() { for(int i=0;i<64;i++) { Console.Write(data[i]+"\t"); if((i+1)%8==0) Console.WriteLine(); } Console.WriteLine(); JPEG_FDCT(); for(int i=0;i<64;i++) { Console.Write(data[i]+"\t"); if((i+1)%8==0) Console.WriteLine(); } Console.ReadLine(); } private void JPEG_FDCT() { //第一部分:按行计算 for(int i=7;i>=0;i--) { int c = (7-i)*8; tmp0 = data[c+0] + data[c+7]; tmp7 = data[c+0] - data[c+7]; tmp1 = data[c+1] + data[c+6]; tmp6 = data[c+1] - data[c+6]; tmp2 = data[c+2] + data[c+5]; tmp5 = data[c+2] - data[c+5]; tmp3 = data[c+3] + data[c+4]; tmp4 = data[c+3] - data[c+4]; //对偶数项计算 tmp10 = tmp0 + tmp3; tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; data[c+0] = tmp10 + tmp11; data[c+4] = tmp10 - tmp11; z1 = (tmp12 + tmp13)*((float)0.707106781); data[c+2] = tmp13 + z1; data[c+6] = tmp13 - z1; //对奇数项计算 tmp10 = tmp4 + tmp5; tmp11 = tmp5 + tmp6; tmp12 = tmp6 + tmp7; z5 = (tmp10 - tmp12)*((float)0.382683433); z2 = ((float)0.541196100) * tmp10 + z5; z4 = ((float)1.306562965) * tmp12 + z5; z3 = tmp11 * ((float)0.707106781); z11 = tmp7 + z3; z13 = tmp7 - z3; data[c+5] = z13 + z2; data[c+3] = z13 - z2; data[c+1] = z11 + z4; data[c+7] = z11 - z4; } //第二部分:按列计算 for(int i=7;i>=0;i--) { int c = 7-i; tmp0 = data[0*8+c] + data[7*8+c]; tmp7 = data[0*8+c] - data[7*8+c]; tmp1 = data[1*8+c] + data[6*8+c]; tmp6 = data[1*8+c] - data[6*8+c]; tmp2 = data[2*8+c] + data[5*8+c]; tmp5 = data[2*8+c] - data[5*8+c]; tmp3 = data[3*8+c] + data[4*8+c]; tmp4 = data[3*8+c] - data[4*8+c]; //对偶数项计算 tmp10 = tmp0 + tmp3; tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; data[0*8+c] = tmp10 + tmp11; data[4*8+c] = tmp10 - tmp11; z1 = (tmp12 + tmp13)*((float)0.707106781); data[2*8+c] = tmp13 + z1; data[6*8+c] = tmp13 - z1; //对奇数项计算 tmp10 = tmp4 + tmp5; tmp11 = tmp5 + tmp6; tmp12 = tmp6 + tmp7; z5 = (tmp10 - tmp12)*((float)0.382683433); z2 = ((float)0.541196100) * tmp10 + z5; z4 = ((float)1.306562965) * tmp12 + z5; z3 = tmp11 * ((float)0.707106781); z11 = tmp7 + z3; z13 = tmp7 - z3; data[5*8+c] = z13 + z2; data[3*8+c] = z13 - z2; data[1*8+c] = z11 + z4; data[7*8+c] = z11 - z4; } } } } using System; namespace DCT { /// <summary> /// Class1 的摘要说明。 /// </summary> class DCT { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // const int DCTSIZE = 8; float[] data = new float[DCTSIZE*DCTSIZE]{132,136,138,140,144,145,147,155, 136,140,140,147,140,148,155,156, 140,143,144,148,150,152,154,155, 144,144,146,145,149,150,153,160, 150,152,155,156,150,145,144,140, 144,145,146,148,143,158,150,140, 150,156,157,156,140,146,156,145, 148,145,146,148,156,160,140,145}; FDCT ff = new FDCT(data); ff.show(); } } } 我的问题是为什么我得出的数据不太正常:如下: 输入: 132 136 138 140 144 145 147 155 136 140 140 147 140 148 155 156 140 143 144 148 150 152 154 155 144 144 146 145 149 150 153 160 150 152 155 156 150 145 144 140 144 145 146 148 143 158 150 140 150 156 157 156 140 146 156 145 148 145 146 148 156 160 140 145 输出:(第一列) 9436 -190.7696 -45.45584 -22.16196 -3617.15691 5.455843 -12.22538 这个例子再matlab中的输出第一个数据应该是172,可我从程序来看第一个数据似乎是原矩阵数据之和? 不知道是什么问题?小弟初学,对这个快速算法还不太理解,希望热心人解释一下,多谢!!
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。