Если у вас есть часть формы волны в памяти, тогда довольно легко вычислить значения амплитуды в дБ (хотя вам нужно будет решить, на какую опорную величину вы указываете 0 дБ). Как правило, если вы хотите, чтобы кратковременная величина отображалась на измерителе VU, вам необходимо исправить мгновенные значения формы сигнала (для этого можно использовать abs), а затем пропустить эти выпрямленные значения с помощью простого фильтра нижних частот. с постоянной времени порядка, скажем, 100 мс. Чтобы преобразовать значения в дБ, вы сделаете это:
amplitude_dB = 20 * log10(amplitude) + calibration_dB;
где амплитуда - это выпрямленная и отфильтрованная амплитуда, а калибровка_дБ - это смещение, чтобы дать вам правильную амплитуду для 0 дБ, независимо от того, что может быть в вашем конкретном приложении (например, дБ для полной шкалы или калиброванное значение дБВ или дБм) .
Простой, но эффективный фильтр нижних частот может быть реализован следующим образом. Это будет однополюсный БИХ (рекурсивный) фильтр. Каждый выход зависит от предыдущего выходного значения и текущего входного значения. У нас есть постоянный коэффициент, альфа, который эффективно определяет постоянную времени или частоту среза этого фильтра нижних частот.
y = alpha * x + (1.0 - alpha) * y_old;
y_old = y;
- x = текущее значение ввода
- y = новое выходное значение
- y_old = предыдущее выходное значение
- alpha = константа, которая определяет отклик фильтра - небольшое положительное число - попробуйте начать с 0,001 и поэкспериментируйте