Beaglebone black 上的 运行 KissFFT 错误
Error in running KissFFT on Beaglebone black
我正在尝试在 BeagleBone Black 上使用 KissFFT,运行使用 3.8 内核的 Debian 7.5。当我尝试 运行 时程序已经编译,它显示错误
Real FFT optimization must be even
。
相同的程序 运行 在 Ubuntu 笔记本电脑上正确。我也尝试了各种 fft window length 但错误仍然存在。谁能指出我哪里出错了?特此附上代码,并在 gist 上突出显示。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include"kiss_fft.h"
#include "tools/kiss_fftr.h"
#include<complex.h>
int main()
{
float s[960], k; //s = sine, data array
float t[960]= {0}; //t = time data array
int i, size = 960, fft_len=16384;
float buff[fft_len];
bzero(&buff, sizeof(buff)); // write zeros in whole buffer
for (i = 0;i< fft_len;i++){
if(buff[i] != 0){
printf("Not zero");
break;
}
}
k = 2*M_PI/128;
// Creating a 128 point/cycle discreet input
for (i = 0; i< 128; i++){
t[i]= i*k;
s[i] = sin(t[i]*50);
}
// taking 7 cycles of input as 960 point window
for (i = 1; i <=7; i++){
memcpy(s+(128*i),s,128*4);
}
kiss_fftr_cfg fft_cfg = kiss_fftr_alloc(fft_len,0,0,0);
kiss_fft_cpx out_cpx[fft_len/2 +1];
// Padding the 960 length data with zeros
memcpy(buff,s, sizeof(s));
kiss_fftr(fft_cfg,buff,out_cpx);
for (i = 0; i <fft_len/2+1; i++){
printf("\n%d %f%+f ",i,out_cpx[i].r,out_cpx[i].i);
}
return 0;
}
我编译它使用:
gcc -g sinwave.c kiss_fft.c tools/kiss_fftr.c -o fsin -I
"kiss_fft130/" -lm
一个问题是您正在覆盖 s 缓冲区。
"i<=7" 的循环为 s 中的前 128 个元素创建了 7 个 extra 副本。 8*128 = 1024 > 960
我正在尝试在 BeagleBone Black 上使用 KissFFT,运行使用 3.8 内核的 Debian 7.5。当我尝试 运行 时程序已经编译,它显示错误
Real FFT optimization must be even
。
相同的程序 运行 在 Ubuntu 笔记本电脑上正确。我也尝试了各种 fft window length 但错误仍然存在。谁能指出我哪里出错了?特此附上代码,并在 gist 上突出显示。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include"kiss_fft.h"
#include "tools/kiss_fftr.h"
#include<complex.h>
int main()
{
float s[960], k; //s = sine, data array
float t[960]= {0}; //t = time data array
int i, size = 960, fft_len=16384;
float buff[fft_len];
bzero(&buff, sizeof(buff)); // write zeros in whole buffer
for (i = 0;i< fft_len;i++){
if(buff[i] != 0){
printf("Not zero");
break;
}
}
k = 2*M_PI/128;
// Creating a 128 point/cycle discreet input
for (i = 0; i< 128; i++){
t[i]= i*k;
s[i] = sin(t[i]*50);
}
// taking 7 cycles of input as 960 point window
for (i = 1; i <=7; i++){
memcpy(s+(128*i),s,128*4);
}
kiss_fftr_cfg fft_cfg = kiss_fftr_alloc(fft_len,0,0,0);
kiss_fft_cpx out_cpx[fft_len/2 +1];
// Padding the 960 length data with zeros
memcpy(buff,s, sizeof(s));
kiss_fftr(fft_cfg,buff,out_cpx);
for (i = 0; i <fft_len/2+1; i++){
printf("\n%d %f%+f ",i,out_cpx[i].r,out_cpx[i].i);
}
return 0;
}
我编译它使用:
gcc -g sinwave.c kiss_fft.c tools/kiss_fftr.c -o fsin -I "kiss_fft130/" -lm
一个问题是您正在覆盖 s 缓冲区。 "i<=7" 的循环为 s 中的前 128 个元素创建了 7 个 extra 副本。 8*128 = 1024 > 960