我一直试图让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读取并填充浮子阵列(使用毕达哥拉斯将3轴&#39;合并为一个信号)。输入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的所有零值。有什么想法吗?