1 一维转二维
2,清0
3.行提取
4,列提取
5.块提取
5,矩阵转置
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void){
u_int8_t a[]={
0, 1, 2, 3, 4, 5, 6, 7,
8, 9,10,11,12, 13,14,15,
16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31
};
//--------转二维数组(矩阵)-----
u_int8_t b[4][8]={};
// memcpy(b,a,32); //尽量不用此方法,用二维指针方式
u_int8_t (*c)[8]=(u_int8_t (*)[8])a;
//------矩阵清0--------
memset(b,0,32);
//------矩阵提取行--------
memcpy(b,a,32);
u_int8_t o_h[4][8]={};
/* //方法1--------------------
for(int a=0;a<4;a++){
memcpy( &(o_h[a][0]), &(b[a][0]), 8);
}
*/
//方法2-----------------
for(int a=0;a<4;a++){
for(int b=0;b<8;b++){
o_h[a]=c[a];
}
}
//----提取列--------------------不能用memcpy(),只能一个个提取元素,主要用于1D DCT
u_int8_t o_l[8][4]={}; //8个4元素的数组
for(int b=0;b<8;b++){
for(int a=0;a<4;a++){
o_l[a]=c[a];
}
}
//----提取块--------------------------
u_int8_t o_k[32/4][4]={}; //8个2×2 块,可用于YUV420p 比特流亮度排序
int kt=0;
for(int a=0;a<4;a=a+2){
for(int b=0;b<8;b=b+2){
for(int y=0;y<2;y++){
for(int x=0;x<2;x++){
o_k[kt][2*y+x]=c[a+y][b+x];
}
}
kt++;
}
}
//------矩阵转置---------行转为列---------------用于1D DCT
// 倒置必须行与列数相等
u_int8_t d[4][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11},
{12,13,14,15}
};
u_int8_t o_z[4][4]={};
for(int a=0;a<4;a++){
for(int b=0;b<4;b++){
o_z[a]=d[a];
}
}
//----------显示--------------------
for(int a=0;a<4;a++){
for(int b=0;b<4;b++){
printf("%d,",o_z[a] );
}
puts("");
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「乐山劲松」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_59802969/article/details/135726746
|