0

我一直试图让 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 的所有零的分隔符。有任何想法吗?

控制台输出

4

0 回答 0