как использовать собственный тип с фиксированной точкой (8.24) для обработки аудио iOS - PullRequest
4 голосов
/ 23 мая 2011

, поэтому я хочу правильно масштабировать числа с плавающей точкой в ​​диапазоне от -1 до +1 в формате, ожидаемом AUGraph, с форматом потока, настроенным так:

size_t bytesPerSample = sizeof (AudioUnitSampleType); // is 4 bytes

stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;                    
stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate        = graphSampleRate; // 44.1k

этот вопрос помог мне настроить график, но когда я разыграл число с плавающей точкой следующим образом:

sampleValueLeft = (Fixed) (floatVal * 32767.0f); 
// there doesn't seem to be any difference whether i cast into 
// SInt16 or SInt32 (which the Fixed type is defined to be)..

работает, сигнал звучит хорошо, но очень тихо. Так я делаю масштабирование неправильно? Масштабирование на большее число портит сигнал. Не похоже на отсечение, и выходная громкость не становится выше. Я не собираюсь углубленно изучать математику с фиксированной запятой, все, что мне нужно, это однострочный, который приводится в нужный формат.

спасибо!

edit: я использовал другой формат потока, до которого я не мог понять, как правильно использовать стереофонический сигнал. С этой другой настройкой у меня не было проблем с выходной громкостью, поэтому я считаю, что проблема усиления должна быть связана с масштабированием ...

Ответы [ 2 ]

5 голосов
/ 21 мая 2013

Прочитайте post , это действительно хорошее объяснение в формате iOS 8.24.

Вот его вывод:
В основном это говорит о том, что первые (левые) 8 бит выделены только для знака (+/-), остальные 24 бита - это звук.
Поэтому, если вы хотите преобразовать его в Sint16, сдвиньте биты на 9 позиций вправо и выполните приведение. Таким образом, знак (+/-) сохраняется в качестве первого бита, а звуковые данные уменьшаются до более низкой точности.
Если вы хотите, чтобы он находился как число с плавающей точкой в ​​диапазоне (+/-) от 1 до 0, разделите его на максимально возможное значение, равное 32768.

Вот код:

    SInt16 sampleInt16 = (SInt16)(samples[i] >> 9);
    float sampleFloat = sampleInt16 / 32768.0;
3 голосов
/ 04 июня 2011

Я ненавижу 8.24, потому что я не думаю, что есть удобные функции, чтобы делать математику с ним.

Встречное предложение: разместите конвертер (AUConverter) в передней части графика и настройте входной ASBD, чтобы он был более удобным для вас, например, 16-битные или любые другие (я всегда использую в iOS ..) Поплавки могут работать в конвертере, но я бы на это не рассчитывал. Не устанавливайте выход конвертера ASBD; по умолчанию это будет аудиоустройство каноническое (8.24). Фактически, посмотрите, можете ли вы установить удобный ASBD на вашем первом устройстве без использования AUConverter.

...