DCT變換編碼及C語言實現

2021-09-02 02:54:03 字數 2523 閱讀 3230

離散余弦變換(discrete cosine transform,簡稱dct變換)是一種與傅利葉變換緊密相關的數**算。在傅利葉級數展開式中,如果被展開的函式是實偶函式,那麼其傅利葉級數中只包含余弦項,再將其離散化可匯出余弦變換,因此稱之為離散余弦變換。

(3)具有較強的抗干擾能力,傳輸過程中的誤碼對影象質量的影響遠小於**編碼。通常,對高質量的影象,dmcp要求通道誤位元速率,而變換編碼僅要求通道誤位元速率。

#include

#include

#include

#include

#define pi 3.1415926

#define clk_tck clocks_per_sec

int n;

void dct(double *f,double *f)

int n,m,x;

double *dtemp=new double[n*n];//中間矩陣

double *coff=new double[n*n];//變換係數

coff[0]=(double)1/sqrt((double)n);

for(m=1;mcoff[m]=sqrt((double)2)/sqrt((double)n);

memset(dtemp,0,sizeof(double)*n*n);

memset(f,0,sizeof(double)*n*n);

//一維變換

for(n=0;nfor(m=0;mfor(x=0;xdtemp[m*n+n]+=coff[m]*f[x*n+n]*cos((2*x+1)*pi*m/(2*n));

//第二次一維變換

for(m=0;mfor(n=0;nfor(x=0;xf[m*n+n]+=coff[n]*dtemp[m*n+x]*cos((2*x+1)*pi*n/(2*n));

delete dtemp;

delete coff;

void idct(double *f,double *f)

int m,y,x;

double *dtemp=new double[n*n];//中間矩陣

double *coff=new double[n*n];//變換係數

coff[0]=1/sqrt((double)n);

for(m=1;mcoff[m]= sqrt((double)2) /  sqrt((double)n);

memset(dtemp,0,sizeof(double)*n*n);

memset(f,0,sizeof(double)*n*n);

//一維變換

for(x=0;xfor(y=0;yfor(m=0;mdtemp[x*n+y]+=coff[m]*f[x*n+m]*cos((2*y+1)*pi*m/(2*n));

//第二次一維變換

for(y=0;yfor(x=0;xfor(m=0;mf[x*n+y]+=coff[m]*dtemp[m*n+y]*cos((2*x+1)*pi*m/(2*n));

delete dtemp;

delete coff;

int main()

clock_t start,end;

start=clock();

int i;

long l;

printf("變換維數:");

scanf("%d",&n);

double *f=new double[n*n];//初始矩陣

double *f=new double[n*n];//變換後輸出矩陣

memset(f,0,sizeof(double)*n*n);//初始化為0

for(i=0;iprintf("f[%d][%d]:",i/n,i%n);

scanf("%lf",&f[i]);

printf("迴圈次數:");

scanf("%d",&l);

//輸出初始矩陣

printf("變換前:\n");

for(i=1;i<=n*n;i++)

printf("%f\t",f[i-1]);

if(i%n==0)

printf("\n");

for(i=0;idct(f,f);//變換

//輸出變換後矩陣

printf("變換後:\n");

for(i=1;i<=n*n;i++)

printf("%f\t",f[i-1]);

if(i%n==0)

printf("\n");

for(i=0;iidct(f,f);

//輸出反變換後矩陣

printf("反變換後:\n");

for(i=1;i<=n*n;i++)

printf("%f\t",f[i-1]);

if(i%n==0)

printf("\n");

//printf("\n");

delete f;

delete f;

end=clock();

printf("耗時:%f\n",(double)(end-start)/clk_tck);

return 0;

變換編碼(DCT)基本理解

影象變換編碼是指將以空間域中畫素形式描述的影象轉換至變換域,以變換係數的形式加以表示。大部分影象是平坦區域和內容變換緩慢的區域,即大部分是直流和低頻,高頻比較少,所以適當的變換可以使影象能量在空間域的分散分布轉換為在變換域的相對集中分布,以達到去除冗餘的目的,結合量化,z 掃瞄和熵編碼等其他編碼技術...

DCT變換及matlab實現

一維的dct變換共有8種,其中最實用的是第二種形式,公式如下 其中c u 是加上去乙個係數,為了能使dct變換矩陣成為正交矩陣,在後面二維變換將看到他的作用。n是f x 的總數。相比其他幾種形式,他的運算還是比較簡單的,因此也用的比較廣。clc clear in 1 8 n 8 for i 0 n ...

行程編碼c語言實現

題目要求 如一字串為aaaaaabcccc12344 有6個a,則編碼為6a,對於單個出現的字元,如b,則以1開始和結束對其編碼成 1b1 對不重複的字串如123,要以1開頭,1結尾 編為11231 且不重複字串中若含有1,在前述基礎上在其前面再加1,最後為111231,最終編碼為6a1b14c11...