【问题标题】:Kiss fft does not work after giving it more than 32 samplesKiss fft 在给它超过 32 个样本后不起作用
【发布时间】:2015-03-07 23:31:03
【问题描述】:

我正在尝试从加速度计获取数据并将 Kiss FFT 应用于样本。我正在使用飞思卡尔 Kinetis FRDM-K22F 板。我想使用 64 个样本,但是当我运行程序时,我收到一条错误消息:“kiss fft 使用错误:不正确的分配”程序只是停止并且不返回任何错误。给它更多样本会得到类似的结果。

我尝试了如何设置 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

【问题讨论】:

  • 抱歉,这和Processing 编程语言有什么关系?
  • 哦,我的错,我的意思是添加“信号处理”作为标签。这是我第一次在 Stack Overflow 上发帖,所以我深表歉意。

标签: signal-processing fft kissfft


【解决方案1】:

听起来您的内存不足。我不熟悉那个芯片,但也许你应该使用 Kiss_fft_alloc 的最后一个参数,这样你就可以跳过堆分配。

【讨论】:

  • 感谢您的提示!我一直在尝试这个,但没有运气。我认为我没有正确使用 Kiss_fft_alloc 函数。您能否举个例子说明如何使用该函数的最后两个参数?
  • 我已经解决了这个问题。我意识到我使用的是真正的 fft,并且只需要将 fft_in 的一个真实组件输入到 fft。而且,我宣布 fft_out 是样本大小的一半,因为我只需要看到最高奈奎斯特频率。 fft 确实可以工作,但是当它从加速度计接收到非常轻微的运动时,它只会从 fft 输出 0 或 1。我已经将这些输入通过 matlab 的 fft 输入,结果符合预期;我能够看到我期望的频域信号。有什么办法可以解决这个问题。谢谢。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多