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

标签 objective-c c audio signal-processing

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

我想知道是否有任何理由说明这可能是个坏主意。或者如果这样做有任何我不知道的缺点。比如处理如此大量样本的速度(?)。

最佳答案

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

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

您可以做的是定义一个结构(或什至是一个 objective-c 类),它具有音频缓冲区数组以及信息元素(如大小、 channel 数等),以便为您将其包装在一个位置。这样,当您访问缓冲区时,您无需陷入 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
}

关于objective-c - 在 Objective-C 中处理大量音频样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9239404/

相关文章:

ios - 在 TableView 外传递和访问对象数据

ios - 如何以编程方式使用 iOS 语音合成器? (文字转语音)

cocoa - 读取 Cocoa 中的音频输入电平峰值

objective-c - 同步块(synchronized block)内的 block ?

ios - 滚动表格 View 时,自定义 UITableView 页脚不会锁定在底部

ios - 较小时 UIScrollView 的中心内容

c - 如何使 gcc 报告 int 到 uint 转换

c - 线程开销性能

带串口的Java接口(interface)

java - 选项卡式 Activity 中的Android声音