/* * Quantization.cpp * * Created on: 02.04.2011 * Author: sven */ #ifndef QUANTIZATION_H_ #include "Quantization.h" #endif #ifndef _GLIBCXX_FSTREAM #include #endif #ifndef _GLIBCXX_NUMERIC_LIMITS #include #endif #ifndef _GLIBCXX_CMATH #include #endif #ifndef _GLIBCXX_IOSTREAM #include #endif Quantization::Quantization(QuantizationParameters& params) :mParams(params) { calcQuantizationValues(); std::ifstream inFile; std::ofstream outFile; inFile.open(mParams.getInputFile().c_str(), std::ios::in | std::ios::binary ); outFile.open(mParams.getOutputFile().c_str(), std::ios::out | std::ios::binary); int dataLenOffset = 0x28; char header[dataLenOffset]; inFile.read(&header[0],dataLenOffset); outFile.write(&header[0],dataLenOffset); int numSamples = 0; inFile.read((char*) &numSamples,sizeof(numSamples)); outFile.write((char*) &numSamples,sizeof(numSamples)); short data; short quantizationized; // unsigned counter = 0; for (int i=0; i < numSamples;) { inFile.read((char*) &data, sizeof(data) ); quantizationized = getQuantizationValue(data); outFile.write((char*) &quantizationized, sizeof(quantizationized) ); // std::cout << counter++ << " " << quantizationized << std::endl; i += sizeof(short); } inFile.close(); outFile.close(); std::cout << "quantization done" << std::endl; } Quantization::~Quantization() { QuantizationRangesIter it = mQuantizationRanges.begin(); for ( ;it < mQuantizationRanges.end(); ) { delete *it++; } mQuantizationRanges.clear(); } short Quantization::getQuantizationValue(short val) { // shift to unsigned posivitives values unsigned short shiftedVal = val - std::numeric_limits::min(); QuantizationRangesIter it = mQuantizationRanges.begin(); for(; it < mQuantizationRanges.end(); it++) { QuantizationRange* quantRangePtr = *it; if (quantRangePtr->IsInRange(shiftedVal)) { // shift back return quantRangePtr->mRangeValue + std::numeric_limits::min(); } } std::cout << val << " " << shiftedVal << " not quantizationized" << std::endl; return -1; } void Quantization::calcQuantizationValues() { mNumQuantizationValues = 1 << mParams.getBits(); // std::cout << mNumQuantizationValues << " quantization values" << std::endl; unsigned short valueRangeWidth = std::numeric_limits::max() / mNumQuantizationValues; // std::cout << "value range width " << valueRangeWidth << std::endl; unsigned short rangeMiddle = valueRangeWidth / 2; // std::cout << "value range middle " << rangeMiddle << std::endl; QuantizationRange* quantRangePtr = NULL; for (unsigned i=0; imMinValue = i * valueRangeWidth; quantRangePtr->mMaxValue = ((i+1) * valueRangeWidth) - 1; quantRangePtr->mRangeValue = quantRangePtr->mMinValue + rangeMiddle; quantRangePtr->mRangeWidth = valueRangeWidth; // std::cout << "quantization value "<< (i+1) << ": " << quantRangePtr->mRangeValue << std::endl; // std::cout << "Range: "<< quantRangePtr->mMinValue << " - " << quantRangePtr->mMaxValue << std::endl; mQuantizationRanges.push_back(quantRangePtr); } }