1

我在这里发布了一个我使用的函数来获取加速器 fft 。

在 iPhone 上设置 fft 的加速器框架

它工作得很好。问题是,我实时使用它,所以对于每个新的音频缓冲区,我用新的缓冲区调用这个函数。

由于这些行(可能),我收到了内存警告

A.realp = (float *) malloc(nOver2 * sizeof(float));
 A.imagp = (float *) malloc(nOver2 * sizeof(float));

问题 :

  • 我有另一种方法吗,但要一次又一次地对它们进行 malloc(不要忘记我必须每秒多次用新的缓冲区喂它)

  • 我究竟如何释放它们?(代码行)

  • 会不会是由于 fft 对系统造成的影响?

任何摆脱这个警告的方法都会对我有很大帮助。

非常感谢。

4

2 回答 2

3

这些事情应该在程序开始时完成一次:

  • 使用类似的代码为缓冲区分配内存float *buffer = malloc(NumberOfElements * sizeof *buffer);
  • 创建 FFT 设置,使用类似FFTSetup setup = vDSP_create_fftsetup(log2n, FFT_RADIX2);.
  • 还要测试返回值。如果mallocorvDSP_create_fftsetup返回 0,则写入错误消息并退出程序或采取其他异常行为。

这些事情应该在程序结束时完成一次:

  • 使用类似vDSP_destroy_fftsetup(setup);.
  • 释放缓冲区的内存,使用类似free(buffer);.

在程序的中间,当您处理样本时,代码应该使用现有的缓冲区和设置。因此,指向缓冲区的变量和设置必须对该代码可见。您可以将它们作为参数传递(可能在结构中组合在一起)或将它们设为全局(这应该只是小程序的临时解决方案)。

应安排您的程序,以便在处理样本时无需分配内存或创建 FFT 设置。

所有分配的内存最终都应该被释放。

于 2013-01-03T14:43:22.503 回答
2

如果您正在 malloc'ing 并且从不释放,您将耗尽内存。确保使用 free() 来“释放”你的内存。

*注意: free() 实际上并没有擦除任何内存。它只是告诉系统我们已经完成了内存,它可以用于其他分配。

// Example:

// allocating memory
int *intpointer;
intpointer = malloc(sizeof(int));

// ... do stuff...

// 'Freeing' it when you are done
free(intpointer);
于 2013-01-03T13:39:20.507 回答