⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dct_64.cpp

📁 DCT快速算法64位的C语言实现
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			t0[36]*=c_pi_9_128;
			t0[37]*=c_pi_11_128;
			t0[38]*=c_pi_13_128;
			t0[39]*=c_pi_15_128;
			t0[40]*=c_pi_17_128;
			t0[41]*=c_pi_19_128;
			t0[42]*=c_pi_21_128;
			t0[43]*=c_pi_23_128;
			t0[44]*=c_pi_25_128;
			t0[45]*=c_pi_27_128;
			t0[46]*=c_pi_29_128;
			t0[47]*=c_pi_31_128;
			t0[48]*=c_pi_33_128;
			t0[49]*=c_pi_35_128;
			t0[50]*=c_pi_37_128;
			t0[51]*=c_pi_39_128;
			t0[52]*=c_pi_41_128;
			t0[53]*=c_pi_43_128;
			t0[54]*=c_pi_45_128;
			t0[55]*=c_pi_47_128;
			t0[56]*=c_pi_49_128;
			t0[57]*=c_pi_51_128;
			t0[58]*=c_pi_53_128;
			t0[59]*=c_pi_55_128;
			t0[60]*=c_pi_57_128;
			t0[61]*=c_pi_59_128;
			t0[62]*=c_pi_61_128;
			t0[63]*=c_pi_63_128;
		}

		//03_02   t0[32]--t0[63]乘以A32
		{
					
			//03_02_1  f[32]乘以A32分解式右侧的矩阵
			//   32次加法  0 次乘法
			{

				t1[0]=t0[32]+t0[63];      t1[16]=t0[32]-t0[63];
				t1[1]=t0[33]+t0[62];      t1[17]=t0[33]-t0[62];
				t1[2]=t0[34]+t0[61];      t1[18]=t0[34]-t0[61];
				t1[3]=t0[35]+t0[60];      t1[19]=t0[35]-t0[60];
				t1[4]=t0[36]+t0[59];      t1[20]=t0[36]-t0[59];
				t1[5]=t0[37]+t0[58];      t1[21]=t0[37]-t0[58];
				t1[6]=t0[38]+t0[57];      t1[22]=t0[38]-t0[57];
				t1[7]=t0[39]+t0[56];      t1[23]=t0[39]-t0[56];
				t1[8]=t0[40]+t0[55];      t1[24]=t0[40]-t0[55];
				t1[9]=t0[41]+t0[54];      t1[25]=t0[41]-t0[54];
				t1[10]=t0[42]+t0[53];     t1[26]=t0[42]-t0[53];
				t1[11]=t0[43]+t0[52];     t1[27]=t0[43]-t0[52];
				t1[12]=t0[44]+t0[51];     t1[28]=t0[44]-t0[51];
				t1[13]=t0[45]+t0[50];     t1[29]=t0[45]-t0[50];
				t1[14]=t0[46]+t0[49];     t1[30]=t0[46]-t0[49];
				t1[15]=t0[47]+t0[48];     t1[31]=t0[47]-t0[48];

			}

			
			


			//03_02_2  t1[0]--t1[15]乘以A16    记录在f[0]--f[15]里
			//
			{

				//03_02_2_1   t1[16]乘以A16分解式右侧的矩阵
				//      16次加法     0 次乘法
				{
					t2=(double *)malloc(128);     //为t2 分配16 个double的空间
					
					t2[0]=t1[0]+t1[15];		t2[8]=t1[0]-t1[15];
					t2[1]=t1[1]+t1[14];		t2[9]=t1[1]-t1[14];
					t2[2]=t1[2]+t1[13];		t2[10]=t1[2]-t1[13];
					t2[3]=t1[3]+t1[12];		t2[11]=t1[3]-t1[12];
					t2[4]=t1[4]+t1[11];		t2[12]=t1[4]-t1[11];
					t2[5]=t1[5]+t1[10];		t2[13]=t1[5]-t1[10];
					t2[6]=t1[6]+t1[9];		t2[14]=t1[6]-t1[9];
					t2[7]=t1[7]+t1[8];		t2[15]=t1[7]-t1[8];
				}



				//03_02_2_2   t2[0]--t2[7]乘以A8       最后仍保存到t2[0]--t2[7]里
				//
				{
					//03_02_2_2_1   t2[0]--t2[7]乘以A8后分解式右侧的矩阵
					//        8次加法   0次乘法
					{
						t3=(double *)malloc(64);       //为t3 分配8 个double的空间

						t3[0]=t2[0]+t2[7];		t3[4]=t2[0]-t2[7];
						t3[1]=t2[1]+t2[6];		t3[5]=t2[1]-t2[6];
						t3[2]=t2[2]+t2[5];		t3[6]=t2[2]-t2[5];
						t3[3]=t2[3]+t2[4];		t3[7]=t2[3]-t2[4];
					}

					//03_02_2_2_2      t3[0]--t3[3]乘以A4
					//
					{
						//03_02_2_2_2_1       t3[0]--t3[3]乘以A4分解式右侧的矩阵
						//				4次加法     0次乘法
						{
							t4=(double *)malloc(32);		//为t4 分配4 个double的空间

							t4[0]=t3[0]+t3[3];		t4[2]=t3[0]-t3[3];
							t4[1]=t3[1]+t3[2];		t4[3]=t3[1]-t3[2];
						}
						//03_02_2_2_2_2      t4[0]--t4[1]乘以A2    这时可以直接乘了!!!!
						//             2 次加法    1 次乘法
						{
							t5=(double *)malloc(32);		//为t5 分配4 个double的空间
							t5[0]=t4[0]+t4[1];        
							t5[1]=(t4[0]-t4[1])*c_pi_1_4;
						}
						//03_02_2_2_2_3       t4[2]--t4[3]乘以B2
						//				 4次加法   3次乘法
						{
							t4[2]*=c_pi_1_8;		t4[3]*=c_pi_3_8;

							t5[2]=t4[2]+t4[3];		t5[3]=(t4[2]-t4[3])*c_pi_1_4;

							t5[3]=t5[3]+t5[3];

							t5[3]=t5[3]-t5[2];
						}//   此时 t5 记录的是P4之前的列向量
						//03_02_2_2_2_4    t5乘以P4  用t4记录
						{
							t4[0]=t5[0];
							t4[1]=t5[2];
							t4[2]=t5[1];
							t4[3]=t5[3];
						}

					}//此时 t4[0]--t4[3]记录的是乘以A4后的t3[0]--t3[3]元素  t5 已没用

					//03_02_2_2_3        t3[4]--t3[7]乘以B4
					//        
					{
						//03_02_2_2_3_1	  t3[4]--t3[7]乘以B4分解式最右侧的以 cos(PI*(2*i+1)/2/8)为对角元的对角阵
						//            0次加法   4次乘法
						{
							t3[4]*=c_pi_1_16;		t3[5]*=c_pi_3_16;
							t3[6]*=c_pi_5_16;		t3[7]*=c_pi_7_16;
						}

						//03_02_2_2_3_2   接下来 t3[4]--t3[7]乘以A4
						{
							//03_02_2_2_3_2_1         t3[4]--t3[7]乘以A4分解式右侧的矩阵 t5记录
							//				    4次加法     0次乘法
							{
								t5[0]=t3[4]+t3[7];		t5[2]=t3[4]-t3[7];
								t5[1]=t3[5]+t3[6];		t5[3]=t3[5]-t3[6];
							}
							//03_02_2_2_3_2_2    		t5[0]--t5[1]乘以乘以A2    这时可以直接乘了!!!!
							//                  2 次加法    1 次乘法
							{
								t6=(double *)malloc(32);		//为t6 分配4 个double的空间
								t6[0]=t5[0]+t5[1];        
								t6[1]=(t5[0]-t5[1])*c_pi_1_4;
							}
							//03_02_2_2_3_2_3       t5[2]--t5[3]乘以B2
							//				  4次加法   3次乘法
							{
								t5[2]*=c_pi_1_8;		t5[3]*=c_pi_3_8;

								t6[2]=t5[2]+t5[3];		t6[3]=(t5[2]-t5[3])*c_pi_1_4;

								t6[3]=t6[3]+t6[3];

								t6[3]=t6[3]-t6[2];
							}//   此时 t6 记录的是P4之前的列向量
							//03_02_2_2_3_2_4    t6乘以P4   用t5记录
							//
							{
								t5[0]=t6[0];
								t5[1]=t6[2];
								t5[2]=t6[1];
								t5[3]=t6[3];
							}//此时 t5[0]--t5[3]记录的是乘以A4后的t3[4]--t3[7]元素  t6 已没用
						}

						//03_02_2_2_3_3         t5[0]--t5[3]乘以 一二阵 和 正负一阵
						//                9次加法   0次乘法
						{
								t5[1]=t5[1]+t5[1];  t5[2]=t5[2]+t5[2];  t5[3]=t5[3]+t5[3];

								t6[0]=t5[0];
								t6[1]=t5[1]-t5[0];
								t6[2]=t5[0]-t5[1]+t5[2];
								t6[3]=t5[1]-t5[0]+t5[3]-t5[2];

						}
					}// 此时t6[0]--t6[3]记录的是t3[4]--t3[7]乘以B4后的元素
					//03_02_2_2_4         P8之前的t3[0]--t3[7]乘以P8, 仍记录在t2[0]--t2[7]里
					//
					{
						t2[0]=t4[0];
						t2[1]=t6[0];
						t2[2]=t4[1];
						t2[3]=t6[1];
						t2[4]=t4[2];
						t2[5]=t6[2];
						t2[6]=t4[3];
						t2[7]=t6[3];
					}
				}//此时 t2[0]--t2[7]记录的是乘完A8的t2[0]--t2[7]



				//03_02_2_3    t2[8]--t2[15]乘以B8       仍保存到t2[8]--t2[15]里
				{
					//03_02_2_3_1  t2[8]--t2[15]乘以B8分解式最右侧的以 cos(PI*(2*i+1)/2/16)为对角元的对角阵
					//        0次加法    8次乘法
					{
						t2[8]*=c_pi_1_32;		t2[9]*=c_pi_3_32;
						t2[10]*=c_pi_5_32;		t2[11]*=c_pi_7_32;
						t2[12]*=c_pi_9_32;		t2[13]*=c_pi_11_32;
						t2[14]*=c_pi_13_32;		t2[15]*=c_pi_15_32;
					}

					//03_02_2_3_2    接下来 t2[8]--t2[15]乘以A8
					{
						//03_02_2_3_2_1   tt2[8]--t2[15]乘以A8后分解式右侧的矩阵
						//          8次加法   0次乘法
						{
							free(t4);
							t4=(double *)malloc(64);       //重新为t4 分配8 个double的空间

							t4[0]=t2[8]+t2[15];		t4[4]=t2[8]-t2[15];
							t4[1]=t2[9]+t2[14];		t4[5]=t2[9]-t2[14];
							t4[2]=t2[10]+t2[13];	t4[6]=t2[10]-t2[13];
							t4[3]=t2[11]+t2[12];	t4[7]=t2[11]-t2[12];
						}
						//03_02_2_3_2_2      t4[0]--t4[3]乘以A4
						{
							//03_02_2_3_2_2_1    t4[0]--t4[3]乘以A4分解式右侧的矩阵
						   //				4次加法     0次乘法
							{
								t5[0]=t4[0]+t4[3];		t5[2]=t4[0]-t4[3];
								t5[1]=t4[1]+t4[2];		t5[3]=t4[1]-t4[2];

							}
							//03_02_2_3_2_2_2    t5[0]--t5[1]乘以A2    这时可以直接乘了!!!!
							//             2 次加法    1 次乘法
							{
								t6[0]=t5[0]+t5[1];
								t6[1]=(t5[0]-t5[1])*c_pi_1_4;
							}

							//03_02_2_3_2_2_3      t5[2]--t5[3]乘以B2
							//				 4次加法   3次乘法
							{
								t5[2]*=c_pi_1_8;		t5[3]*=c_pi_3_8;

								t6[2]=t5[2]+t5[3];		t6[3]=(t5[2]-t5[3])*c_pi_1_4;

								t6[3]=t6[3]+t6[3];

								t6[3]=t6[3]-t6[2];
							}//   此时 t6 记录的是P4之前的列向量

							//03_02_2_3_2_2_4     t6乘以P4  用t5记录
							{
								t5[0]=t6[0];
								t5[1]=t6[2];
								t5[2]=t6[1];
								t5[3]=t6[3];
							}

						}//此时 t5[0]--t5[3]记录的是乘以A4后的t4[0]--t4[3]元素  t6 已没用

						//03_02_2_3_2_3		t4[4]--t4[7]乘以B4
						//
						{
							//03_02_2_3_2_3_1        t4[4]--t4[7]乘以B4分解式最右侧的以 cos(PI*(2*i+1)/2/8)为对角元的对角阵
							//                 0次加法   4次乘法
							{
								t4[4]*=c_pi_1_16;		t4[5]*=c_pi_3_16;
								t4[6]*=c_pi_5_16;		t4[7]*=c_pi_7_16;
							}
							//03_02_2_3_2_3_2     接下来 t4[4]--t4[7]乘以A4
							{
								//03_02_2_3_2_3_2_1       t4[4]--t4[7]乘以A4分解式右侧的矩阵 t6记录
								//				    4次加法     0次乘法
								{
									t6[0]=t4[4]+t4[7];		t6[2]=t4[4]-t4[7];
									t6[1]=t4[5]+t4[6];		t6[3]=t4[5]-t4[6];

								}
								//03_02_2_3_2_3_2_2      t6[0]--t6[1]乘以乘以A2    这时可以直接乘了!!!!
								//                 2 次加法    1 次乘法
								{
									t7=(double *)malloc(32);		//为t7 分配4 个double的空间
									t7[0]=t6[0]+t6[1];        
									t7[1]=(t6[0]-t6[1])*c_pi_1_4;

								}
								//03_02_2_3_2_3_2_3     t6[2]--t6[3]乘以B2
								//				  4次加法   3次乘法
								{
									t6[2]*=c_pi_1_8;		t6[3]*=c_pi_3_8;

									t7[2]=t6[2]+t6[3];		t7[3]=(t6[2]-t6[3])*c_pi_1_4;

									t7[3]=t7[3]+t7[3];

									t7[3]=t7[3]-t7[2];

								}//  此时    t7 记录的是P4之前的列向量
								//03_02_2_3_2_3_2_4          t7乘以P4   用t6记录
								//
								{
									t6[0]=t7[0];
									t6[1]=t7[2];
									t6[2]=t7[1];
									t6[3]=t7[3];
								}//此时 t6[0]--t6[3]记录的是乘以A4后的t4[4]--t4[7]元素  t7 已没用
							}
							//03_02_2_3_2_3_3      t6[0]--t6[3]乘以 一二阵 和 正负一阵
							//                9次加法   0次乘法
							{
								t6[1]=t6[1]+t6[1];	t6[2]=t6[2]+t6[2];	t6[3]=t6[3]+t6[3];

								
								t7[0]=t6[0];
								t7[1]=t6[1]-t6[0];
								t7[2]=t6[0]-t6[1]+t6[2];
								t7[3]=t6[1]-t6[0]+t6[3]-t6[2];

							}// 此时t7[0]--t7[3]记录的是t4[4]--t4[7]乘以B4后的元素
						}
						//03_02_2_3_2_4      P8之前的43[0]--t4[7]乘以P8,记录在t4[0]--t4[7]里
						{
							t4[0]=t5[0];
							t4[1]=t7[0];
							t4[2]=t5[1];
							t4[3]=t7[1];
							t4[4]=t5[2];
							t4[5]=t7[2];
							t4[6]=t5[3];
							t4[7]=t7[3];
						}
					}//此时t4[0]--t4[7]记录的是乘完A8后的t2[8]--t2[15]

					//03_02_2_3_3    t4[0]--t4[7]乘以 一二阵 和 正负一阵,得到  ,记录在t2[8]--t2[15]里
					{
						t4[1]=t4[1]+t4[1];
						t4[2]=t4[2]+t4[2];
						t4[3]=t4[3]+t4[3];
						t4[4]=t4[4]+t4[4];
						t4[5]=t4[5]+t4[5];
						t4[6]=t4[6]+t4[6];
						t4[7]=t4[7]+t4[7];


						t2[8]=t4[0];
						t2[9]=t4[1]-t2[8];
						t2[10]=t4[2]-t2[9];
						t2[11]=t4[3]-t2[10];
						t2[12]=t4[4]-t2[11];
						t2[13]=t4[5]-t2[12];
						t2[14]=t4[6]-t2[13];
						t2[15]=t4[7]-t2[14];
					}
				}// 此时 t2[8]--t2[15]记录的是乘完B8的t2[8]--t2[15]

				//03_02_2_4    乘完 A8 B8的t2[0]--t2[15] 再乘以P16
				{
					f[0]=t2[0];		f[1]=t2[8];
					f[2]=t2[1];		f[3]=t2[9];
					f[4]=t2[2];		f[5]=t2[10];
					f[6]=t2[3];		f[7]=t2[11];

					f[8]=t2[4];	    f[9]=t2[12];
					f[10]=t2[5];	f[11]=t2[13];
					f[12]=t2[6];	f[13]=t2[14];
					f[14]=t2[7];	f[15]=t2[15];

				}
			}
			free(t2);  free(t3);  free(t4);  free(t5);  free(t6);  free(t7);  
			
			//03_02_3    t1[16]--t1[31]乘以B16
			{
				//03_02_3_1  t1[16]--t1[31]乘以B16分解式最右侧的以 cos(PI*(2*i+1)/2/32)为对角元的对角阵
				//    0次加法   16次乘法
				{
					t1[16]*=c_pi_1_64;		t1[17]*=c_pi_3_64;
					t1[18]*=c_pi_5_64;		t1[19]*=c_pi_7_64;
					t1[20]*=c_pi_9_64;		t1[21]*=c_pi_11_64;
					t1[22]*=c_pi_13_64;		t1[23]*=c_pi_15_64;
					t1[24]*=c_pi_17_64;		t1[25]*=c_pi_19_64;
					t1[26]*=c_pi_21_64;		t1[27]*=c_pi_23_64;
					t1[28]*=c_pi_25_64;		t1[29]*=c_pi_27_64;
					t1[30]*=c_pi_29_64;		t1[31]*=c_pi_31_64;
				}

				//03_02_3_2   t1[16]--t1[31]乘以A16    记录在t1[0]--t1[16]里
				{
					//03_02_3_2_1   t1[16]乘以A16分解式右侧的矩阵
					//      16次加法     0 次乘法
					{
						t2=(double *)malloc(128);     //为t2 分配16 个double的空间
					
						t2[0]=t1[16]+t1[31];		t2[8]=t1[16]-t1[31];
						t2[1]=t1[17]+t1[30];		t2[9]=t1[17]-t1[30];
						t2[2]=t1[18]+t1[29];		t2[10]=t1[18]-t1[29];
						t2[3]=t1[19]+t1[28];		t2[11]=t1[19]-t1[28];
						t2[4]=t1[20]+t1[27];		t2[12]=t1[20]-t1[27];
						t2[5]=t1[21]+t1[26];		t2[13]=t1[21]-t1[26];
						t2[6]=t1[22]+t1[25];		t2[14]=t1[22]-t1[25];
						t2[7]=t1[23]+t1[24];		t2[15]=t1[23]-t1[24];
					}



					//03_02_3_2_2   t2[0]--t2[7]乘以A8       最后仍保存到t2[0]--t2[7]里
					//
					{
						//03_02_3_2_2_1   t2[0]--t2[7]乘以A8后分解式右侧的矩阵
						//        8次加法   0次乘法
						{
							t3=(double *)malloc(64);       //为t3 分配8 个double的空间

							t3[0]=t2[0]+t2[7];		t3[4]=t2[0]-t2[7];
							t3[1]=t2[1]+t2[6];		t3[5]=t2[1]-t2[6];
							t3[2]=t2[2]+t2[5];		t3[6]=t2[2]-t2[5];
							t3[3]=t2[3]+t2[4];		t3[7]=t2[3]-t2[4];
						}

						//03_02_3_2_2_2      t3[0]--t3[3]乘以A4
						//
						{
							//03_02_3_2_2_2_1       t3[0]--t3[3]乘以A4分解式右侧的矩阵
							//				4次加法     0次乘法
							{
								t4=(double *)malloc(32);		//为t4 分配4 个double的空间

								t4[0]=t3[0]+t3[3];		t4[2]=t3[0]-t3[3];
								t4[1]=t3[1]+t3[2];		t4[3]=t3[1]-t3[2];
							}
							//03_02_3_2_2_2_2      t4[0]--t4[1]乘以A2    这时可以直接乘了!!!!
							//             2 次加法    1 次乘法
							{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -