📄 codec.c
字号:
/*****************************************************************************/
/* Codec.c*/
/* Digital Loopback example*/
/*****************************************************************************/
#include "type.h"
#include "board.h"
#include "codec.h"
#include "mcbsp54.h"
#include "tms320.h"
#include "dsplib.h"
#include "setm.h"
/*****************************************************************************/
/* Function Prototypes*/
/*****************************************************************************/
/* This delay routine does not conflict with DSP/BIOS. It is used in this */
/* example rather than brd_delay_msec which causes DSP/BIOS conflicts just */
/* because of this. If you are not using DSP/BIOS, you can change the code */
/* to use brd_delay_msec. */
void delay(void); //延迟
void update(DATA x[],DATA dk);
void initarray(DATA x[]);
/*****************************************************************************/
/* Global Variables */
/*****************************************************************************/
HANDLE hHandset; //CODEC句柄
DATA bf1[5000]; //缓冲区
/*****************************************************************************/
/* MAIN*/
/*****************************************************************************/
DATA *dp_w = &dbuffer_w[0];
DATA *dp_h = &dbuffer_h[0];
void main()
{
s16 j;
s16 m;
s16 cnt=2; //灯循环闪次数,初始化等待时钟周期数
DATA dk,out_delay,yk;//ek
s16 mode=2; //决定是否产生回波是否使用回波抵消
s16 i;
if (brd_init(100)) //板的初始化
return;
for (i=0; i<LENGTH_IN; i++) dbuffer_h[i] = 0;
for (i=0;i<LENGTH_IN;i++) out_h[i] =0; // clear output buffer (optional)
for (i=0;i<LENGTH_W;i++) coff_w[i] =0; // clear coeff buffer (optional)
for (i=0;i<LENGTH_IN;i++) out_w[i] =0; // clear output buffer (optional)
/* blink the leds a couple times */
while ( cnt-- ) /*板子初始化,用灯闪来表示*/
{
brd_led_toggle(BRD_LED0);
/* brd_delay_msec(1000); */
delay();
brd_led_toggle(BRD_LED1);
/* brd_delay_msec(1000); */
delay();
brd_led_toggle(BRD_LED2);
/* brd_delay_msec(1000); */
delay();
}
/* Open Handset Codec */
hHandset = codec_open(HANDSET_CODEC); /* Acquire handle to codec */
/* Set codec parameters */
codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */
codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */
codec_ain_gain(hHandset, CODEC_AIN_6dB); /* 6dB gain on analog input to ADC */
codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); /* -6dB gain on analog output from DAC */
codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */
brd_led_toggle(BRD_LED0);
initarray(x); //初始化所有数组
i=0;
j=3000;
m=1500;
while(1) //读数循环
{
while (!MCBSP_RRDY(HANDSET_CODEC)) {};
dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);
// *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk; //从ADC读数
update(x,dk);
if(mode==0)
{
*(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk;
}
else if(mode==1)
{
fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN);
if(i==5000) i=0;
if(j==5000) j=0;
if(m==5000) m=0;
bf1[i]=out_h[0];i++;//放入缓冲区
out_delay=0.5*bf1[i+1]+1.5*bf1[j++]+bf1[m++];
yk=dk+out_delay;
*(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=yk;
}
else if(mode==2)
{
fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN);
if(i==5000) i=0;
if(j==5000) j=0;
if(m==5000) m=0;
bf1[i]=out_h[0];i++;
out_delay=0.5*bf1[i+1]+1.5*bf1[j++]+bf1[m++];
yk=dk+out_delay;
update(y,yk);
dlms(y,coff_w,out_w,&dp_w,out_h,STEP,LENGTH_W,LENGTH_IN);
//ek=out_h[0]-out_w[0];
*(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=out_w[i];
}
}
}
void delay(void)
{
long int j;
for(j=0; j<100000; j++)
asm("_nop");
}
void update(DATA x[],DATA dk)
{
s16 j,k;
for(j=1;j<LENGTH_IN;++j)
{
k=LENGTH_IN-j;
x[k]=x[k-1];
}
x[0]=dk;
}
void initarray(DATA x[])
{
s16 i;
for(i=0;i<LENGTH_IN;++i)
{
x[i]=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -