在dsPIC33上吻合FFT

时间:2014-08-20 11:44:51

标签: c arrays pic mplab kissfft

我一直试图让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的所有零值。有什么想法吗?

Console Output

0 个答案:

没有答案