⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dct-iii.cpp

📁 在matlab中实现DCT变换
💻 CPP
字号:
#include "conio.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "sys/timeb.h"

#define PI 3.14159265359
#define N 16    /*  N 为2的幂  */

double F[2*N+1],C[2*N+1],y[2*N+1];         /*  定义全局变量  */

void BTRVS(double a[],int W,int n)
{
	double t;
	int n1,i,j,k;
	j=1;
	n1=n-1;
	for (i=1;i<=n1;i++)
	{
		if (i<j)
		{
			t=a[j+W-1];
			a[j+W-1]=a[i+W-1];
			a[i+W-1]=t;
		}
		k=n>>1;
		while (k<j)
		{
			j=j-k;
			k=k>>1;
		}
		j=j+k;
	}
}

void COEF(int n)          /*  求变换系数  */
{
	double p,A;
	int n3,i1,n1,i,i2,n2;
	C[1]=sqrt(2.0);
	if (n>2)
	{
		n3=n>>1;
		i1=1;
		n1=1; 
		do
		{
			n1=n1<<1;
			n2=n1<<2;
			p=PI/n2;
			for (i=1;i<=n1;i++)
			{
				i2=(i<<1)-1;
				A=cos(i2*p);
				A=A*2;
				C[i1+i]=1.0/A;
			}
			BTRVS(C,i1+1,n1);      
			i1=i1+n1;
		}
		while (i1<n3);
	}
}

void DCTIII(int m,int n)
{	double t;
	int i0,i,i1,j,j1,n1,k1,k2,n2,n3,n4,i2,i3,n5,n6,k,n0,j2,p;
	for (k=n+1;k<=2*n;k++)
		F[k]=0;
	p=n<<1;
	COEF(p);
	if (p!=4)
	{
		i0=1;
		for (i=3;i<=m+1;i++)
		{
			i1=i0;
			i0=i1<<1;
			for (j=1;j<=i1;j++)
			{
				j1=1-j;
				n1=p+j1;
				k1=i0+j1;
				k2=k1+i0;
				t=F[n1];
				for (k=n1;k>=k2;k=k-i0)
					F[k]+=F[k-i0];
				F[k1]-=t;
			}
		}
	}
	n1=p>>2;
	n2=n1<<1;
	n3=n1+n2;
	n4=n2;
	for (i=1;i<=n1;i++)
	{
		i1=n1+i;
		i2=n2+i;
		i3=n3+i;
		t=F[i];
		F[i]=t+F[i2];
		F[i2]=t-F[i2];
		F[i1]*=C[1];
		F[i3]*=C[1];
	}
	if (p!=4)
	{
		i1=2;
		n0=1;
		for (i=3;i<=m+1;i++)
		{
			n0=n0<<1;
			n5=n0<<1;
			n3=p/(n5<<1);      
			n2=n3<<1;
			n1=n2<<1;
			n5=-n1;
			for (j=1;j<=n0;j++)
			{
				n5=n1+n5;
				n6=n5+n2;
				for (k=1;k<=n2;k++)
				{
					k1=n5+k;
					k2=n6+k;
					t=F[k1];
					F[k1]=t+F[k2];
					F[k2]=t-F[k2];
				}
			}
			i2=i1+n0;
			i3=i1-1;
			n5=n3-n1;
			for (j=1;j<=n0;j++)
			{
				n5=n5+n1;
				n6=n5+n2;
				j1=i3+j;
				j2=i2-j;
				for (k=1;k<=n3;k++)
				{
					k1=n5+k;
					k2=n6+k;
					F[k1]*=C[j1];
					F[k2]*=(-C[j2]);
				}
			}
			i1=i2;
		}
	}
	for (i=1;i<=n4;i++)
	{
		i1=i<<1;
		t=F[i1-1];
		F[i1-1]=t+F[i1];
		F[i1]=t-F[i1];
	}
	BTRVS(F,1,p);
	for (k=1;k<=n;k++)
		F[k]=(F[k]+F[2*n+1-k])/2;
}

int log2(int number)           /* 求N的幂  */
{
	int i;
	i=-1;
	while(1)
	{
		if (number==0) break;
	    number=number>>1;
	    i++;
	}
	return i;
}

void main()            /*  主函数 */
{
	int i,M;
	double ComMs;
	struct _timeb timebuffer,timebuffer2;
	F[0]=0;
  
  /*  随机生成输入序列 */
	/*randomize();*/
	for (i=1;i<=N;i++)
		F[i]=i-1;
 
 
  /*  DWT 过程  */
	M=log2(N);
	_ftime(&timebuffer );
	DCTIII(M,N);
	_ftime(&timebuffer2 );
	ComMs=(timebuffer2.time-timebuffer.time)+float (timebuffer2.millitm-timebuffer.millitm)/1000;
	for (i=1;i<=N;i++)
		printf("F[%d]=%f\n",i,F[i]);
    printf("运算时间为%f秒。\n",ComMs);

	getch();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -