repstosw 18 7 марта Опубликовано 7 марта · Жалоба Получаю массив данных с демодулятора цифрового трансивера. Написано, что данные в формате signed 7-bit integer. Нужно просмотреть отсчёты в Audacity. Пробовал преобразовать в знаковое 8 бит двумя способами: 1) t = (t&0x3F)|((t>>6)<<7); 2) t = t<<1; В обоих случаях выходит фигня - нарушается плавность переходов через 0 (с + на - и наоборот): как правильно преобразовать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 32 7 марта Опубликовано 7 марта · Жалоба 3) t = ((0x40 & t) << 1) | t; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 7 марта Опубликовано 7 марта · Жалоба t |= (t & 0x40) << 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 6 7 марта Опубликовано 7 марта · Жалоба Это правильно, если число в дополнительном коде, а может быть знак отдельно, значение отдельно и всегда положительное. И еще вопрос в этом случае, в каком бите знак. Может быть и в восьмом. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 марта Опубликовано 7 марта · Жалоба 53 minutes ago, repstosw said: Получаю массив данных с демодулятора цифрового трансивера. Написано, что данные в формате signed 7-bit integer. Нужно просмотреть отсчёты в Audacity. Пробовал преобразовать в знаковое 8 бит двумя способами: 1) t = (t&0x3F)|((t>>6)<<7); 2) t = t<<1; В обоих случаях выходит фигня - нарушается плавность переходов через 0 (с + на - и наоборот): как правильно преобразовать? Какой формат для Audacity нужен ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 7 марта Опубликовано 7 марта · Жалоба 41 минуту назад, repstosw сказал: как правильно преобразовать? Для 32-разрядного ARM: int result = (int)inData << 25 >> 25; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 марта Опубликовано 7 марта · Жалоба 6 minutes ago, jcxz said: Для 32-разрядного ARM: int result = (int)inData << 25 >> 25; Проверьте на 0xFF Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 7 марта Опубликовано 7 марта · Жалоба 5 минут назад, x893 сказал: Проверьте на 0xFF И что? Нормально сработает. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 7 марта Опубликовано 7 марта · Жалоба 2 hours ago, Alex11 said: Это правильно, если число в дополнительном коде, а может быть знак отдельно, значение отдельно и всегда положительное. И еще вопрос в этом случае, в каком бите знак. Может быть и в восьмом. Бывает и хуже: encoding-an-integer-in-7-bit-format-of-c-sharp-binaryreader-readstring Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 7 марта Опубликовано 7 марта (изменено) · Жалоба 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. Но переход с минуса в плюс по-прежнему резкий: Ещё попробовал сделать так: 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; Но что-то всё-равно выглядит не так... Изменено 7 марта пользователем repstosw Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 8 марта Опубликовано 8 марта · Жалоба 1 час назад, repstosw сказал: Попробовал. Уже по-лучше: положительные и отрицательные полу-волны сравнялись и стали по 0.5. Но переход с минуса в плюс по-прежнему резкий: Ну а чего-ж вы хотите? У вас идёт переполнение - значение уходит ниже -64 и переходит в положительную область (63 и менее). Так и должно выглядеть. Это у вас получается похоже - график вращающегося угла? Видимо вектор какой-то. Который вращается в отрицательную сторону и проходит из одного периода в другой. Тогда чего-ж вы хотите? Так и должно выглядеть. Чтобы не было скачков, надо после каждого переполнения смещать 0 по оси Y на -1 (вниз). И будет гладко. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 марта Опубликовано 8 марта · Жалоба 1 hour ago, jcxz said: Это у вас получается похоже - график вращающегося угла? Видимо вектор какой-то. Который вращается в отрицательную сторону и проходит из одного периода в другой. Это мягкие решения с фазового демодулятора Si4463. Отсчёты нужно будет подвергать ЦОС - правильно просемплировать, обезглитчить и получить отсчёты в диапазоне [0..1], которые пойдут на мягкую коррекцию ошибок. В итоге всё должно свестить к битовой последовательности. 1 hour ago, jcxz said: Тогда чего-ж вы хотите? Так и должно выглядеть. Честно говоря, я не знаю, как правильно должен выглядеть выход с демодулятора. Он внутри Si4463. Сейчас главное правильно сконвертить 7-bit signed в 8/16/32- bit signed. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 32 8 марта Опубликовано 8 марта · Жалоба 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); Ошибаетесь.. Вот код для проверки: 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 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 8 марта Опубликовано 8 марта · Жалоба 2 часа назад, blackfin сказал: Ошибаетесь.. Вот код для проверки: 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 Это одинаковое в том плане, что и то и другое - неверно. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 марта Опубликовано 8 марта · Жалоба 40 minutes ago, jcxz said: Это одинаковое в том плане, что и то и другое - неверно. Использую ваш способ. И на счёт скачков фазы тоже разобрался: ключевое слово - unwrap. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться