beeping-core 2.0.0
C++20 library for encoding and decoding data over sound
Loading...
Searching...
No Matches
Decoder.h
1#ifndef __DECODER__
2#define __DECODER__
3
4#include <BeepingConfig.h>
5
6#include <vector>
7
8#define MAX_DECODE_STRING_SIZE 30 // max decoded string size is 30
9
10namespace BEEPING {
11class SpectralAnalysis;
12class ReedSolomon;
13
14struct sTokenProbs {
15 int idxToken;
16 float energyRatioToken;
17 int idxToneMax;
18 int idxToneSecond;
19 float energyRatioToneMax;
20 float energyRatioToneSecond;
21 float energyToken;
22};
23
24class Decoder {
25 public:
26 Decoder(const BeepingConfig& config, float sr, int buffsize, int windowSize,
27 int numTokens, int numTones);
28 virtual ~Decoder(void);
29
30 virtual int DecodeAudioBuffer(float* audioBuffer, int size);
31 virtual int GetDecodedData(char* stringDecoded);
32
33 float GetConfidenceError();
34 float GetConfidenceNoise();
35 float GetConfidence();
36
37 float GetReceivedBeepsVolume();
38
39 int GetDecodedMode();
40
41 virtual float GetDecodingBeginFreq();
42 virtual float GetDecodingEndFreq();
43
44 int GetSpectrum(float* spectrumBuffer);
45
46 virtual int AnalyzeStartTokens(float* audioBuffer);
47 virtual int AnalyzeToken(float* audioBuffer);
48
49 virtual int ComputeStatsStartTokens(void);
50 virtual int ComputeStats(void);
51
52 int getSizeFilledFrameCircularBuffer();
53 int getSizeFilledBlockCircularBuffer();
54 int getSizeFilledBlockCircularBuffer(int mode);
55
56 virtual int DeReverbToken(const int nbins, int* freqsBins);
57
58 virtual float ComputeBlockMagSpecSumsCurrentToken(
59 int midFreqBin, int width, int nbins, std::vector<float>& sumPerFrame);
60 virtual float ComputeBlockMagSpecSumsLastToken(
61 int midFreqBin, int width, int nbins, std::vector<float>& sumPerFrame);
62
63 float mSampleRate;
64 int mBufferSize;
65
66 int mDecoding;
67 // For multiple decoding mode (will be set after first token found and guessed
68 // decoding mode)
69 int mDecodingMode; // enum DECODING_MODE { NONAUDIBLE = 0, AUDIBLE = 1,
70 // HIDDEN = 2, CUSTOM = 3 };
71
72 char mDecodedString[MAX_DECODE_STRING_SIZE]; // max decoded string size is 50
73
74 SpectralAnalysis* mSpectralAnalysis;
75
76 int mReadPosInFrameCircularBuffer; // For single decoding mode
77 int* mReadPosInBlockCircularBufferArray; // For multiple decoding mode
78 int mWritePosInFrameCircularBuffer;
79 int mSizeFrameCircularBuffer;
80 float* mCircularBufferFloat;
81 float* mAnalBufferFloat;
82
83 int mWindowSize;
84 int mHopSize;
85
86 int mNumTokens;
87 int mNumTones;
88
89 float mFreq2Bin;
90
91 int* mFreqsBins; // For single decoding mode
92 int** mFreqsBinsArray; // For multiple decoding mode
93
94 int mBinWidth;
95 int mSizeTokenBinAnal;
96 float* mEvalTokenMags;
97 float* mEvalToneMags;
98
99 // Region of interest Bin Idxs
100 int mBeginBin; // For single decoding mode
101 int mEndBin; // For single decoding mode
102 int* mBeginBinArray; // For multiple decoding mode
103 int* mEndBinArray; // For multiple decoding mode
104
105 // int mFirstTokenBinOffsetInBlock;
106 // int mBeginBinBlock;
107 // int mEndBinBlock;
108
109 int idxFrontDoorToken1;
110 int idxFrontDoorToken2;
111
112 // Token Statistics
113 float* mEnergy;
114 float* mEnergyRatios;
115 float* mEnergyStd;
116 float* mEnergyDiff;
117
118 float* mEnergyRatiosSorted;
119 int* mEnergyRatiosIdx;
120
121 // BlockStatistics (circular buffer dur = 2 * tokendur)
122 int mReadPosInBlockCircularBuffer;
123 int mWritePosInBlockCircularBuffer;
124 int mSizeBlockCircularBuffer;
125
126 int mnToleranceFrames; // 10% tolerance
127
128 float** mBlockSpecMag;
129
130 // For Statistics (Confidence)
131 sTokenProbs* mBlockTokenStatistics; // For single decoding mode
132 sTokenProbs** mBlockTokenStatisticsArray; // For multiple decoding mode
133
134 int* mBlockEnergyRatiosTokenIdx; // For single decoding mode
135 int** mBlockEnergyRatiosTokenIdx1Array; // For multiple decoding mode
136 int* mBlockEnergyStdTokenIdx;
137 int* mBlockEnergyDiffTokenIdx;
138
139 int* mBlockEnergyRatiosTokenIdx2; // For single decoding mode
140 int** mBlockEnergyRatiosTokenIdx2Array; // For multiple decoding mode
141 int* mBlockEnergyStdTokenIdx2;
142 int* mBlockEnergyDiffTokenIdx2;
143
144 int* mBlockEnergyRatiosTokenIdx3; // For single decoding mode
145 int** mBlockEnergyRatiosTokenIdx3Array; // For multiple decoding mode
146
147 int* mBlockEnergyRatiosTokenIdx4; // For single decoding mode
148 int** mBlockEnergyRatiosTokenIdx4Array; // For multiple decoding mode
149
150 int* mTokenRepetitions;
151 // float *mLastBlockTokenEnergy;
152
153 int mEndStartTokenPosInBlockCircularBuffer;
154 double mAccumulatedDecodingFrames;
155
156 int mMessageLength;
157 ReedSolomon* mReedSolomon;
158 std::vector<int> mDecodedValues;
159 int* mDecodedValuesOrig; // For reed solomon statistics
160
161 std::vector<float> mSumPerFrame;
162
163 float mConfidenceEnergyRatios;
164 float mConfidenceRepetitions;
165 float mConfidenceCorrection;
166 float mConfidence;
167
168 float mReceivedBeepsVolume;
169
170 const BeepingConfig& m_config;
171};
172} // namespace BEEPING
173
174#endif //__DECODER__