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

📄 cochlear1.c

📁 这是一个在TMS5509A平台上运行的工程
💻 C
📖 第 1 页 / 共 3 页
字号:
	),
	(DMA_AdrPtr)(MCBSP_ADDR(DRR11)),	// DMACSSAL
	0,									// DMACSSAU
	(DMA_AdrPtr)&AUDIO_DATA0,			// DMACDSAL
	0,									// DMACDSAU
	AMOUNT_DATA_FRAME,					// DMACEN
	1,									// DMACFN
	0,									// DMACSFI
	0,									// DMACSEI
	0,									// DMACDFI
	0									// DMACDFI
};

/******************************************************************************/
void FIRfilter(int n,int s,int d,int length,long *xin,long *x1,long *xout,long *h)
{
   int i,k;
   long sum;
   for(i=0;i<3*AMOUNT_DATA_FRAME;i++)
      *(x1+n+i-1)=*(xin+i);
   for(i=0;i<length;i++)
   {
      sum=0;
      for(k=0;k<n;k++)
         sum+=*(h+k)*(*(x1+s+i*d-k+n-1));
      *(xout+s+i*d)=sum;//>>15;
   }
   for(i=0;i<(n-1);i++)
      *(x1+n+i-2)=*(xin+3*AMOUNT_DATA_FRAME-1-i);
}    


/*==============================================================*/
main()
{
	float alpha=-0.9375;	//预加重系数
	Uint16 i,j;
	Uint16 srcAddrHi, srcAddrLo;
	Uint16 dstAddrHi, dstAddrLo;
    Uint16 process_data0_mark;
    Uint16 process_data1_mark; 
    Uint16 process_data2_mark;
    Uint16 process_data3_mark;
    int *p1,*p2,*p3; 
    long temp0,temp1;
    long electrode_select;		// Electrode Select
    long pulse_width;			// Pulse Width
    long h2[L2]={22,3544,543,5432,22,4,509,389,12,2000,22,3544,543,5432,22,4,509,389,12,2000,22,3544,543,5432,22,4,509,389,12,2000,145};
    long X1[3*AMOUNT_DATA_FRAME];
    long OUT0[3*AMOUNT_DATA_FRAME];
    long OUT1[3*AMOUNT_DATA_FRAME];
    long OUT2[3*AMOUNT_DATA_FRAME];
    long OUT3[3*AMOUNT_DATA_FRAME];
    long h1[N][L1]={{22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509},
                    {22,3544,543,5432,22,4,509}};
    long X2[N][3*AMOUNT_DATA_FRAME+L1-1];
    long X3[N][3*AMOUNT_DATA_FRAME+L1-1];
    long Y[N][3*AMOUNT_DATA_FRAME];
    long *px1,*ph2,*po,*p_code;
    long (*ph1)[L1];
    long (*px2)[3*AMOUNT_DATA_FRAME+L1-1];
    long (*px3)[3*AMOUNT_DATA_FRAME+L1-1];
    long (*py)[3*AMOUNT_DATA_FRAME];
    
/* 	Initialize CSL Library */
	CSL_init();

/*	Set I/O Direction */
	GPIO_RSET(IODIR,0xFF);
	GPIO_RSET(IODATA,0x3F);			// Light Green LED,Pulse Data Line is Low

/*	Initialize DSP Clock */
	CHIP_RSET(XBSR,0x8001);			// Disable CLKOUT,Full EMIF mode, McBSP1 Mode, McBSP2 Mode
	PLL_config(&ConfigPLL);			// Set CPU Clock = 15/1 clkin = 184.32MHz

/*	Initialize I2C */
	I2C_setup(&Init_I2C);
	init_WM8950();					// Initialize WM8950

/*	Initialize SDRAM */
	EMIF_config(&ConfigSDRAM);		// Config SDRAM

	AUDIO_DATA_SECTION = 0;
	delay();
	
/*	change the word address to a byte address for the DMA transfer */ 
	srcAddrHi = (Uint16)(((Uint32)(DMAConfig_Rcv.dmacssal)) >> 15) & 0xFFFFu;
	srcAddrLo = (Uint16)(((Uint32)(DMAConfig_Rcv.dmacssal)) << 1) & 0xFFFFu;
	dstAddrHi = (Uint16)(((Uint32)(DMAConfig_Rcv.dmacdsal)) >> 15) & 0xFFFFu;
	dstAddrLo = (Uint16)(((Uint32)(DMAConfig_Rcv.dmacdsal)) << 1) & 0xFFFFu;
	DMAConfig_Rcv.dmacssal = (DMA_AdrPtr)srcAddrLo;
	DMAConfig_Rcv.dmacssau = srcAddrHi;
	DMAConfig_Rcv.dmacdsal = (DMA_AdrPtr)dstAddrLo;
	DMAConfig_Rcv.dmacdsau = dstAddrHi;

	IRQ_setVecs((Uint32)(&VECSTART));	// Set IVPH/IVPD to start of interrupt vector table

	mhTimer0 = TIMER_open(TIMER_DEV0, TIMER_OPEN_RESET);	// Open Timer0, set registers to power on defaults
	mhTimer1 = TIMER_open(TIMER_DEV1, TIMER_OPEN_RESET);	// Open Timer1, set registers to power on defaults
	Timer0_eventId = TIMER_getEventId(mhTimer0);			// Get EventId's associated with Timer0 for use with CSL interrupt enable functions
	Timer1_eventId = TIMER_getEventId(mhTimer1);			// Get EventId's associated with Timer1 for use with CSL interrupt enable functions
	mhMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);	// Open MCBSP Port 1 and set registers to their power on defaults
	mhDmaRcv = DMA_open(DMA_CHA0,DMA_OPEN_RESET);			// Open DMA Channel 0 and set registers to their power on defaults
	DMA_rcvEventId = DMA_getEventId(mhDmaRcv);				// Get EventId's associated with DMA Channel 0 receive for use with CSL interrupt enable functions

