📄 codec_test.cpp
字号:
1e-6 * pr.bits_used / pr.encoder_time);
printf(" Decoding speed = %8.3f Msymbols/s = %8.3f Mbits/s\n",
1e-6 * pr.test_symbols / pr.decoder_time,
1e-6 * pr.bits_used / pr.decoder_time);
puts("====================================================================="
"====");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Binary_Benchmark(int num_cycles)
{
// set simulation parameters
int num_simulations = 10;
double entropy = 0.1, entropy_increment = 0.1;
// variables
Test_Result result;
Random_Bit_Source src;
Arithmetic_Codec codec(SimulTests >> 2);
Static_Bit_Model static_model;
Adaptive_Bit_Model adaptive_model;
Chronometer encoder_time, decoder_time, source_time;
// assign memory for random test data
unsigned code_bits;
unsigned char * source_bits = new unsigned char[2*SimulTests];
unsigned char * decoded_bits = source_bits + SimulTests;
if (source_bits == 0) Error("Cannot assign memory for random bit buffer");
for (int simul = 0; simul < num_simulations; simul++) {
for (int pass = 0; pass <= 1; pass++) {
src.set_entropy(entropy);
src.set_seed(1839304 + 2017 * simul);
result.alphabet_symbols = 2;
result.entropy = src.entropy();
result.test_symbols = 0;
result.bits_used = 0;
source_time.reset(); // reset all chronometers
encoder_time.reset();
decoder_time.reset();
for (int cycle = 0; cycle < num_cycles; cycle++) {
source_time.start();
Fill_Bit_Buffer(src, source_bits);
source_time.stop();
if (pass == 0) {
static_model.set_probability_0(src.symbol_0_probability());
encoder_time.start();
code_bits = Encode_Bit_Buffer(source_bits, static_model, codec);
encoder_time.stop();
decoder_time.start();
Decode_Bit_Buffer(decoded_bits, static_model, codec);
decoder_time.stop();
}
else {
adaptive_model.reset();
encoder_time.start();
code_bits = Encode_Bit_Buffer(source_bits, adaptive_model, codec);
encoder_time.stop();
adaptive_model.reset();
decoder_time.start();
Decode_Bit_Buffer(decoded_bits, adaptive_model, codec);
decoder_time.stop();
}
result.test_symbols += SimulTests;
result.bits_used += code_bits;
// check for decoding errors
for (int k = 0; k < SimulTests; k++)
if (source_bits[k] != decoded_bits[k]) Error("incorrect decoding");
}
result.encoder_time = encoder_time.read();
result.decoder_time = decoder_time.read();
Display_Results(simul == 0, pass != 0, result, source_time.read());
}
entropy += entropy_increment;
}
delete [] source_bits;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void General_Benchmark(int data_symbols,
int num_cycles)
{
// set simulation parameters
double entropy, entropy_increment;
if (data_symbols <= 8) {
entropy = 0.2;
entropy_increment = 0.20;
}
else
if (data_symbols <= 32) {
entropy = 0.5;
entropy_increment = 0.25;
}
else {
entropy = 1.0;
entropy_increment = 0.50;
}
int num_simulations = 1 + int((log(data_symbols) / log(2.0) - entropy) /
entropy_increment);
// variables
Test_Result result;
Random_Data_Source src;
Arithmetic_Codec codec(SimulTests << 1);
Static_Data_Model static_model;
Adaptive_Data_Model adaptive_model(data_symbols);
Chronometer encoder_time, decoder_time, source_time;
// assign memory for random test data
unsigned code_bits;
unsigned short * source_data = new unsigned short[2*SimulTests];
unsigned short * decoded_data = source_data + SimulTests;
if (source_data == 0) Error("Cannot assign memory for random data buffer");
adaptive_model.set_alphabet(data_symbols);
for (int simul = 0; simul < num_simulations; simul++) {
for (int pass = 0; pass <= 1; pass++) {
src.set_truncated_geometric(data_symbols, entropy);
src.set_seed(8315739 + 1031 * simul + 11 * data_symbols);
result.alphabet_symbols = data_symbols;
result.entropy = src.entropy();
result.test_symbols = 0;
result.bits_used = 0;
source_time.reset(); // reset all chronometers
encoder_time.reset();
decoder_time.reset();
for (int cycle = 0; cycle < num_cycles; cycle++) {
source_time.start();
Fill_Data_Buffer(src, source_data);
source_time.stop();
if (pass == 0) {
static_model.set_distribution(data_symbols, src.probability());
encoder_time.start();
code_bits = Encode_Data_Buffer(source_data, static_model, codec);
encoder_time.stop();
decoder_time.start();
Decode_Data_Buffer(decoded_data, static_model, codec);
decoder_time.stop();
}
else {
adaptive_model.reset();
encoder_time.start();
code_bits = Encode_Data_Buffer(source_data, adaptive_model, codec);
encoder_time.stop();
adaptive_model.reset();
decoder_time.start();
Decode_Data_Buffer(decoded_data, adaptive_model, codec);
decoder_time.stop();
}
result.test_symbols += SimulTests;
result.bits_used += code_bits;
// check for decoding errors
for (int k = 0; k < SimulTests; k++)
if (source_data[k] != decoded_data[k]) Error("incorrect decoding");
}
result.encoder_time = encoder_time.read();
result.decoder_time = decoder_time.read();
Display_Results(simul == 0, pass != 0, result, source_time.read());
}
entropy += entropy_increment;
}
delete [] source_data;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Main function - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main(int numb_arg, char * arg[])
{
// set number of tests from command-line parameter
if ((numb_arg != 2) && ((numb_arg != 3))) {
puts(" Parameters: alphabet_symbols [test_cycles=10]");
return 0;
}
int ns = atoi(arg[1]), tc = (numb_arg < 3 ? 10 : atoi(arg[2]));
if ((ns < 2) || (ns > 500)) Error("invalid number of data symbols");
if ((tc < 1) || (tc > 999)) Error("invalid number of simulations");
if (ns == 2)
Binary_Benchmark(tc);
else
General_Benchmark(ns, tc);
return 0;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -