内存要求:N 点 FFT(出现错误)
Posted
技术标签:
【中文标题】内存要求:N 点 FFT(出现错误)【英文标题】:Memory requirement: N-point FFT (getting error) 【发布时间】:2014-08-26 15:14:45 【问题描述】:我正在尝试使用 FFT 库对数据进行 FFT。这里也附上代码。
问题是当我尝试执行大小为 NX> 2048(例如 4096)的 FFT 时,它给了我错误 0xC00000FD:堆栈溢出。 我看到人们发布了大约 2^12 和 2^15 点 DFT 的 FFT 的结果。我的问题是我应该如何计算 N>2048 的 N 点 FFT。
我使用的信号仅用于测试代码。实际问题中的信号将实时从硬件接收。
我正在使用 Visual Studio 2010。系统规格(Core i7,RAM:16GB)
// Raw Data Generation
#define TABLE_SIZE 1000
#define TWO_PI (3.14159 * 2.0)
#define CYCLES 20
#define NUMBER_OF_SAMPLES (TABLE_SIZE*CYCLES)
// FFT Values
#define NX 2048// NX-point DFT
// Sine Generator Function - Real Samples
void sin_func(double *sample_ptr)
double phaseIncrement = TWO_PI/TABLE_SIZE;
double currentPhase = 0.0;
int i;
for (i = 0; i < CYCLES*TABLE_SIZE; i ++)
*sample_ptr = sin(currentPhase);
sample_ptr = sample_ptr + 1;
currentPhase += phaseIncrement;
void main()
const int ARRAY_SIZE = NUMBER_OF_SAMPLES*sizeof(double);
const int FFT_OUT_SIZE = sizeof(fftw_complex)*(NX/2+1);
// Initialization
double rawdata_in[NUMBER_OF_SAMPLES];
fftw_complex fft_out[FFT_OUT_SIZE]; // Sizeof(fftw_complex) = 16
fftw_complex temp[FFT_OUT_SIZE];
double datacheck_out[NUMBER_OF_SAMPLES];
// Creating fft plan
fftw_plan plan;
plan = fftw_plan_dft_r2c_1d(NX, rawdata_in , fft_out, FFTW_MEASURE);
// Initializing Input Array
sin_func(&rawdata_in[0]);
fftw_execute(plan);
// Doing Inverse Transform
fftw_plan plan2;
plan2 = fftw_plan_dft_c2r_1d(NX, temp, datacheck_out, NULL);
memcpy(temp, fft_out, sizeof(fftw_complex)*FFT_OUT_SIZE);
fftw_execute(plan2);
fftw_destroy_plan(plan2);
fftw_destroy_plan(plan);
【问题讨论】:
您是否尝试过增加堆栈大小? 【参考方案1】:对于N == 4096
,您的堆栈分配大小如下所示:
const int FFT_OUT_SIZE = 32784;
double rawdata_in[20000]; // 8 * 20000 = 160 kb
fftw_complex fft_out[32784]; // 32784 * 16 = 525 kb
fftw_complex temp[32784]; // = 525 kb
double datacheck_out[20000]; // = 160 kb
// Total = 1370 kb
看起来 VS 2010 中的默认堆栈大小为 1MB,因此这会导致堆栈溢出。解决此问题的一种方法是更改项目选项中的堆栈大小(属性 -> 配置属性 -> 链接器 -> 系统 -> 堆栈保留大小,请参阅 here)。另一种方法是使用动态内存分配,例如:
fftw_complex* fft_out = new fftw_complex[FFT_OUT_SIZE];
//...use the pointer
delete[] fft_out;
注意:我认为您的FFT_OUT_SIZE
应该定义为:
const int FFT_OUT_SIZE = NX/2 + 1;
sizeof(fftw_complex)
在那里看起来很奇怪...如果您使用 malloc()
在 C 中分配原始缓冲区,我只会期望它。
【讨论】:
以上是关于内存要求:N 点 FFT(出现错误)的主要内容,如果未能解决你的问题,请参考以下文章