内存要求: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(出现错误)的主要内容,如果未能解决你的问题,请参考以下文章

Numpy FFT错误 - 带信封的梳状滤波器

Composer 要求内存不足。 PHP 致命错误:允许的内存大小为 1610612736 字节已用完 Voyager

MATLAB中fft

ARM CMSIS为q15 FFT提供错误输出

如何用一次n点的fft计算一个2n点的dft

快速傅里叶变换(FFT)详解