Hi everybody!
I wrote in this forum a couple of weeks ago asking for this algorithm too, so here I go again.
I'm trying to make this audio polling loopback work as a FIR filtering function and it doesn't work. But analising it these two weeks i've discovered (or i think i've discovered) the reason of this. It's a time problem.
If i make the FIR function use only three coeficients this works correctly. But if I use more than that (increasing the "count" variable) it doesn't work at all.
I supose it's a problem with the McASP TDM work mode, but i don't know for sure, and obviously i don't know how to solve it. Can anyone give me a solution?
Here is the "main" code i'm using, with the FIR function included:
//-----------------------------------------------------------------------------
// \file main.c
// \brief implementation of main()
//
//-----------------------------------------------------------------------------
#include "main.h"
float h[10]={0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1};
float delay[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
int count=3;
//-----------------------------------------------------------------------------
// \brief entry point for bsl test code.
//
// \param none.
//
// \return none.
//-----------------------------------------------------------------------------
int main(void)
{
int16_t dataInput,dataOutput; // Input Sample
uint16_t GpioToggle=0; // toggle gpio output
// init the i2c for all to use.
USTIMER_init();
I2C_init(I2C0, I2C_CLK_400K);
// set gpio output
SetGpio();
McASP_Init(); // Init McASP
AIC3106_Init(); // init AIC3106
McASP_Start(); // STart McASP
while (1){
GPIO_setOutput(GPIO_BANK7,GPIO_PIN7,GpioToggle);
GpioToggle^=1;
// wait for receive ready and copy the sample to the output register
while (!CHKBIT(MCASP->SRCTL12, RRDY)){}
dataInput = MCASP->XBUF12;
if (!MCASP->RSLOT)
{
dataOutput=(dataInput & 0xFFFF);
dataOutput=(int16_t)FIR(h,delay,count,dataOutput);
MCASP->XBUF11 = dataOutput;
}
else
{
dataOutput=(dataInput & 0xFFFF);
MCASP->XBUF11 = dataOutput;
}
}
}
//-----------------------------------------------------------------------------
// SetGpio
// config pinmux for gpio
//-----------------------------------------------------------------------------
void SetGpio(void)
{
uint32_t errchk;
EVMC6748_pinmuxConfig(PINMUX_MCASP_REG_17,PINMUX_MCASP_MASK_17,PINMUX_MCASP_VAL_17);
errchk=GPIO_setDir(GPIO_BANK7,GPIO_PIN7,GPIO_OUTPUT);
}
float FIR(float *coefs,float *delay,int count,int16_t dataOutput)
{
//Variable declaration
int i;
float y;
y=0.0;
//Delay Line Loop
for(i=count-1; i>0; i--){
delay[i]=delay[i-1];
}
//Sample to first delay position
delay[0]=(float)dataOutput;
//Filtering loop
for(i=0;i<count;i++){
y+=coefs[i]*delay[i];
}
return y;
}
(Please visit the site to view this file)
I've also uploaded the entire project, in case someone got the time to take a look at it.
Thank you so much for your time!