Манипулирование большим массивом аудиосэмплов в Objective-C - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть массив аудиосэмплов в C, на которых я использую алгоритмы, такие как фильтры нижних частот.Я думал о преобразовании моего массива в Objective-C, прежде чем работать над ним.Это в основном потому, что мне удобнее пользоваться этим языком и его удобством (особенно, когда я могу легко получить длину массива и не иметь дело с указателями).

Мне было интересно, есть ли причина, почему это может быть плохой идеей.Или есть ли какие-либо недостатки в этом, о которых я не знаю.Как, возможно, скорость обработки такого большого количества образцов (?).

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

Стандартная практика - использовать массив стилей переменного тока для манипулирования массивом аудио.Это связано с тем, что если вам нужно использовать контейнерный объект Objective-c с сообщениями obj-c для доступа к каждому элементу, производительность будет плохой, и, как вы заметили, количество сэмплов со звуком может быть довольно большим.

Это особенно актуально для обработки в реальном времени, такой как обработка аудиосэмплов, находящихся в системном аудио-обратном вызове io, которые должны выполнить работу в течение определенного количества миллисекунд, иначе звук отключится.

Что вы можете сделать, это определить структуру (или даже объектный класс c), который имеет массив аудиобуфера, а также такие информационные элементы, как размер, количество каналов и т. Д., Чтобы объединить его для вас в одном месте.Таким образом, когда вы получаете доступ к буферу, вам не нужно сталкиваться с проблемами эффективности obj-c, и у вас все еще есть информация о спецификации буфера.

Вот пример:

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

Тогда вам просто нужен вызов, который его инициализирует.

Вы можете сделать что-то с target-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 голос
/ 13 февраля 2012

Недостатками будут:

  • Скорость.Это будет значительно медленнее.
  • Это не для использования в режиме реального времени, обмен сообщениями objc значительно медленнее и может блокироваться.
  • Это не переносимо.
  • Это плохо интегрируетсяс другими библиотеками.
  • В зависимости от того, как вы к этому подходите, это может оказать огромное влияние на память.Для использования массива NSNumbers (например) потребуется несколько раз памяти.Фактически, это то, что подразумевает ваш пост - NSMutableArray из NSNumber s.
  • Вы не научитесь правильно читать или писать аудиопрограммы.Программы, которые вы видите в реальном мире, обычно написаны на C ++ и C.
  • массив AC не страшная вещь =)
  • Вы, вероятно, просто закончите переписыватьэто когда вам нужно использовать его повторно, потому что в большинстве случаев это неправильный инструмент для работы.
0 голосов
/ 12 февраля 2012

DSP, использующий объекты Objective C во внутренних циклах, плох по соображениям производительности.По этой причине, среди прочего, вы найдете большинство аудиофильтров и алгоритмов DSP, опубликованных на простом C, возможно, C ++ или аналогичном псевдокоде.Так что, возможно, вам все равно придется привыкнуть к чтению простого кода C DSP.

Кроме того, C является подходящим подмножеством Objective C.

...