Toying with channel models; refactoring symbol former; moved filters back to time domain
This commit is contained in:
@@ -57,7 +57,7 @@ public:
|
||||
* @return The scrambled data ready for modulation.
|
||||
* @note The modulated signal is generated internally but is intended to be handled externally.
|
||||
*/
|
||||
std::vector<int16_t> transmit(BitStream input_data) {
|
||||
std::vector<int16_t> transmit(const BitStream& input_data) {
|
||||
// Step 1: Append EOM Symbols
|
||||
BitStream eom_appended_data = appendEOMSymbols(input_data);
|
||||
|
||||
|
||||
@@ -43,37 +43,33 @@ class SymbolFormation {
|
||||
// Generate and scramble the sync preamble
|
||||
std::vector<uint8_t> sync_preamble = generateSyncPreamble();
|
||||
sync_preamble = scrambler.scrambleSyncPreamble(sync_preamble);
|
||||
|
||||
size_t set_count = 0;
|
||||
size_t symbol_count = 0;
|
||||
size_t current_frame = 0;
|
||||
|
||||
std::vector<uint8_t> data_stream;
|
||||
|
||||
size_t current_index = 0;
|
||||
while (current_index < symbol_data.size()) {
|
||||
// Determine the size of the current unknown data block
|
||||
size_t block_size = std::min(unknown_data_block_size, symbol_data.size() - current_index);
|
||||
std::vector<uint8_t> unknown_data_block(symbol_data.begin() + current_index, symbol_data.begin() + current_index + block_size);
|
||||
current_index += block_size;
|
||||
if (baud_rate == 75) {
|
||||
size_t set_count = 0;
|
||||
for (size_t i = 0; i < symbol_data.size(); i++) {
|
||||
bool is_exceptional_set = (set_count % ((interleave_setting == 1) ? 45 : 360)) == 0;
|
||||
append75bpsMapping(data_stream, symbol_data[i], is_exceptional_set);
|
||||
set_count++;
|
||||
}
|
||||
} else {
|
||||
size_t symbol_count = 0;
|
||||
size_t current_frame = 0;
|
||||
size_t current_index = 0;
|
||||
|
||||
// Map the unknown data based on baud rate
|
||||
if (baud_rate == 75) {
|
||||
size_t set_size = (interleave_setting == 2) ? 360 : 32;
|
||||
for (size_t i = 0; i < unknown_data_block.size(); i += set_size) {
|
||||
bool is_exceptional_set = (set_count % ((interleave_setting == 1) ? 45 : 360)) == 0;
|
||||
std::vector<uint8_t> mapped_set = map75bpsSet(unknown_data_block, i, set_size, is_exceptional_set);
|
||||
data_stream.insert(data_stream.end(), mapped_set.begin(), mapped_set.end());
|
||||
set_count++;
|
||||
}
|
||||
} else {
|
||||
// For baud rates greater than 75 bps
|
||||
while (current_index < symbol_data.size()) {
|
||||
// Determine the size of the current unknown data block
|
||||
size_t block_size = std::min(unknown_data_block_size, symbol_data.size() - current_index);
|
||||
std::vector<uint8_t> unknown_data_block(symbol_data.begin() + current_index, symbol_data.begin() + current_index + block_size);
|
||||
current_index += block_size;
|
||||
|
||||
// Map the unknown data based on baud rate
|
||||
std::vector<uint8_t> mapped_unknown_data = mapUnknownData(unknown_data_block);
|
||||
symbol_count += mapped_unknown_data.size();
|
||||
data_stream.insert(data_stream.end(), mapped_unknown_data.begin(), mapped_unknown_data.end());
|
||||
}
|
||||
|
||||
// Insert probe data if we are at an interleaver block boundary
|
||||
if (baud_rate > 75) {
|
||||
// Insert probe data if we are at an interleaver block boundary
|
||||
std::vector<uint8_t> probe_data = generateProbeData(current_frame, total_frames);
|
||||
data_stream.insert(data_stream.end(), probe_data.begin(), probe_data.end());
|
||||
current_frame = (current_frame + 1) % total_frames;
|
||||
@@ -134,17 +130,14 @@ class SymbolFormation {
|
||||
throw std::invalid_argument("Invalid channel symbol");
|
||||
}
|
||||
|
||||
if (repeat_twice) {
|
||||
// Repeat the pattern twice instead of four times for known symbols
|
||||
tribit_pattern.insert(tribit_pattern.end(), tribit_pattern.begin(), tribit_pattern.end());
|
||||
} else {
|
||||
// Repeat the pattern four times as per Table XIII
|
||||
tribit_pattern.insert(tribit_pattern.end(), tribit_pattern.begin(), tribit_pattern.end());
|
||||
tribit_pattern.insert(tribit_pattern.end(), tribit_pattern.begin(), tribit_pattern.end());
|
||||
tribit_pattern.insert(tribit_pattern.end(), tribit_pattern.begin(), tribit_pattern.end());
|
||||
size_t repetitions = repeat_twice ? 2 : 4;
|
||||
std::vector<uint8_t> repeated_pattern;
|
||||
|
||||
for (size_t i = 0; i < repetitions; i++) {
|
||||
repeated_pattern.insert(repeated_pattern.end(), tribit_pattern.begin(), tribit_pattern.end());
|
||||
}
|
||||
|
||||
return tribit_pattern;
|
||||
return repeated_pattern;
|
||||
}
|
||||
|
||||
std::vector<uint8_t> generateSyncPreamble() {
|
||||
@@ -340,19 +333,6 @@ class SymbolFormation {
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<uint8_t> map75bpsSet(const std::vector<uint8_t>& data, size_t start_index, size_t set_size, bool is_exceptional_set) {
|
||||
std::vector<uint8_t> mapped_set;
|
||||
|
||||
// Make sure we do not exceed the size of the data vector
|
||||
size_t end_index = std::min(start_index + set_size, data.size());
|
||||
|
||||
for (size_t i = start_index; i < end_index; ++i) {
|
||||
append75bpsMapping(mapped_set, data[i], is_exceptional_set);
|
||||
}
|
||||
|
||||
return mapped_set;
|
||||
}
|
||||
|
||||
std::vector<uint8_t> mapUnknownData(const std::vector<uint8_t>& data) {
|
||||
std::vector<uint8_t> mapped_data;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user