Диапазон энкодер неверно декодирует, может ли кто -нибудь идентифицировать, что энкодер плохой, только декодер? Если да,C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Диапазон энкодер неверно декодирует, может ли кто -нибудь идентифицировать, что энкодер плохой, только декодер? Если да,

Сообщение Anonymous »

Я не понимаю кодировки диапазона. Я спросил Chatgpt, если бы он написал основной алгоритм, написал тесты. Каждый вход составляет 1 байт, но у меня есть только 3 различных значения, поэтому их следует кодируемым как менее 2 бит.10 20 30 30 20 10 10 10 20 30
< /code>
сгенерирован с помощью Function Test2. Есть три разных значения 10,20,30. Я смотрю на 1 байт. Идея состоит в том, чтобы сжать их, используя кодирование диапазона, затем декодировать и вернуть исходные значения, чтобы доказать, что он работает. Мы находим 20, и это также имеет частоту 1/257, затем 30, которая составляет 1/258. Затем мы снова находим 30, которая имеет частоту 2/259. В какой -то момент ясно, что первоначальный 256 должен быть выброшен. Это было там, потому что общий вес 0 не имеет смысла. Возможно, я должен изменить начальный вес на 0, то первые 10 будут иметь частоту 1/1, 20 1/2, затем 30 1/3, затем 2/3. Но в байте 4, который составляет 20, значение внезапно 219. Я не понимаю, каким должен быть расчет. Поскольку он не реконструирует правильные значения, я создал функцию отладки для отображения состояния кодера/декодера. Вы можете видеть, что, начиная с номера 4, все идет не так. (0-3 верны). < /P>
10 20 30 30 20 10 10 10 20 30
ENC: symbol=10 low=0x9fffff6 range=0xffffff r=0xffff total=256 cumul=10 freq=1
ENC: symbol=20 low=0xa14eaf6 range=0xff00 r=0xfe total=257 cumul=21 freq=1
ENC: symbol=30 low=0x150a96a0 range=0xfd05 r=0xfb total=258 cumul=32 freq=1
ENC: symbol=30 low=0xab5e2c0 range=0x1f42c r=0x1ee total=259 cumul=32 freq=2
ENC: symbol=20 low=0xb60b2602 range=0x3d8f4 r=0x3c9 total=260 cumul=21 freq=2
ENC: symbol=10 low=0x8b4bbed2 range=0x78c2a r=0x767 total=261 cumul=10 freq=2
ENC: symbol=10 low=0xcc089124 range=0x161fbe r=0x159e total=262 cumul=10 freq=3
ENC: symbol=10 low=0x89687df6 range=0x5623fc r=0x53d9 total=263 cumul=10 freq=4
ENC: symbol=20 low=0xf052afd0 range=0xfa973a r=0xf2ff total=264 cumul=24 freq=3
ENC: symbol=30 low=0xf075acb4 range=0x2d63c r=0x2bd total=265 cumul=37 freq=3
DEC: symbol=10 low=0x9fffff6 range=0xffffff code=0xa150ab7 r=0xffff total=256 cumul=10 freq=1
DEC: symbol=20 low=0xa14eaf6 range=0xff00 code=0xa150ab7 r=0xfe total=257 cumul=21 freq=1
DEC: symbol=30 low=0x150a96a0 range=0xfd05 code=0x150ab78c r=0xfb total=258 cumul=32 freq=1
DEC: symbol=30 low=0xab5e2c0 range=0x1f42c code=0xab78ccd r=0x1ee total=259 cumul=32 freq=2
DEC: symbol=217 low=0xb78be552 range=0x1ec7a code=0xb78ccd8a r=0x1e4 total=260 cumul=221 freq=1
DEC: symbol=119 low=0x8ccd67ce range=0x1e30a code=0x8ccd8af1 r=0x1d9 total=261 cumul=123 freq=1
DEC: symbol=18 low=0xcd8ad58e range=0x1d7fa code=0xcd8af1f5 r=0x1cd total=262 cumul=19 freq=1
DEC: symbol=14 low=0x8af07936 range=0x1cb6a code=0x8af1f5ac r=0x1bf total=263 cumul=15 freq=1
DEC: symbol=211 low=0xf1f4934c range=0x1bd7e code=0xf1f5acb4 r=0x1af total=264 cumul=218 freq=1
DEC: symbol=160 low=0xf5ac0a04 range=0x1ae5c code=0xf5acb400 r=0x19f total=265 cumul=167 freq=1
10 20 30 30 217 119 18 14 211 160
4 20 217
5 10 119
6 10 18
7 10 14
8 20 211
9 30 160
Original size: 40 bytes
Compressed size: 16 bytes
< /code>
Далее, вот код: < /p>
#include
#include
#include
#include
using namespace std;

// Range coder implementation
class RangeCoder {
private:
static constexpr uint32_t CODE_BITS = 32;
static constexpr uint32_t TOP = 1u > 8;
static constexpr uint32_t TOTAL_FREQ = 0x10000; // Maximum total frequency (64K)

// Frequency model for adaptive coding
struct FrequencyModel {
vector freq; // Symbol frequencies
vector cumul; // Cumulative frequencies
uint32_t total; // Total frequency

FrequencyModel(int numSymbols) {
freq.resize(numSymbols, 1); // Start with 1 for each symbol
cumul.resize(numSymbols + 1, 0);
update();
}

void update() {
total = 0;
for (size_t i = 0; i < freq.size(); i++) {
cumul = total;
total += freq;
}
cumul[freq.size()] = total;
}

void increment(int symbol) {
freq[symbol]++;
if (total >= TOTAL_FREQ) {
// Rescale frequencies if we exceed the maximum
for (size_t i = 0; i < freq.size(); i++) {
freq = (freq + 1) >> 1;
}
update();
} else {
// Incrementally update cumulative frequencies
for (size_t i = symbol + 1; i

Подробнее здесь: https://stackoverflow.com/questions/794 ... oder-bad-j
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»