Конвертировать 6/10/12-битные потоки в масштабированные беззнаковые / короткие - PullRequest
2 голосов
/ 17 июня 2011


В мире ПК байт обычно обозначает выравнивание границы памяти в 8 битов, которое компьютер рассматривает как единое целое. В мини-компьютерах и компьютерах с мэйнфреймами также возможны более длинные последовательности, такие как 16 и 32 бита (соответственно, полные слова и двойные слова).

Но в мире дистанционного зондирования датчики / детекторы используются для измерения изменений интенсивности излучения от атмосферы и Земли с использованием их собственных радиометрических разрешений, таких как 6-битное, 10-битное и 12-битное. Таким образом, изображение необработанных данных, полученное с помощью дистанционного считывания, полученное наземной станцией, всегда упаковывается в виде 6-битных, 10-битных или 12-битных потоков BCD. Эти данные хранятся в отсканированном виде по отсканированной линии.

Моя работа состоит в том, чтобы читать этот вид отсканированной строки один за другим в виде открытого двоичного файла и некоторое время сохранять в неподписанном исходном буфере символа. Для 6-битного потока я должен масштабироваться до 8-битного (один байт), а для 10-битного или 12-битного потока я сделаю их масштабируемыми беззнаковыми короткими целыми числами. Наконец, я должен получить неподписанный символ (для 6-битного) или неподписанный короткий целевой буфер.

Не могли бы вы показать мне, как это сделать? Демонстрация кода C / C ++ будет высоко оценена! Спасибо.

10101010 01110101 00011001
|         |
-----------
 10-bit BCD

10101010 01110101 00011001
      |         |
      -----------
       10-bit BCD

10101010 01110101 01100110
       |          |
       ------------
         10-bit BCD

1 Ответ

2 голосов
/ 17 июня 2011

Обычный способ - сдвиг влево на разницу в количестве битов между входом и выходом, затем добавление старших бит со входа для заполнения младших битов.

unsigned char eightbit = (sixbit << 2) | (sixbit >> 4);
unsigned short sixteenbit = (tenbit << 6) | (tenbit >> 4);
unsigned short sixteenbit = (twelvebit << 4) | (twelvebit >> 8);

Есть альтернативный подход для младших битов, который я не видел очень часто - наполняйте их шумом. Это маскирует некоторые ошибки квантования в исходной выборке.

unsigned char eightbit = (sixbit << 2) | (sixteenbitnoise >> 14);
unsigned short sixteenbit = (tenbit << 6) | (sixteenbitnoise >> 10);
unsigned short sixteenbit = (twelvebit << 4) | (sixteenbitnoise >> 12);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...