У меня есть ряд временных рядов, каждый из которых содержит последовательность из 400 чисел, которые находятся близко друг к другу. У меня есть тысячи временных рядов; у каждого есть своя серия близких чисел.Серия сжатых чисел в C
TimeSeries1 = 184,56, 184,675, 184,55, 184,77, ...
TimeSeries2 = 145,73, 145,384, 145,96, 145,33, ...
TimeSeries3 = -126,48, -126,78, -126,55,. ..
Я могу хранить 8-байтовый двойной для каждого временного ряда, поэтому для большинства временных рядов я могу сжать каждый двойной бит в один байт, умножив его на 100 и выбрав дельту текущего значения и предыдущее значение. Вот мой компресс/распаковка код:
struct{
double firstValue;
double nums[400];
char compressedNums[400];
int compressionOK;
} timeSeries;
void compress(void){
timeSeries.firstValue = timeSeries.nums[0];
double lastValue = timeSeries.firstValue;
for (int i = 1; i < 400; ++i){
int delta = (int) ((timeSeries.nums[i] * 100) - (lastValue* 100));
timeSeries.compressionOK = 1;
if (delta > CHAR_MAX || delta < -CHAR_MAX){
timeSeries.compressionOK = 0;
return;
}
else{
timeSeries.compressedNums[i] = (char) delta;
lastValue = timeSeries.nums[i];
}
}
}
double decompressedNums[400];
void decompress(void){
if (timeSeries.compressionOK){
double lastValue = timeSeries.firstValue;
for (int i = 1; i < 400; ++i){
decompressedNums[i] = lastValue + timeSeries.compressedNums[i]/100.0;
lastValue = decompressedNums[i];
}
}
}
Я могу терпеть некоторые lossiness, порядка .005 на число. Тем не менее, я получаю больше потерь, чем могу терпеть, тем более, что прецизионная потеря в одной из сжатых серий переносится вперед и вызывает увеличение потерь.
Так что мои вопросы:
- Есть ли что-то можно изменить, чтобы уменьшить lossiness?
- Есть ли вообще другой метод сжатия, который сопоставим или лучше, чем это соотношение 8 к 1?
Возможно, вы должны использовать явный 'подписанный символ сжатыйNums [400];' поскольку простой символ может быть подписан или без знака. –
Обратите внимание, что если разница между последовательными значениями больше ± 1,27, ваша схема сжатия не будет работать. Очевидно, вы можете заметить это при сжатии, и вам нужно будет знать, как его обрабатывать. Вместо этого вы могли бы использовать «короткий», который позволил бы ± 320 между последовательными значениями (с разрешением 0,01 или ± 32 с разрешением 0,001). Если дельта между последовательными значениями достаточно мала, вы должны приблизиться к совершенному поведению. –