Перейти к содержанию
    

Как правильно сконвертировать 7-битное знаковое целое число в 8-битное знаковое?

Получаю массив данных с демодулятора цифрового трансивера.

Написано, что данные в формате signed 7-bit integer.

Нужно просмотреть отсчёты в Audacity.

Пробовал преобразовать в знаковое 8 бит двумя способами:

1)  t =  (t&0x3F)|((t>>6)<<7);

2) t = t<<1;

В обоих случаях выходит фигня - нарушается плавность переходов через 0 (с + на -  и наоборот):

image.thumb.png.2766e8926413552f4b416c6c9f59860e.png  image.thumb.png.ab88049291402fecb1e68ba69d450f4a.png

 

как правильно преобразовать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это правильно, если число в дополнительном коде, а может быть знак отдельно, значение отдельно и всегда положительное. И еще вопрос в этом случае, в каком бите знак. Может быть и в восьмом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

53 minutes ago, repstosw said:

Получаю массив данных с демодулятора цифрового трансивера.

Написано, что данные в формате signed 7-bit integer.

Нужно просмотреть отсчёты в Audacity.

Пробовал преобразовать в знаковое 8 бит двумя способами:

1)  t =  (t&0x3F)|((t>>6)<<7);

2) t = t<<1;

В обоих случаях выходит фигня - нарушается плавность переходов через 0 (с + на -  и наоборот):

image.thumb.png.2766e8926413552f4b416c6c9f59860e.png  image.thumb.png.ab88049291402fecb1e68ba69d450f4a.png

 

как правильно преобразовать?

 

Какой формат для Audacity нужен ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, repstosw сказал:

как правильно преобразовать?

Для 32-разрядного ARM:

int result = (int)inData << 25 >> 25;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, jcxz said:

Для 32-разрядного ARM:

int result = (int)inData << 25 >> 25;

Проверьте на 0xFF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, x893 сказал:

Проверьте на 0xFF

И что?

Нормально сработает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Alex11 said:

Это правильно, если число в дополнительном коде, а может быть знак отдельно, значение отдельно и всегда положительное. И еще вопрос в этом случае, в каком бите знак. Может быть и в восьмом.

Бывает и хуже: encoding-an-integer-in-7-bit-format-of-c-sharp-binaryreader-readstring

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, blackfin said:

3) t = ((0x40 & t) << 1) | t;

9 hours ago, Палыч said:

t |= (t & 0x40) << 1

Это тоже самое, что и:

9 hours ago, repstosw said:

1)  t =  (t&0x3F)|((t>>6)<<7);

6-й бит ставим на место 7-го.

 

8 hours ago, jcxz said:

Для 32-разрядного ARM:

int result = (int)inData << 25 >> 25;

Попробовал.  Уже по-лучше:  положительные и отрицательные полу-волны сравнялись и стали по 0.5.   Но переход с минуса в плюс по-прежнему резкий:

image.png.f99717f50ed6f2d513e7aba50b25b3d0.pngimage.thumb.png.588e3c6b02177e780b84196fcf2517a7.png

 

Ещё попробовал сделать так:

if (t>63) t|=0x80;

 

Суть в том, что битовая идентичность должна быть как 8-бит знаковое.  Тогда, подглядывая в виндовый калькулятор в режиме "программист", получим:

63: 00111111 t

64: 01000000 - оно же: -64  t |= 0x80  - 11000000

65: 01000001 - оно же: -63 t |= 0x80 - 11000001

...

126: 01111110 - оно же: -2   t |= 0x80 - 11111110

127: 01111111 - оно же: -1   t |= 0x80 - 11111111

 

Ну тоесть - делаю вывод что нужно прилепить старший 7-й бит =1, когда t>63.

Результат аналогичен вашему преобразованию:   int result = (int)inData << 25 >> 25;

Но что-то всё-равно выглядит не так...

 

image.thumb.png.bbf18e3e8ff4c06ab8756fcb66d9c95d.png

 

 

 

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, repstosw сказал:

Попробовал.  Уже по-лучше:  положительные и отрицательные полу-волны сравнялись и стали по 0.5.   Но переход с минуса в плюс по-прежнему резкий:

image.png.f99717f50ed6f2d513e7aba50b25b3d0.pngimage.thumb.png.588e3c6b02177e780b84196fcf2517a7.png

Ну а чего-ж вы хотите? У вас идёт переполнение - значение уходит ниже -64 и переходит в положительную область (63 и менее). Так и должно выглядеть.

 

Это у вас получается похоже - график вращающегося угла? Видимо вектор какой-то. Который вращается в отрицательную сторону и проходит из одного периода в другой.

Тогда чего-ж вы хотите? Так и должно выглядеть.

Чтобы не было скачков, надо после каждого переполнения смещать 0 по оси Y на -1 (вниз). И будет гладко.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Это у вас получается похоже - график вращающегося угла? Видимо вектор какой-то. Который вращается в отрицательную сторону и проходит из одного периода в другой.

Это мягкие решения с фазового демодулятора Si4463.

Отсчёты нужно будет подвергать ЦОС - правильно просемплировать, обезглитчить и получить отсчёты в диапазоне [0..1], которые пойдут на мягкую коррекцию ошибок.

В итоге всё должно свестить к битовой последовательности.

 

1 hour ago, jcxz said:

Тогда чего-ж вы хотите? Так и должно выглядеть.

Честно говоря, я не знаю, как правильно должен выглядеть выход с демодулятора. Он внутри Si4463.

Сейчас главное правильно сконвертить 7-bit signed в 8/16/32- bit signed.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/8/2024 at 2:41 AM, repstosw said:

Это тоже самое, что и:

On 3/7/2024 at 5:12 PM, repstosw said:

1)  t =  (t&0x3F)|((t>>6)<<7);

Ошибаетесь.. :biggrin:

 

Вот код для проверки:

int t;

t = 0x7F;

t = ((0x40 & t) << 1) | t;

printf("t = 0x%X\n",t);

t = 0x7F;

t = (t & 0x3F) | ((t >> 6) << 7);

printf("t = 0x%X\n",t);

А вот результат:

t = 0xFF
t = 0xBF
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, blackfin сказал:

Ошибаетесь.. :biggrin:

Вот код для проверки:

int t;

t = 0x7F;

t = ((0x40 & t) << 1) | t;

printf("t = 0x%X\n",t);

t = 0x7F;

t = (t & 0x3F) | ((t >> 6) << 7);

printf("t = 0x%X\n",t);

А вот результат:

t = 0xFF
t = 0xBF

Это одинаковое в том плане, что и то и другое - неверно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 minutes ago, jcxz said:

Это одинаковое в том плане, что и то и другое - неверно.

Использую ваш способ.

И на счёт скачков фазы тоже разобрался: ключевое слово - unwrap.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...