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

📄 1d-dct.txt

📁 一个完整的基于DSP的一维DCT变换和逆变换的程序。
💻 TXT
字号:
/*******************************************************************/
#include "exp1_2407.h"
#include "math.h"
#define pi 3.1415927
/*******************************************************************/
  int px[128];
  int pz[128];		
  double x[128],y[128],z[128];
  int n=128;
/*
  x为输入序列,y为DCT变换输出序列,z为重构序列,序列长度为128
  n为DCT变换序列长度
  dct1c2为DCT变换子程序,idct1c2为DCT逆变换子程序
*/ 

void sys_ini()                  //系统初始化子程序
{
     asm(" setc INTM");         //禁止所有中断
     asm(" clrc SXM");          //抑制符号位扩展
     asm(" clrc OVM");          //累加器中结果正常溢出
     * SCSR1=0x81FE;            //配置时钟锁相为4倍频CLKOUT=4*7.3728=29.4912M,使能外部模块
     * WDCR=0x00EF;             //禁止看门狗
     WSGR=0x0049;               //io、ram、program都设为1等待读写
     * IFR=0xFFFF;              //清除所有中断标志,"写1清0"
}

void adc_ini()                  //ADC初始化子程序
{    
     * ADCTRL1=0x25C0;          //仿真器挂起时,完成最后一次ad,start_stop运行模式,
                                //高中断优先级,双排序模式,禁用其他模式
     * ADCTRL2=0x0202;          //禁用中断模式,清中断标志
     * MAXCONV=0x0000;          //启用排序器1,最大转换数为1
     * CHSELSEQ1=0x0000;        //选择模拟输入通道为0通道
}

void read_ad()
{
     int a;
     * ADCTRL2|=0x2000;         //软件启动eoc1--ad转换器
     for(a=0;a<128;a++)
     {       
       px[a]=(* RESULT0>>6);    //读出ad结果
     }
     return;
}
      
interrupt void nothing()
{
     return;
}

  void dct1c2 (double x[], double y[], int n)
  {
  		double s,t;
  		int i,j;
  		s=0.0;
   	for (i=0; i<=n-1; i++)
   	  {
   		s=s+x[i];
   	  }
   	
   	for (i=1; i<=n-1; i++)
      {
   		t=0.0;
   		for (j=0; j<=n-1; j++)
   		  {
   			t=t+x[j]*cos((2.0*j+1)*i*pi/(2.0*n));
   		  }
   		y[i]=sqrt(2.0/n)*t;
   	   }
   	y[0]=s/(sqrt(n/1.0));
  }
  
  void idct1c2(double y[], double z[], int n)
  {
  		double t;
  		int i,j;
  		for (i=0; i<=n-1; i++)
   	 	  {
		    t=0.0;
		    for (j=0; j<=n-1; j++)
		     {
		  	   t=t+y[j]*cos((2.0*i+1)*j*pi/(2.0*n));
		     }
      		z[i]=y[0]/(sqrt(n/1.0))+sqrt(2.0/n)*t;
      	  }
  		
  }
   
int main (void)
{
		int k=0;
		int i,j;		
		int xm,zm; 
		double xmid=0;
  sys_ini();
  adc_ini();  
  for(;;)  
  {
		  xmid=0;
		  for (j=0; j<=2; j++)
		  {
			read_ad();
			for (i=0; i<=127; i++)
			{
				xm = px[i];
				xmid=xmid+xm;
				x[i] = xm;
			}		
		    
		    xmid=xmid/128.0;
		    for(i=0;i<128;i++)
		    {
		      x[i]=x[i]-xmid;
		    }
			dct1c2 (x,y,n);		
			idct1c2 (y,z,n);
				
			for (i=0; i<=127; i++)
			{
				zm=(int)z[i];
				pz[i] = zm;
			}	
		   k=k;
	     }		
  }
}

⌨️ 快捷键说明

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