我在C中有一个音频样本数组,我运行算法,如低通滤波器。我正在考虑在处理它之前将我的数组转换为Objective-C。这主要是因为我对这种语言更加熟悉并且它的便利性(特别是能够轻松获得数组的长度而不必处理指针)。
我想知道为什么这可能是一个坏主意。或者,如果这样做有任何不利之处,我不知道。就像处理如此大量样本(?)的速度一样。
答案 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)
缺点是:
NSNumbers
数组(例如)将需要几个次内存。事实上,这就是你的帖子所暗示的 - NSMutableArray
NSNumber
s。答案 2 :(得分:0)
在内部循环中使用Objective C对象的DSP由于性能原因而不好。出于这个原因,您会发现大多数音频滤波器和DSP算法都以普通C(可能是C ++)或类似的伪代码发布。因此,您可能不得不习惯于阅读普通的C DSP代码。
此外,C是Objective C的适当子集。