casacore
Loading...
Searching...
No Matches
weightblockencoder.h
Go to the documentation of this file.
1#ifndef DYSCO_WEIGHT_BLOCK_ENCODER_H
2#define DYSCO_WEIGHT_BLOCK_ENCODER_H
3
4#include <cmath>
5#include <cstring>
6
7#include "timeblockbuffer.h"
8
10 public:
11 WeightBlockEncoder(size_t nPolarizations, size_t nChannels, size_t quantCount)
12 : _nPolarizations(nPolarizations), _nChannels(nChannels), _quantCount(quantCount) {}
13
14 size_t MetaDataFloatCount() const { return 1.0; }
15
16 size_t SymbolCount(size_t nRowsInBlock) const { return nRowsInBlock * _nChannels; }
17
18 void InitializeDecode(const float *metaBuffer) { _decodeMaxValue = metaBuffer[0]; }
19
20 void Decode(TimeBlockBuffer<float> &buffer, const unsigned int *symbolBuffer,
21 size_t blockRow) const {
22 double scaleValue = _decodeMaxValue / (double(_quantCount - 1));
23 TimeBlockBuffer<float>::DataRow &row = buffer[blockRow];
24 const unsigned int *rowBuffer = &symbolBuffer[blockRow * _nChannels];
25 for (size_t ch = 0; ch != _nChannels; ++ch) {
26 float value = *rowBuffer * scaleValue;
28 float *chPtr = &row.visibilities[ch * _nPolarizations];
29 for (size_t p = 0; p != _nPolarizations; ++p) chPtr[p] = value;
30 ++rowBuffer;
31 }
32 }
33
34 void Encode(TimeBlockBuffer<float> &buffer, float *metaBuffer, unsigned int *symbolBuffer) const {
35 float maxValue = 0.0;
36 for (const TimeBlockBuffer<float>::DataRow &row : buffer.GetVector()) {
37 for (size_t ch = 0; ch != _nChannels; ++ch) {
38 const float *visPtr = &row.visibilities[ch * _nPolarizations];
39 float weight = *visPtr;
40 for (size_t p = 1; p != _nPolarizations; ++p)
41 if (visPtr[p] < weight) weight = visPtr[p];
42 if (weight > maxValue) maxValue = weight;
43 }
44 }
45 if (maxValue == 0.0) maxValue = 1.0;
46 metaBuffer[0] = maxValue;
47
48 double scaleValue = double(_quantCount - 1) / maxValue;
49
50 for (const TimeBlockBuffer<float>::DataRow &row : buffer.GetVector()) {
51 for (size_t ch = 0; ch != _nChannels; ++ch) {
52 const float *visPtr = &row.visibilities[ch * _nPolarizations];
53 float weight = *visPtr;
54 for (size_t p = 1; p != _nPolarizations; ++p)
55 if (visPtr[p] < weight) weight = visPtr[p];
56
57 *symbolBuffer = roundf(double(weight) * scaleValue);
58 ++symbolBuffer;
59 }
60 }
61 }
62
63 private:
64 const size_t _nPolarizations;
65 const size_t _nChannels;
66 const size_t _quantCount;
68};
69
70#endif
const std::vector< DataRow > & GetVector() const
void InitializeDecode(const float *metaBuffer)
size_t MetaDataFloatCount() const
void Encode(TimeBlockBuffer< float > &buffer, float *metaBuffer, unsigned int *symbolBuffer) const
void Decode(TimeBlockBuffer< float > &buffer, const unsigned int *symbolBuffer, size_t blockRow) const
WeightBlockEncoder(size_t nPolarizations, size_t nChannels, size_t quantCount)
const size_t _nPolarizations
size_t SymbolCount(size_t nRowsInBlock) const
std::vector< data_t > visibilities