/*	Initialize IRQ */
	IRQ_globalDisable();						// Disable Global IRQ
	IRQ_clear(IRQ_EVT_INT0);					// Clear INT0 Status Bit
	IRQ_clear(IRQ_EVT_INT1);					// Clear INT1 Status Bit
	IRQ_clear(IRQ_EVT_INT2);					// Clear INT2 Status Bit
	IRQ_clear(Timer0_eventId);					// Clear any pending Timer interrupts
	IRQ_clear(Timer1_eventId);					// Clear any pending Timer interrupts
    IRQ_clear(DMA_rcvEventId);					// Clear any pending DMA Channel 0 receiver interrupts

	IRQ_plug(IRQ_EVT_INT0,&Power_Switch_Isr);	// Place address of interrupt service routines at associated vector location
	IRQ_plug(IRQ_EVT_INT1,&Signal_Alter_Isr);
	IRQ_plug(IRQ_EVT_INT2,&Alert_Bat_Isr);
	IRQ_plug(Timer0_eventId,&Timer0_Isr);
	IRQ_plug(Timer1_eventId,&Timer1_Isr);
	IRQ_plug(DMA_rcvEventId,&DMA_rcv_Isr);

	IRQ_enable(IRQ_EVT_INT0);				// Enable INT0
	IRQ_enable(IRQ_EVT_INT1);				// Enable INT1
	IRQ_enable(IRQ_EVT_INT2);				// Enable INT2
	IRQ_enable(Timer0_eventId);				// Enable Timer0 interrupt
	IRQ_enable(Timer1_eventId);				// Enable Timer1 interrupt
    IRQ_enable(DMA_rcvEventId);				// Enable DMA Channel 0 receive interrupt

	TIMER_config(mhTimer0, &timCfg0);		// Write values from configuration structure to Timer0 control regs
	TIMER_config(mhTimer1, &timCfg1);		// Write values from configuration structure to Timer1 control regs
    MCBSP_config(mhMcbsp, &Config_MCBSP);	// Write values from configuration structure to MCBSP1 control regs
	DMA_config(mhDmaRcv, &DMAConfig_Rcv);	// Write values from configuration structure to DMA Channel 0 control regs

	DMA_RSET(DMAGCR,0x0004);					// Set FREE Bit in Global Control Register 
	DMA_RSET(DMAGSCR,0x0001u);					// Enhance DMA Mode
	DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);	// ENDPROG = 1;

	delay();
	IRQ_clear(DMA_rcvEventId);					// Clear any pending DMA Channel 0 receiver interrupts	
	IRQ_globalEnable();							// Enable Global IRQ

	TIMER_FSET(TCR0,TLB,TIMER_TCR_TLB_NORESET);	// Timer0: TLB = 0;
	TIMER_FSET(TCR1,TLB,TIMER_TCR_TLB_NORESET);	// Timer1: TLB = 0;
    MCBSP_start(mhMcbsp,MCBSP_RCV_START, 0);	// Enable MCBSP1 Receiver
    DMA_start(mhDmaRcv);						// Enable DMA Channel 0 Receiver

    /*Initialize*/ 
    for(i=0;i<3*AMOUNT_DATA_FRAME;i++)
    {
       OUT0[i]=0;
       OUT1[i]=0;
       OUT2[i]=0;
       OUT3[i]=0;
    }    
    
    while(AUDIO_DATA_SECTION < 3);
    
    while(1)
    {
		process_data0_mark=0;
		process_data1_mark=0;
		process_data2_mark=0;
		process_data3_mark=0;
		
		/*取数据*/
        
        switch(AUDIO_DATA_SECTION)
        {
           case 0:
                  p1=AUDIO_DATA1;
                  p2=AUDIO_DATA2;
                  p3=AUDIO_DATA3;
                  process_data0_mark=1;
                  po=OUT1;
                  break;
           case 1:
                  p1=AUDIO_DATA2;
                  p2=AUDIO_DATA3;
                  p3=AUDIO_DATA0;
                  process_data1_mark=1;
                  po=OUT2;
                  break;
           case 2:
                  p1=AUDIO_DATA3;
                  p2=AUDIO_DATA0;
                  p3=AUDIO_DATA1;
                  process_data2_mark=1;
                  po=OUT3;
                  break;
           case 3:
                  p1=AUDIO_DATA0;
                  p2=AUDIO_DATA1;
                  p3=AUDIO_DATA2;
                  process_data3_mark=1;
                  po=OUT0;
                  break;
           default:
                   printf("error\n");
        }
		
/********************************/
/*		Process Program			*/
/********************************/
        /*预加重*/
    
        px1=X1;
        *px1=(long)*p1;
        *(px1+AMOUNT_DATA_FRAME)=(long)(*p2)+(long)(*(p1+AMOUNT_DATA_FRAME-1));
        *(px1+2*AMOUNT_DATA_FRAME)=(long)(*p3)+(long)(*(p2+AMOUNT_DATA_FRAME-1));
        for(i=1;i<AMOUNT_DATA_FRAME;i++)
        {
            *(px1+i)=(long)(*(p1+i))+(long)(*(p1+i-1)*alpha);
            *(px1+AMOUNT_DATA_FRAME+i)=(long)(*(p2+i))+(long)(*(p2+i-1)*alpha);
            *(px1+2*AMOUNT_DATA_FRAME+i)=(long)(*(p3+i))+(long)(*(p3+i-1)*alpha);
        }

        /*带通滤波器组分频带*/
        
        px2=X2;
        py=Y;
        ph1=h1;
        for(j=0;j<N;j++)
        {
           FIRfilter(L1,0,1,3*AMOUNT_DATA_FRAME,px1,*(px2+j),*(py+j),*(ph1+j));
           /*全波整流*/
           for(i=0;i<3*AMOUNT_DATA_FRAME;i++)
           {
              if(*(*(py+j)+i)<0)
                 *(*(py+j)+i)=0-*(*(py+j)+i);
           } 
        }
          
        /*低通滤波*/

        px3=X3;
        ph2=h2;
        for(j=0;j<N;j++)
        {
           FIRfilter(L2,j,16,3*AMOUNT_DATA_FRAME/16,*(py+j),*(px3+j),po,ph2);
        }
        
        /*存数据*/
        
        switch(AUDIO_DATA_SECTION)
        {
           case 0:
                  p_code=PULSE_DATA1;
                  for(i=0;i<AMOUNT_DATA_FRAME;i++)
                     *(p_code+i)=((OUT3[160+i]+OUT0[80+i]+OUT1[i])/3)>>22;
                  break;   
           case 1:
                  p_code=PULSE_DATA0;
                  for(i=0;i<AMOUNT_DATA_FRAME;i++)
                     *(p_code+i)=((OUT0[160+i]+OUT1[80+i]+OUT2[i])/3)>>22;
                  break; 
           case 2:
                  p_code=PULSE_DATA1;
                  for(i=0;i<AMOUNT_DATA_FRAME;i++)
                     *(p_code+i)=((OUT1[160+i]+OUT2[80+i]+OUT3[i])/3)>>22;
                  break; 
           case 3:
                  p_code=PULSE_DATA1;
                  for(i=0;i<AMOUNT_DATA_FRAME;i++)
                     *(p_code+i)=((OUT2[160+i]+OUT3[80+i]+OUT0[i])/3)>>22; 
        }




/* Coding Pulse Data */
		if((AUDIO_DATA_SECTION==0)||(AUDIO_DATA_SECTION==2))
		{
			p_code = PULSE_DATA1;
			for(i=0;i<AMOUNT_DATA_FRAME;i++)
			{
				PULSE_DATA1[i] = 0x3E0;				
			}
		}
		else
		{
			p_code = PULSE_DATA0;
			for(i=0;i<AMOUNT_DATA_FRAME;i++)
			{
				PULSE_DATA0[i] = 0x3E0;
			}
		}	
		electrode_select = 0;				// Sequence of Stimulating Electrode
		pulse_width = PULSE_WIDTH;			// Stimulating Pulse Width is 25us
		for(i=0;i<AMOUNT_DATA_FRAME;i++)	// Coding Pulse Data
		{
			temp1 = 0;						// To Compute Checkout Bit0
			temp0 = *p_code & 0x0001;
			temp1 = temp0 + temp1;

⌨️ 快捷键说明

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