📄 dct_2d.c
字号:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define invroot2 0.7071067814
#define VERBOSE 0
static double *g= NULL;
static double two_over_sqrtncolsnrows = 0.0;
static int ncolsvalue = 0;
static int nrowsvalue = 0;
static void initfct2d(int nrows, int ncols){
if(VERBOSE) printf("FCT2D -- Initialising for new nrows=%d\n",nrows);
if ((nrows<=0)||(ncols<0)){
printf("FCT2D -- ncols=%d or nrows=%d is <=0\n",nrows,ncols);
exit(1);
}
if(g != NULL) free(g);
g = (double *)calloc(nrows,sizeof(double));
if(g == NULL){
printf("FCT2D -- Unable to allocate g array\n");
exit(1);
}
ncolsvalue = ncols;
nrowsvalue = nrows;
two_over_sqrtncolsnrows = 2.0/sqrt(ncols*1.0*nrows);
}
void fct2d(double f[], int nrows, int ncols)
/* CALL THIS FOR FORWARD 2d DCT DON-MONRO PREFERRED SCALING */
{
int u,v;
if ((ncols!=ncolsvalue)||(nrows!=nrowsvalue)){
initfct2d(nrows,ncols);
}
for (u=0; u<=nrows-1; u++){
fct_noscale(&f[u*ncols],ncols);
}
for (v=0; v<=ncols-1; v++){
for (u=0; u<=nrows-1; u++){
g[u] = f[u*ncols+v];
}
fct_noscale(g,nrows);
for (u=0; u<=nrows-1; u++){
f[u*ncols+v] = g[u]*two_over_sqrtncolsnrows;
}
}
}
void ifct2d(double f[], int nrows, int ncols)
/* CALL THIS FOR INVERSE 2d DCT DON-MONRO PREFERRED SCALING */
{
int u,v;
if ((ncols!=ncolsvalue)||(nrows!=nrowsvalue)){
initfct2d(nrows,ncols);
}
for (u=0; u<=nrows-1; u++){
ifct_noscale(&f[u*ncols],ncols);
}
for (v=0; v<=ncols-1; v++){
for (u=0; u<=nrows-1; u++){
g[u] = f[u*ncols+v];
}
ifct_noscale(g,nrows);
for (u=0; u<=nrows-1; u++){
f[u*ncols+v] = g[u]*two_over_sqrtncolsnrows;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -