summaryrefslogtreecommitdiffstats
path: root/Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp')
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/Quantization/src/Quantization.cpp103
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);
+ }
+}