iPhone - как измерить амплитуду PCM кодированный сигнал

вот моя проблема под рукой:

  1. Я должен проанализировать аудиоданные в в реальном времени для обнаружения амплитуды сигнала
  2. Я не могу использовать AudioQueue, измеряющий функциональность, потому что это имеет слишком много задержки обнаружения пиков
  3. Я изучил aurioTouch пример..... однако...

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

В моем обратном вызове, когда я анализирую буфер, он только имеет 0 и-1 в нем - при использовании NSLog ("%d"). Это имеет смысл, который я предполагаю, потому что это - PCM.

Я не могу найти место в aurioTouch, где волшебство преобразования 0/-1 поток в форму сигнала происходит :-((

Также, после того как у меня есть форма сигнала в памяти, как я анализирую амплитуду и как преобразовать это чтение в дБ?

Я не хочу использовать FFT, потому что я не интересуюсь частотой, и я надеюсь, что существуют другие пути.

Удачи

Циновка

8
задан Billy ONeal 8 June 2011 в 02:41
поделиться

2 ответа

Auriotouch - это правильный пример, чтобы посмотреть. К сожалению, код просто ужасен. Убедитесь, что вы используете только его только для того, чтобы узнать концепции, стоящие за работой с аудиоустройством Retource.

Фактический рисунок формы сигнала происходит вправо в обратном вызове RenderProc, который вызывается CoreAdio, когда данные PCM станут доступными. Посмотрите на Flowthru () в AuriotchappDelegate.mmm:197 ... дальше вниз, в очереди 237

SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);

... Вот где доступна фактические данные PCM. Это данные, которые вам нужно будет проанализировать, чтобы получить пик / среднюю мощность сигнала.

1
ответ дан 5 December 2019 в 15:23
поделиться

Я приземлился здесь сегодня в поисках способа определить (через php), является ли конкретное изображение .png альфа-png -
Ответ Дэвида Джонса указывает на правильное направление, действительно легко реализовать в php:

file _ get _ contents , чтобы загрузить только этот 25 'байт (там, действительно!), и
ord () , чтобы получить свое значение ASCII, чтобы проверить его (против' 6 'в моем случае)

if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) {
  is_alpha_png_so_do_something();
  }

на самом деле я нуждался в том, что для обеспечения обратной совместимости. в пределах cms-user-generated-pages, чтобы заменить все alpha-png < img > тэгов на inline-block < spans > - файл alpha-png будет затем служить переменной для ms-проприетарного свойства css filter

.alpha_png_span{
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop')
  }

... и все это работает, так что спасибо!

паоло

-121--3894504-

После того, как в памяти появится фрагмент формы сигнала, довольно легко вычислить значения амплитуды в дБ (хотя вам нужно будет решить, какова опорная величина для 0 дБ). Как правило, если требуется вид кратковременной величины, которая может отображаться на измерителе БУ, необходимо исправить мгновенные значения формы сигнала. (для этого можно использовать abs), а затем передать эти выпрямленные значения через простой фильтр нижних частот с постоянной времени порядка, скажем, 100 мс. Для преобразования значений в дБ вы сделаете следующее:

амплитуда _ dB = 20 * log10 (амплитуда) + calibration_dB;

where амплитуда является выпрямленной и отфильтрованной величиной, а calibration_dB является смещением, чтобы дать вам правильную амплитуду для 0 dB, независимо от того, что может быть в вашем конкретном применении (например, dB re full scale, или калиброванное значение dBV или dBm).

Простой, но эффективный фильтр нижних частот может быть реализован следующим образом. Это будет однополюсный (рекурсивный) фильтр БИХ. Каждый выход зависит от предыдущего выходного значения и текущего входного значения. У нас есть постоянный коэффициент, альфа, который эффективно определяет постоянную времени или частоту отсечки этого фильтра нижних частот.

y = alpha * x + (1.0 - alpha) * y_old;
y_old = y;
  • x = текущее входное значение
  • y = новое выходное значение
  • y _ old = предыдущее выходное значение
  • alpha = константа, которая определяет отклик фильтра - небольшое положительное число - попробуйте 0,001 начать с
10
ответ дан 5 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: