diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp')
| -rw-r--r-- | Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp new file mode 100644 index 0000000..9198223 --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp @@ -0,0 +1,103 @@ +/* + * Quantization.cpp + * + * Created on: 02.04.2011 + * Author: sven + */ + +#ifndef QUANTIZATION_H_ + #include "Quantization.h" +#endif + +#ifndef _GLIBCXX_FSTREAM + #include <fstream> +#endif + +#ifndef _GLIBCXX_NUMERIC_LIMITS + #include <limits> +#endif + +#ifndef _GLIBCXX_CMATH + #include <cmath> +#endif + +#ifndef _GLIBCXX_IOSTREAM + #include <iostream> +#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<short>::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<short>::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<unsigned short>::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; i<mNumQuantizationValues; i++) { + quantRangePtr = new QuantizationRange; + quantRangePtr->mMinValue = 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); + } +} |
