📄 one_d.float.c
字号:
/* #include <ops/custom_defs.h> */
/* #include "tc.h" */
#include <math.h>
#define M_SQRT1_2 0.70710678118654752440
#define M_PI 3.14159265358979323846
#define s2 sqrt(2.)
#define _(a, b) s2*(a), s2*(b)
#define MASK1 _(cos(2*M_PI/16.)-cos(6*M_PI/16.), -cos(6*M_PI/16.)-cos(2*M_PI/16.))
#define MASK2 _(cos(6*M_PI/16.)+cos(2*M_PI/16.), cos(2*M_PI/16.)-cos(6*M_PI/16.))
#define MASK3 _(1, 1)
#define MASK4 _(1, -1)
#define D0 _(cos(3*M_PI/16.)-cos(5*M_PI/16.), cos(M_PI/16.)+cos(7*M_PI/16.))
#define D1 _(cos(7*M_PI/16.)-cos(M_PI/16.),-cos(3*M_PI/16.)-cos(5*M_PI/16.))
#define D2 _(cos(M_PI/16.)-cos(7.*M_PI/16.), cos(3.*M_PI/16.)-cos(5.*M_PI/16.))
#define D3 _(-cos(3.*M_PI/16.)-cos(5.*M_PI/16.), cos(M_PI/16.)+cos(7.*M_PI/16.))
#define D4 _(cos(M_PI/16.)+cos(7.*M_PI/16.), -cos(3.*M_PI/16.)-cos(5.*M_PI/16.))
#define D5 _(-cos(3.*M_PI/16.)+cos(5.*M_PI/16.), cos(7.*M_PI/16.)-cos(M_PI/16.))
#define D6 _(cos(3.*M_PI/16.)+cos(5.*M_PI/16.), -cos(7.*M_PI/16.)+cos(M_PI/16.))
#define D7 _(cos(M_PI/16.)+cos(7.*M_PI/16.), cos(3.*M_PI/16.)-cos(5.*M_PI/16.))
#define C0 _(- (cos(3.*M_PI/16.) + sin(3.*M_PI/16.)), cos(M_PI/16.) + sin( M_PI/16.))
#define C1 _(cos(3.*M_PI/16.) - sin(3.*M_PI/16.), sin( M_PI/16.) - cos( M_PI/16.))
#define C2 _(- sqrt(2.) * sin(3.*M_PI/16.), - sqrt(2.) * cos( M_PI/16.))
#define C3 _( sqrt(2.) * cos(3.*M_PI/16.), - sqrt(2.) * sin( M_PI/16.))
#define C4 _( sqrt(2.) * cos(3.*M_PI/16.), sqrt(2.) * sin( M_PI/16.))
#define C5 _( sqrt(2.) * sin(3.*M_PI/16.), - sqrt(2.) * cos( M_PI/16. ))
#define C6 _( cos(3.*M_PI/16.)-sin(3.*M_PI/16.), cos(M_PI/16.)-sin( M_PI/16.))
#define C7 _( cos(3.*M_PI/16.)+sin(3.*M_PI/16.), cos(M_PI/16.)+sin( M_PI/16.))
#define C8 _(1, 1)
#define C9 _(1, -1)
#define C10 _(sqrt(2.) * cos( M_PI/8.), sqrt(2.) * cos( 3.*M_PI/8.))
#define C11 _(sqrt(2.) * cos( 3.*M_PI/8.), - sqrt(2.) * cos( M_PI/8.))
int scale = 1;
void print_mask(char *str, double d1, double d2)
{
unsigned short w1, w2;
double sqrt();
w1 = d1 * (1 << 14);
w2 = d2 * (1 << 14);
printf("#define %s %04x%04x\n", str, w1, w2);
}
main(int argc, char **argv)
{
int i, j, dataword;
short data[8] ;
if (argc > 1 && !strcmp(argv[1], "-scale"))
scale = atoi(argv[2]);
if (argc > 1 && !strcmp(argv[1], "-idctmask")) {
/* Use the following to output masks */
print_mask("MASK1", MASK1);
print_mask("MASK2", MASK2);
print_mask("MASK3", MASK3);
print_mask("MASK4", MASK4);
print_mask("D0", D0);
print_mask("D1", D1);
print_mask("D2", D2);
print_mask("D3", D3);
print_mask("D4", D4);
print_mask("D5", D5);
print_mask("D6", D6);
print_mask("D7", D7);
exit (0);
}
if (argc > 1 && !strcmp(argv[1], "-dctmask")) {
/* Use the following to output dct masks */
print_mask("C0", C0);
print_mask("C1", C1);
print_mask("C2", C2);
print_mask("C3", C3);
print_mask("C4", C4);
print_mask("C5", C5);
print_mask("C6", C6);
print_mask("C7", C7);
print_mask("C8", C8);
print_mask("C9", C9);
print_mask("C10", C10);
print_mask("C11", C11);
exit(0);
}
for (j=0; j<8; j++) {
for (i=0; i<8; i++) {
scanf("%d", &dataword);
data[i] = dataword * scale;
}
one_d_idct(data);
for (i= 0; i<8; i++) printf("%d ", data[i]);
printf("\n");
}
}
#define PACK(x, y, a, b) x = a; y = b;
double
IFIR(double cx, double cy, double wa, double wb)
{
return cx*wa + cy*wb ;
}
one_d_idct(short * data)
{
double z2a, z3a, z5a, z0a, z2b, z3b, z5b, z0b;
double tmp22, tmp23, tmp20, tmp21;
double tmp10, tmp13, tmp11, tmp12;
double tmp0, tmp1, tmp2, tmp3;
PACK(z0a, z0b, data[0], data[4]) ;
PACK(z2a, z2b, data[1], data[5]);
PACK(z5a, z5b, data[2], data[6]);
PACK(z3a, z3b, data[3], data[7]);
tmp22 = IFIR(z5a, z5b, MASK1);
tmp23 = IFIR(z5a, z5b, MASK2);
tmp20 = IFIR(z0a, z0b, MASK3) ;
tmp21 = IFIR(z0a, z0b, MASK4) ;
tmp10 = tmp20 + tmp23;
tmp13 = tmp20 - tmp23;
tmp11 = tmp21 + tmp22;
tmp12 = tmp21 - tmp22;
tmp0 = IFIR(z2a, z2b, D0) + IFIR(z3a, z3b, D1);
tmp1 = IFIR(z2a, z2b, D2) + IFIR(z3a, z3b, D3);
tmp2 = IFIR(z2a, z2b, D4) + IFIR(z3a, z3b, D5);
tmp3 = IFIR(z2a, z2b, D6) + IFIR(z3a, z3b, D7);
data[0] = tmp11 + tmp2;
data[1] = tmp10 + tmp3;
data[2] = tmp13 + tmp0;
data[3] = tmp12 + tmp1;
data[4] = tmp12 - tmp1;
data[5] = tmp13 - tmp0;
data[6] = tmp10 - tmp3;
data[7] = tmp11 - tmp2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -