2015-03-07 1 views
0

Я пытаюсь взять данные с акселерометра и применить Kiss FFT к образцам. Я использую плату Freescale Kinetis FRDM-K22F. Я хочу использовать 64 образца, но когда я запускаю программу, я получаю сообщение об ошибке «kiss fft usage: неправильное выделение». Я начал отклонять размер выборки и видел, что FFT работает с 32 образцами, но дает ему 33 образца программа просто останавливается и не возвращает никаких ошибок. Давая ему больше образцов дает аналогичные результаты.Kiss fft не работает после предоставления более 32 образцов

Я играл с тем, как я создал FFT и следовали несколько веб-сайтов и сообщений на форуме:

KissFFT output of kiss_fftr

http://digiphd.com/programming-reconstruction-fast-fourier-transform-real-signal-kiss-fft-libraries/

Kiss FFT on a dsPIC33

Из того, что я могу видеть, я гаванью «ничего не было сделано по сравнению с тем, что делали вышеуказанные веб-сайты и форумы. Я включил свой код ниже. Любая помощь или совет с большой благодарностью.

void Sample_RUN() 
{ 
    int size = 64; 
    kiss_fft_scalar zero; 
    memset(&zero,0,sizeof(zero)); 
    kiss_fft_cpx fft_in[size]; 
    kiss_fft_cpx fft_out[size]; 

    kiss_fftr_cfg fft = kiss_fftr_alloc(size*2 ,0 ,NULL,NULL); 

    signed short samples[size]; 

    for (int i = 0; i < size; i++) { 
     fft_in[i].r = zero; 
     fft_in[i].i = zero; 
     fft_out[i].r = zero; 
     fft_out[i].i = zero; 
    } 

    printf("Data Collection Begins \r\n"); 

for(int j = 0; j < size; j++) 
{ 
    for(;;) 
    { 
     dr_status = My_I2C_ReadByte(STATUS_REG); 
     dr_status = (dr_status & 0x04); 
     if (dr_status == 0x04) 
     { 
      //READING FROM ACCEL OUTPUT DATA REGISTERS 
      AccelData[0] = My_I2C_ReadByte(OUT_X_MSB_REG); 
      AccelData[1] = My_I2C_ReadByte(OUT_X_LSB_REG); 
      AccelData[2] = My_I2C_ReadByte(OUT_Y_MSB_REG); 
      AccelData[3] = My_I2C_ReadByte(OUT_Y_LSB_REG); 
      AccelData[4] = My_I2C_ReadByte(OUT_Z_MSB_REG); 
      AccelData[5] = My_I2C_ReadByte(OUT_Z_LSB_REG); 

      // 14-bit accelerometer data 
      Xout_Accel_14_bit = ((signed short) (AccelData[0]<<8 | AccelData[1])) >> 2;  // Compute 16-bit X-axis acceleration output value 
      Yout_Accel_14_bit = ((signed short) (AccelData[2]<<8 | AccelData[3])) >> 2;  // Compute 16-bit Y-axis acceleration output value 
      Zout_Accel_14_bit = ((signed short) (AccelData[4]<<8 | AccelData[5])) >> 2;  // Compute 16-bit Z-axis acceleration output value 

      mag_accel = sqrt(pow(Xout_Accel_14_bit, 2) + pow(Yout_Accel_14_bit, 2) + pow(Zout_Accel_14_bit, 2)); 

      printf("%d \r\n", mag_accel); 

      samples[j] = mag_accel; 

      break; 

     } // end if 
    } // end infinite for 
} // end for 


for (int j = 0; j < size; j++) 
{ 
    fft_in[j].r = samples[j]; 
    fft_in[j].i = zero; 
    fft_out[j].r = zero; 
    fft_out[j].i = zero; 
} 

printf("Executing FFT\r\n"); 
kiss_fftr(fft, (kiss_fft_scalar*) fft_in, fft_out); 

printf("Printing FFT Outputs\r\n"); 
for(int j = 0; j < size; j++) 
{ 
    printf("%d \r\n", fft_out[j].r); 
} 

kiss_fft_cleanup(); 
free(fft); 
} // end Sample_RUN 
+0

Извините, что это связано с языком программирования 'Processing'? –

+0

О, моя ошибка, я хотел добавить «обработку сигнала» в качестве тега. Это мое первое сообщение о переполнении стека, поэтому я приношу свои извинения. –

ответ

1

Похоже, что у вас заканчивается память. Я не знаком с этим чипом, но, возможно, вы должны использовать последние аргументы kiss_fft_alloc, чтобы вы могли пропускать распределение кучи.

+0

Спасибо за подсказку! Я пытался это сделать, но мне не повезло. Я не думаю, что правильно использую функцию kiss_fft_alloc. Не могли бы вы привести мне пример того, как я буду использовать последние два аргумента этой функции? –

+0

У меня проблема с этой проблемой. Я понял, что я использую реальный fft, и для этого требуется только реальный компонент fft_in для ввода в fft. Кроме того, я заявил, что fft_out составляет половину размера выборки, потому что мне нужно видеть только до частоты nyquist. fft работает, но когда он получает очень небольшие движения от акселерометра, он выводит только 0 или 1 из fft. Я ввел эти данные через fft, и результаты будут такими же ожидаемыми; Я могу видеть сигнал частотной области, который я ожидаю. Есть ли способ обойти эту проблему. Спасибо. –