Преобразование дополнения 2 в целое число и вычисление среднеквадратичного значения - PullRequest
0 голосов
/ 20 ноября 2018

Аналогичный вопрос был задан на Нужен самый быстрый способ преобразовать дополнение 2 в десятичное число в C , но я не смог использовать его, чтобы получить свой ответ, поэтому разместил это ...

У меня есть 32-битные данные, поступающие от аудиодатчика в следующем формате: - Формат данных: I2S, 24-битный, комплимент 2, сначала MSB.Точность данных составляет 18 бит;неиспользуемые биты - это нули.

Без какого-либо аудиовхода я могу прочитать следующие данные с датчика: -

  • 0xFA578000
  • 0xFA8AC000
  • 0xFA85C000
  • 0xFA828000
  • 0xFA800000
  • 0xFA7E4000
  • 0xFA7D0000
  • 0xFA7BC000
  • Правильно ли я выполняю битовые манипуляции с данными?
  • Необходимо ли преобразовывать выборки данных из дополнения 2 в целое число для вычисления их среднеквадратичных значений?
  • Означает ли приведенный выше код о "смещении", которое вы упомянули?
  • Мне еще предстоит найти план тестирования для проверки вычисленных децибел, но правильно ли я математически рассчитал значение в децибелах?

1 Ответ

0 голосов
/ 27 ноября 2018

Часть 2'complement выглядит так, как будто она должна работать, но она неоправданно сложна, поскольку обычные целые числа представлены с использованием 2'complement (если только вы не используете очень экзотическое оборудование).Вы можете просто сделать это вместо этого:

signed int signedInputVal = (signed int)inputVal;
signedInputVal >>= 14;

Это даст вам значение в диапазоне - (2 ^ 17) - (2 ^ 17-1).

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

(сюда не входит RMS-часть, которая появляется после того, как у вас есть правильные целочисленные значения со знаком)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...