не то чтобы на delphi, но там и так все понятно
Код
#include <math.h>
const double PI=3.1415926535897932384626433832795;
#define DCTSIZE 16
double C[DCTSIZE][DCTSIZE];
void InitDCT(){
int i,j;
for (i=0;i<DCTSIZE;++i){
for (j=0;j<DCTSIZE;++j){
C[i][j]=cos((double) ( (double) ( (double)(2*i+1)*(double)j*PI)/(double)(2.0*DCTSIZE)));
}
}
}
inline double L(int i){
if (i==0) return sqrt(1.0/DCTSIZE);
return sqrt(2.0/DCTSIZE);
}
void DCT(double inbuf[DCTSIZE][DCTSIZE],double outbuf[DCTSIZE][DCTSIZE]){
for (int u=0;u<DCTSIZE;++u){
for (int v=0;v<DCTSIZE;++v){
outbuf[u][v]=0.0;
for (int i=0;i<DCTSIZE;++i){
for (int j=0;j<DCTSIZE;++j){
outbuf[u][v]+=C[i][u]*C[j][v]*inbuf[i][j];
}
}
outbuf[u][v]*=L(u);
outbuf[u][v]*=L(v);
}
}
}
void IDCT(double inbuf[DCTSIZE][DCTSIZE],double outbuf[DCTSIZE][DCTSIZE]){
for (int i=0;i<DCTSIZE;++i){
for (int j=0;j<DCTSIZE;++j){
outbuf[i][j]=0.0;
for (int u=0;u<DCTSIZE;++u){
for (int v=0;v<DCTSIZE;++v){
outbuf[i][j]+=L(u)*L(v)*C[i][u]*C[j][v]*inbuf[u][v];
}
}
}
}
}