在Objective-C中处理大量音频样本

时间:2012-02-11 10:14:37

标签: objective-c c audio signal-processing

我在C中有一个音频样本数组,我运行算法,如低通滤波器。我正在考虑在处理它之前将我的数组转换为Objective-C。这主要是因为我对这种语言更加熟悉并且它的便利性(特别是能够轻松获得数组的长度而不必处理指针)。

我想知道为什么这可能是一个坏主意。或者,如果这样做有任何不利之处,我不知道。就像处理如此大量样本(?)的速度一样。

3 个答案:

答案 0 :(得分:3)

标准做法是使用c样式数组来操作音频数组。这是因为如果你必须使用带有obj-c消息传递的Objective-c容器对象来访问每个元素,那么性能就会很差,正如你所注意到的,带有音频的样本数量可能非常大。

对于实时处理尤其如此,例如处理系统音频回调中的音频样本,这些样本必须在一定的毫秒数内完成工作,否则声音会被切断。

你可以做的是定义一个具有音频缓冲区数组的结构(甚至是一个目标c类)以及大小,通道数等信息元素,以便在一个位置将它包装在一起。这样,当您访问缓冲区时,您不需要进入obj-c效率问题,并且仍然可以获得缓冲区规范信息。

以下是一个例子:

typedef struct filter_buffer {
   uint16_t* buffer;
   int   channels;
   int   num_frames;
} filter_buffer;

然后你只需要一个初始化它的电话。

你可以用Objective-c做点什么:

@interface FilterBuffer : NSObject
{
  uint16_t* buffer;
  int   channels;
  int   num_frames;   
}

-initWithBuffer:(unit16_t*)buf channels:(int)c numFrames:(int)n;
...//accessors etc
@end

@implementation FilterBuffer
-initWithBuffer:(unit16_t*)buf channels:(int)c numFrames:(int)n
{
   if ((self = [super init)) {
      buffer = buf;
      channels = c;
      num_frames = n;
   }
   return self;
}
...
@end
}

答案 1 :(得分:1)

缺点是:

  • 速度。它会明显变慢。
  • 它不可用于实时,objc消息传递速度明显较慢,可能会锁定。
  • 它不便携。
  • 它不能与其他图书馆很好地融合。
  • 根据您的处理方式,它可能会产生巨大的内存影响。使用NSNumbers数组(例如)将需要几个内存。事实上,这就是你的帖子所暗示的 - NSMutableArray NSNumber s。
  • 您将无法正确学习读写音频程序。您在现实世界中看到的程序通常使用C ++和C.
  • C阵列可怕的事情=)
  • 当你需要重复使用它时,你可能最终会重写它,因为在大多数情况下它是错误的工具。

答案 2 :(得分:0)

在内部循环中使用Objective C对象的DSP由于性能原因而不好。出于这个原因,您会发现大多数音频滤波器和DSP算法都以普通C(可能是C ++)或类似的伪代码发布。因此,您可能不得不习惯于阅读普通的C DSP代码。

此外,C是Objective C的适当子集。