mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-10-01 01:26:06 -04:00
Rework phase detector.
Simplify calculation of gate masks. Use entire symbol period to compute symbol value. Correct error sign based on symbol value.
This commit is contained in:
parent
36eefa46e7
commit
4734790518
@ -39,30 +39,32 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr PhaseDetectorEarlyLateGate(
|
constexpr PhaseDetectorEarlyLateGate(
|
||||||
const float samples_per_symbol
|
const size_t samples_per_symbol
|
||||||
) : late_mask { (1U << static_cast<size_t>(std::ceil(samples_per_symbol / 2))) - 1 },
|
) : sample_threshold { samples_per_symbol / 2 },
|
||||||
early_mask { late_mask << static_cast<size_t>(std::floor(samples_per_symbol / 2)) },
|
late_mask { (1UL << sample_threshold) - 1UL },
|
||||||
sample_bit { static_cast<size_t>(std::floor(samples_per_symbol / 2)) }
|
early_mask { late_mask << sample_threshold }
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
result_t operator()(const history_t symbol_history) const {
|
result_t operator()(const history_t symbol_history) const {
|
||||||
|
static_assert(sizeof(history_t) == sizeof(unsigned long), "popcountl size mismatch");
|
||||||
|
|
||||||
// history = ...0111, early
|
// history = ...0111, early
|
||||||
// history = ...1110, late
|
// history = ...1110, late
|
||||||
|
|
||||||
const symbol_t symbol = (symbol_history >> sample_bit) & 1;
|
const size_t late_side = __builtin_popcountl(symbol_history & late_mask);
|
||||||
const int late_side = __builtin_popcount(symbol_history & late_mask);
|
const size_t early_side = __builtin_popcountl(symbol_history & early_mask);
|
||||||
const int early_side = __builtin_popcount(symbol_history & early_mask);
|
const size_t total_count = late_side + early_side;
|
||||||
const int lateness = late_side - early_side;
|
const auto lateness = static_cast<int>(late_side) - static_cast<int>(early_side);
|
||||||
const int direction = lateness; //std::min(std::max(lateness, -1), 1);
|
const symbol_t symbol = (total_count >= sample_threshold);
|
||||||
const error_t error = direction;
|
const error_t error = symbol ? -lateness : lateness;
|
||||||
return { symbol, error };
|
return { symbol, error };
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const size_t sample_threshold;
|
||||||
const history_t late_mask;
|
const history_t late_mask;
|
||||||
const history_t early_mask;
|
const history_t early_mask;
|
||||||
const size_t sample_bit;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif/*__PHASE_DETECTOR_HPP__*/
|
#endif/*__PHASE_DETECTOR_HPP__*/
|
||||||
|
Loading…
Reference in New Issue
Block a user