A weird error
hey have succeeded in making fft program runs on arduino. however weird error serial print function when try address 2 dimensional array. the compile goes fine no data comes through serial monitor.
int outpin=9;
int outpin2=10;
int m =0;
int n=64;
int x_n_re[63];
int inputpin=3;
int n_div_2_plus_1=33;
void setup()
{
serial.begin(9600);
}
void loop()
{
int i=0;
int x_n_re[]={115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115};
int coslut[]={128,127,125,122,118,112,106,98,90,81,71,60,48,37,24,12,0,-12,-24,-37,-48,-60,-71,-81,-90,-98,-106,-112,-118,-122,-125,-127}; //cosine lookuptable
int sinlut[]={0,12,24,37,48,60,71,81,90,98,106,112,118,122,125,127,128,127,125,122,118,112,106,98,90,81,71,60,48,37,24,12}; //sin lookuptable
byte magnlut[16][16] =
{
{0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240},
{16,22,35,50,65,81,97,113,128,144,160,176,192,208,224,240},
{32,35,45,57,71,86,101,116,131,147,163,178,194,210,226,242},
{48,50,57,67,80,93,107,121,136,151,167,182,197,213,229,244},
{64,65,71,80,90,102,115,128,143,157,172,187,202,217,232,248},
{80,81,86,93,102,113,124,137,150,164,178,193,208,222,237,252},
{96,97,101,107,115,124,135,147,160,173,186,200,214,229,243,255},
{112,113,116,121,128,137,147,158,170,182,195,208,222,236,250,255},
{128,128,131,136,143,150,160,170,181,192,204,217,230,244,255,255},
{144,144,147,151,157,164,173,182,192,203,215,227,240,252,255,255},
{160,160,163,167,172,178,186,195,204,215,226,237,249,255,255,255},
{176,176,178,182,187,193,200,208,217,227,237,248,255,255,255,255},
{192,192,194,197,202,208,214,222,230,240,249,255,255,255,255,255},
{208,208,210,213,217,222,229,236,244,252,255,255,255,255,255,255},
{224,224,226,229,232,237,243,250,255,255,255,255,255,255,255,255},
{240,240,242,244,248,252,255,255,255,255,255,255,255,255,255,255}
};
//bit reversal unrolled loop table
i=x_n_re[1];x_n_re[1]=x_n_re[32];x_n_re[32]=i;
i=x_n_re[2];x_n_re[2]=x_n_re[16];x_n_re[16]=i;
i=x_n_re[3];x_n_re[3]=x_n_re[48];x_n_re[48]=i;
i=x_n_re[4];x_n_re[4]=x_n_re[8];x_n_re[8]=i;
i=x_n_re[5];x_n_re[5]=x_n_re[40];x_n_re[40]=i;
i=x_n_re[6];x_n_re[6]=x_n_re[24];x_n_re[24]=i;
i=x_n_re[7];x_n_re[7]=x_n_re[56];x_n_re[56]=i;
i=x_n_re[9];x_n_re[9]=x_n_re[36];x_n_re[36]=i;
i=x_n_re[10];x_n_re[10]=x_n_re[20];x_n_re[20]=i;
i=x_n_re[11];x_n_re[11]=x_n_re[52];x_n_re[52]=i;
i=x_n_re[13];x_n_re[13]=x_n_re[44];x_n_re[44]=i;
i=x_n_re[14];x_n_re[14]=x_n_re[28];x_n_re[28]=i;
i=x_n_re[15];x_n_re[15]=x_n_re[60];x_n_re[60]=i;
i=x_n_re[17];x_n_re[17]=x_n_re[34];x_n_re[34]=i;
i=x_n_re[19];x_n_re[19]=x_n_re[50];x_n_re[50]=i;
i=x_n_re[21];x_n_re[21]=x_n_re[42];x_n_re[42]=i;
i=x_n_re[22];x_n_re[22]=x_n_re[26];x_n_re[26]=i;
i=x_n_re[23];x_n_re[23]=x_n_re[58];x_n_re[58]=i;
i=x_n_re[25];x_n_re[25]=x_n_re[38];x_n_re[38]=i;
i=x_n_re[27];x_n_re[27]=x_n_re[54];x_n_re[54]=i;
i=x_n_re[29];x_n_re[29]=x_n_re[46];x_n_re[46]=i;
i=x_n_re[31];x_n_re[31]=x_n_re[62];x_n_re[62]=i;
i=x_n_re[35];x_n_re[35]=x_n_re[49];x_n_re[49]=i;
i=x_n_re[37];x_n_re[37]=x_n_re[41];x_n_re[41]=i;
i=x_n_re[39];x_n_re[39]=x_n_re[57];x_n_re[57]=i;
i=x_n_re[43];x_n_re[43]=x_n_re[53];x_n_re[53]=i;
i=x_n_re[47];x_n_re[47]=x_n_re[61];x_n_re[61]=i;
i=x_n_re[55];x_n_re[55]=x_n_re[59];x_n_re[59]=i;
int stage=0;
int log_2_n = 6;
int n_of_b = 32; // number of butterflies
int s_of_b = 1; // size of butterflies
int a_index = 0; // fft data index
int a_index_ref = 0; // fft data index reference
int x_n_im[64] = {0x0000};
for(stage=0; stage<log_2_n; stage++)
{
for(int nb_index=0; nb_index<n_of_b; nb_index++)
{
int tf_index = 0; // twiddle factor index
for(int sb_index=0; sb_index<s_of_b; sb_index++)
{
int resultmulrecos=0;
int resultmulimcos=0;
int resultmulresin=0;
int resultmulimsin=0;
int b_index = a_index+s_of_b; // 2nd fft data index
resultmulrecos=x_n_re[b_index]*coslut[tf_index];
resultmulresin=x_n_re[b_index]*sinlut[tf_index];
resultmulimcos=x_n_im[b_index]*coslut[tf_index];
resultmulimsin=x_n_im[b_index]*sinlut[tf_index];
x_n_re[b_index] = x_n_re[a_index]-resultmulrecos+resultmulimsin;
x_n_im[b_index] = x_n_im[a_index]-resultmulresin-resultmulimcos;
x_n_re[a_index] = x_n_re[a_index]+resultmulrecos-resultmulimsin;
x_n_im[a_index] = x_n_im[a_index]+resultmulresin+resultmulimcos;
if (((sb_index+1) & (s_of_b-1)) == 0)
a_index = a_index_ref;
else
a_index++;
tf_index += n_of_b;
}
a_index = ((s_of_b<<1) + a_index) & 63;
a_index_ref = a_index;
}
n_of_b >>= 1;
s_of_b <<= 1;
}
int mult =-1;
for(i=0; i<n_div_2_plus_1; i++)
{
// if re{x(n)} negative, multiply -1
if ((x_n_re & 0x8000)!=0x0000)
{
x_n_re=x_n_re*mult;
}
// if im{x(n)} negative, multiply -1
if ((x_n_im & 0x8000)!=0x0000)
{
x_n_im=x_n_im*mult;
}
}
//convert x_n_re values magnitudes
int a=0;
for (int i=0;i<32; i++)
{
= x_n_re >> 11 ;
x_n_re=a;
}
//int g=magnlut[x_n_re[
m = magnlut[2][4];
//for(i=1; i<31; i++)
// x_n_re = magnlut[x_n_re >> 11][x_n_im >> 11];
//x_n_re[32] = magnlut[x_n_re[32] >> 11][0];
//int m = magnlut[12][0];
serial.print("magnitude: ");
for (int i=0;i<32; i++)
{
//serial.print(a);
//serial.print(x_n_re);
// serial.print("done");
serial.print(m);
serial.print(",");
}
serial.println();
}
if directly address array ie xxxx[1][3]; works if use variable target value ie xxxx[a][3] no output
any advice appreciated!
thanks!!!!!!!!!!!!!!!
int outpin=9;
int outpin2=10;
int m =0;
int n=64;
int x_n_re[63];
int inputpin=3;
int n_div_2_plus_1=33;
void setup()
{
serial.begin(9600);
}
void loop()
{
int i=0;
int x_n_re[]={115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115};
int coslut[]={128,127,125,122,118,112,106,98,90,81,71,60,48,37,24,12,0,-12,-24,-37,-48,-60,-71,-81,-90,-98,-106,-112,-118,-122,-125,-127}; //cosine lookuptable
int sinlut[]={0,12,24,37,48,60,71,81,90,98,106,112,118,122,125,127,128,127,125,122,118,112,106,98,90,81,71,60,48,37,24,12}; //sin lookuptable
byte magnlut[16][16] =
{
{0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240},
{16,22,35,50,65,81,97,113,128,144,160,176,192,208,224,240},
{32,35,45,57,71,86,101,116,131,147,163,178,194,210,226,242},
{48,50,57,67,80,93,107,121,136,151,167,182,197,213,229,244},
{64,65,71,80,90,102,115,128,143,157,172,187,202,217,232,248},
{80,81,86,93,102,113,124,137,150,164,178,193,208,222,237,252},
{96,97,101,107,115,124,135,147,160,173,186,200,214,229,243,255},
{112,113,116,121,128,137,147,158,170,182,195,208,222,236,250,255},
{128,128,131,136,143,150,160,170,181,192,204,217,230,244,255,255},
{144,144,147,151,157,164,173,182,192,203,215,227,240,252,255,255},
{160,160,163,167,172,178,186,195,204,215,226,237,249,255,255,255},
{176,176,178,182,187,193,200,208,217,227,237,248,255,255,255,255},
{192,192,194,197,202,208,214,222,230,240,249,255,255,255,255,255},
{208,208,210,213,217,222,229,236,244,252,255,255,255,255,255,255},
{224,224,226,229,232,237,243,250,255,255,255,255,255,255,255,255},
{240,240,242,244,248,252,255,255,255,255,255,255,255,255,255,255}
};
//bit reversal unrolled loop table
i=x_n_re[1];x_n_re[1]=x_n_re[32];x_n_re[32]=i;
i=x_n_re[2];x_n_re[2]=x_n_re[16];x_n_re[16]=i;
i=x_n_re[3];x_n_re[3]=x_n_re[48];x_n_re[48]=i;
i=x_n_re[4];x_n_re[4]=x_n_re[8];x_n_re[8]=i;
i=x_n_re[5];x_n_re[5]=x_n_re[40];x_n_re[40]=i;
i=x_n_re[6];x_n_re[6]=x_n_re[24];x_n_re[24]=i;
i=x_n_re[7];x_n_re[7]=x_n_re[56];x_n_re[56]=i;
i=x_n_re[9];x_n_re[9]=x_n_re[36];x_n_re[36]=i;
i=x_n_re[10];x_n_re[10]=x_n_re[20];x_n_re[20]=i;
i=x_n_re[11];x_n_re[11]=x_n_re[52];x_n_re[52]=i;
i=x_n_re[13];x_n_re[13]=x_n_re[44];x_n_re[44]=i;
i=x_n_re[14];x_n_re[14]=x_n_re[28];x_n_re[28]=i;
i=x_n_re[15];x_n_re[15]=x_n_re[60];x_n_re[60]=i;
i=x_n_re[17];x_n_re[17]=x_n_re[34];x_n_re[34]=i;
i=x_n_re[19];x_n_re[19]=x_n_re[50];x_n_re[50]=i;
i=x_n_re[21];x_n_re[21]=x_n_re[42];x_n_re[42]=i;
i=x_n_re[22];x_n_re[22]=x_n_re[26];x_n_re[26]=i;
i=x_n_re[23];x_n_re[23]=x_n_re[58];x_n_re[58]=i;
i=x_n_re[25];x_n_re[25]=x_n_re[38];x_n_re[38]=i;
i=x_n_re[27];x_n_re[27]=x_n_re[54];x_n_re[54]=i;
i=x_n_re[29];x_n_re[29]=x_n_re[46];x_n_re[46]=i;
i=x_n_re[31];x_n_re[31]=x_n_re[62];x_n_re[62]=i;
i=x_n_re[35];x_n_re[35]=x_n_re[49];x_n_re[49]=i;
i=x_n_re[37];x_n_re[37]=x_n_re[41];x_n_re[41]=i;
i=x_n_re[39];x_n_re[39]=x_n_re[57];x_n_re[57]=i;
i=x_n_re[43];x_n_re[43]=x_n_re[53];x_n_re[53]=i;
i=x_n_re[47];x_n_re[47]=x_n_re[61];x_n_re[61]=i;
i=x_n_re[55];x_n_re[55]=x_n_re[59];x_n_re[59]=i;
int stage=0;
int log_2_n = 6;
int n_of_b = 32; // number of butterflies
int s_of_b = 1; // size of butterflies
int a_index = 0; // fft data index
int a_index_ref = 0; // fft data index reference
int x_n_im[64] = {0x0000};
for(stage=0; stage<log_2_n; stage++)
{
for(int nb_index=0; nb_index<n_of_b; nb_index++)
{
int tf_index = 0; // twiddle factor index
for(int sb_index=0; sb_index<s_of_b; sb_index++)
{
int resultmulrecos=0;
int resultmulimcos=0;
int resultmulresin=0;
int resultmulimsin=0;
int b_index = a_index+s_of_b; // 2nd fft data index
resultmulrecos=x_n_re[b_index]*coslut[tf_index];
resultmulresin=x_n_re[b_index]*sinlut[tf_index];
resultmulimcos=x_n_im[b_index]*coslut[tf_index];
resultmulimsin=x_n_im[b_index]*sinlut[tf_index];
x_n_re[b_index] = x_n_re[a_index]-resultmulrecos+resultmulimsin;
x_n_im[b_index] = x_n_im[a_index]-resultmulresin-resultmulimcos;
x_n_re[a_index] = x_n_re[a_index]+resultmulrecos-resultmulimsin;
x_n_im[a_index] = x_n_im[a_index]+resultmulresin+resultmulimcos;
if (((sb_index+1) & (s_of_b-1)) == 0)
a_index = a_index_ref;
else
a_index++;
tf_index += n_of_b;
}
a_index = ((s_of_b<<1) + a_index) & 63;
a_index_ref = a_index;
}
n_of_b >>= 1;
s_of_b <<= 1;
}
int mult =-1;
for(i=0; i<n_div_2_plus_1; i++)
{
// if re{x(n)} negative, multiply -1
if ((x_n_re & 0x8000)!=0x0000)
{
x_n_re=x_n_re*mult;
}
// if im{x(n)} negative, multiply -1
if ((x_n_im & 0x8000)!=0x0000)
{
x_n_im=x_n_im*mult;
}
}
//convert x_n_re values magnitudes
int a=0;
for (int i=0;i<32; i++)
{
= x_n_re >> 11 ;
x_n_re=a;
}
//int g=magnlut[x_n_re[
m = magnlut[2][4];
//for(i=1; i<31; i++)
// x_n_re = magnlut[x_n_re >> 11][x_n_im >> 11];
//x_n_re[32] = magnlut[x_n_re[32] >> 11][0];
//int m = magnlut[12][0];
serial.print("magnitude: ");
for (int i=0;i<32; i++)
{
//serial.print(a);
//serial.print(x_n_re);
// serial.print("done");
serial.print(m);
serial.print(",");
}
serial.println();
}
if directly address array ie xxxx[1][3]; works if use variable target value ie xxxx[a][3] no output
any advice appreciated!
thanks!!!!!!!!!!!!!!!
if want print bytes decimal values, not corresponding ascii, you'll need do:
serial.print(variable,dec);
serial.print(variable,dec);
Arduino Forum > Forum 2005-2010 (read only) > Software > Syntax & Programs > A weird error
arduino
Comments
Post a Comment