在dsPIC33上吻合FFT

我一直试图让KissFFT在dsPIC上工作,但是在尝试了各种不同的方法之后,输出并不是应该的。 我希望得到一些帮助,看看是否有任何我可能会忽略的配置,或者它是否只是我没有想到的东西?

我在MPLABX中使用dsPIC33EP256MC202和XC16编译器。

声明和内存分配。

int readings[3] = {0, 0, 0}; kiss_fft_scalar zero; memset(&zero,0,sizeof(zero)); int size = 128 * 2; float fin[256]; kiss_fft_cpx in[size]; kiss_fft_cpx out[size]; for (i = 0; i < size; i++) { in[i].r = zero; in[i].i = zero; out[i].r = zero; out[i].i = zero; } kiss_fft_cfg mycfg = kiss_fft_alloc(size*2 ,0 ,NULL,NULL); 

从面包板上的accellerometer读取读数并填充浮子arrays(使用毕达哥拉斯将3轴合并为一个信号)。 输入XYZ值按比例缩小,平均值介于-2400和2400之间。

 while(1) { if(iii <= 1){ UART_Write_Text("Collecting..."); } getOutput(readings); X = (double)readings[0]; Y = (double)readings[1]; Z = (double)readings[2]; X = X / 50; Y = Y / 50; Z = Z / 50; if(ii <= 256){ fin[ii] = sqrt(X*X + Y*Y + Z*Z); ii++; } else{ i=0; while(i<255){ fin[i] = fin[i+1]; i++; } fin[255] = sqrt(X*X + Y*Y + Z*Z); } 

一旦float数组满了值,就用float数组中的值填充输入复数数组的实部。 然后执行Kiss FFT并使用Kiss FFT的out数组的每个实数和虚数值的绝对值填充浮点数组(arrayDFTOUT),最后一个循环使任何负值为正。

 if(iii == 255){ iii = 0; UART_Write_Text("Processing..."); for (i = 0; i < size; i++) { // samples are type of short in[i].r = fin[i]; in[i].i = zero; out[i].r = zero; out[i].i = zero; } kiss_fft(mycfg, in, out); for(i=0;i<128;i++){ arrayDFTOUT[i] = sqrt((out[i].r*out[i].r) + (out[i].i*out[i].i)); } arrayDFTOUT[0] = 1; for(i = 0; i<128; i++){ if(arrayDFTOUT[i] < 0){ arrayDFTOUT[i] = arrayDFTOUT[i] - (arrayDFTOUT[i]*2); } } 

最后使用面包板上的UART通过串行显示输出值。

 for(i = 0; i < 128; i++){ sprintf(temp, "%f,", arrayDFTOUT[i]); UART_Write_Text(temp); } 

结果就是结果。 在完成KissFFT之后,从第一个值设置为1的所有零值的aparet。 有任何想法吗?

控制台输出