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

📄 recursion.cpp

📁 快速DCT变换 迭代算法
💻 CPP
字号:
/*********************************************************************
*利用zhao等人论文原理的,使用递归方法的DCT程序                       *
*																	 *
**********************************************************************/
#include"stdio.h"
#include"stdlib.h"
#include"math.h"

#define PI 3.14159265358979

double * DCT(double * f,int N);
double sum(double * a,int k);
//   1 迭代变换函数
double * Recursion(double * f,int N)
{
	double * t;
    int i;

	t=DCT(f,N);
	t[0]=(t[0]*2/N/1.41421356237310);
	for(i=1;i<N;i++)
		t[i]=(t[i]*2/N);

	return t;
}



//2  迭代求A函数
double * DCT(double * f,int N)
{
    double *temp1;
	double *temp2;
	int i;

    
	if(N>2)
	{
		temp1=(double *)malloc(N*sizeof(double));
		temp2=(double *)malloc(N*sizeof(double));
		for(i=0;i<=(N/2-1);i++)
		{
			temp1[i]=f[i]+f[N-1-i];

			temp1[i+N/2]=f[i]-f[N-1-i];
			temp1[i+N/2]*=cos(PI*(2*i+1)/2/N);  
		}
		
		f=DCT(temp1,N/2);  //此时前半部分的temp1已是Pn之前的元素  而f指向temp1的首地址
		temp2=DCT(temp1+N/2,N/2);

		for(i=1;i<=(N/2-1);i++)
		{
			temp2[i]=temp2[i]+temp2[i];
		}

		for(i=0;i<=N/2-1;i++)
		{
		    f[i+N/2]=sum(temp2,i);
		}                   //此时f记录的是Pn之前的列向量
    
        for(i=0;i<N;i++)
		{
			if(i%2==0)    temp1[i]=f[i/2];
			else          temp1[i]=f[((i-1+N)/2)];
		}

	}
	else    //N=2时
	{
         temp1=(double *)malloc(2*sizeof(double));
		 temp1[0]=f[0]+f[1];
		 temp1[1]=cos(PI/4)*(f[0]-f[1]);
		 
	}
	return temp1;

}

//3 处理Bn分解第一个矩阵的求和函数 
double sum(double * a,int k)
{
     double sum=0;
	 double sum1=0;
	 double sum2=0;
	 int i;

     if(k%2==0)
	 {
		    sum1=a[0];
			for(i=2;i<=k;i=i+2)
			{
				sum1+=a[i];
				sum2+=a[i-1];
			} 
			sum=sum1-sum2;
	  }
	 else   //k为奇数
	 {
		 for(i=0;i<=k-1;i=i+2)
		 {
			 sum1+=a[i];
			 sum2+=a[i+1];
		 }
		 sum=sum2-sum1;
	 }
	 return sum;
}

⌨️ 快捷键说明

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