📄 cochlear1.c
字号:
),
(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 + -