частота дискретизации аудиоустройства и размер буфера - PullRequest
1 голос
/ 05 января 2012

Я сталкиваюсь с действительно недоразумением при сэмплировании звука iphone с помощью remoteIO.

с одной стороны, я могу сделать это по математике: частота дискретизации 44 кГц означает 44 выборки за 1 мс. это означает, что если я установлю bufferSize на 0,005 с помощью:

float bufferLength = 0.00005;
     AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferLength), &bufferLength);

, что означает размер буфера 5 мс, что означает 44 * 5 = 220 выборок в буфере для каждого обратного вызова. НО я получаю 512 образцов из inNumberFrames каждого обратного вызова. и он остается фиксированным, даже когда я изменяю длину буфера.

Другое дело, мои обратные вызовы каждые 11 мс и не меняются! мне нужны более быстрые обратные вызовы.

так! что происходит здесь ? кто что ставил?

Мне нужно передать цифровую информацию в модуляции FSK и точно знать размер буфера в сэмплах и время его получения, чтобы знать, как правильно его FFT.

есть объяснения по этому поводу? Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 05 января 2012

На всех современных устройствах iOS 10 нет способа получать обратные вызовы буфера аудиозаписи RemoteIO с большей скоростью, чем каждые 5-6 миллисекунд. ОС может даже решить переключиться на отправку еще больших буферов с более низкой скоростью обратного вызова во время выполнения. Запрашиваемая вами скорость - это просто запрос, после чего ОС определяет действительные скорости, которые возможны для оборудования, драйвера устройства и состояния устройства. Эта скорость может оставаться фиксированной, а может и не фиксироваться, поэтому вашему приложению просто придется иметь дело с различными размерами буфера и скоростями.

Один из вариантов может состоять в том, чтобы объединить каждый буфер обратного вызова в свой собственный буфер и нарезать этот второй буфер так, как вам нравится вне звукового обратного вызова. Но это не уменьшит фактическую задержку.

3 голосов
/ 05 января 2012

мне нужно передать цифровую информацию в модуляции FSK и точно знать размер буфера в сэмплах и время его получения, чтобы знать, как правильно его FFT преобразовать.

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

Вы должны создать свой собственный буфер для своего процессора и сообщать о задержке (где это применимо).Вы можете попытаться уменьшить задержку на стене, выбрав другую частоту выборки или используя меньшее значение N.

1 голос
/ 06 июля 2012

Свойство аудио сеанса является рекомендуемым значением.Вы можете ввести очень маленькое число, но просто перейдете к минимальному значению.Самое быстрое, что я видел на устройстве iOS при использовании 16-битного стерео, было 0.002902 second (~ 3 мс).

Это 128 сэмплов (стереофонических кадров LR) на один обратный вызов.Таким образом, 512 байт на обратный вызов.Итак, 128/44100 = 0.002902 seconds.

Вы можете проверить это с помощью:

AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &bufferDuration)

Может ли значение 512 в исходном сообщении означать байты вместо образцов?

...