我一直试图让 KissFFT 在 dsPIC 上工作,但是在尝试了各种不同的方式之后,输出不是它应该的样子。我希望得到一些帮助,看看是否有任何我可能忽略的配置,或者它只是我没有想到的东西?
我在 MPLABX 中使用带有 XC16 编译器的 dsPIC33EP256MC202。
声明和内存分配。
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);
从面包板上的加速度计获取读数并填充浮点数组(使用毕达哥拉斯将 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);
}
一旦浮点数组充满了值,就用浮点数组中的值填充输入复数数组的实部。然后执行 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 的所有零的分隔符。有任何想法吗?