mirror of
https://github.com/hb9fxq/gr-digitalhf
synced 2024-12-22 15:10:00 +00:00
improved dopper estimation from adaptive filter taps (intermediate)
This commit is contained in:
parent
6c6c8520ea
commit
f0dc97ed64
|
@ -94,7 +94,7 @@ adaptive_dfe_impl::adaptive_dfe_impl(int sps, // samples per symbol
|
||||||
, _num_samples_since_filter_update(0)
|
, _num_samples_since_filter_update(0)
|
||||||
, _rotated_samples()
|
, _rotated_samples()
|
||||||
, _rotator()
|
, _rotator()
|
||||||
, _control_loop(2*M_PI/100, 5e-3, -5e-3)
|
, _control_loop(2*M_PI/100, 5e-5, -5e-5)
|
||||||
{
|
{
|
||||||
GR_LOG_DECLARE_LOGPTR(d_logger);
|
GR_LOG_DECLARE_LOGPTR(d_logger);
|
||||||
GR_LOG_ASSIGN_LOGPTR(d_logger, "adaptive_dfe");
|
GR_LOG_ASSIGN_LOGPTR(d_logger, "adaptive_dfe");
|
||||||
|
@ -287,23 +287,12 @@ gr_complex adaptive_dfe_impl::filter(gr_complex const* start, gr_complex const*
|
||||||
// std::cout << "FILTER: " << filter_output <<" " << known_symbol << " " << start[_nB+1] << std::endl;
|
// std::cout << "FILTER: " << filter_output <<" " << known_symbol << " " << start[_nB+1] << std::endl;
|
||||||
// (3) filter update
|
// (3) filter update
|
||||||
if (is_known || update_taps) {
|
if (is_known || update_taps) {
|
||||||
// (3a) control loop update for doppler correction using the adaptibve filter taps
|
// (3a) update of adaptive filter taps
|
||||||
gr_complex acc(0);
|
|
||||||
for (int j=_nB+1-2*_sps; j<_nB+1+2*_sps+1; ++j)
|
|
||||||
acc += std::conj(_last_taps_samples[j]) * _taps_samples[j];
|
|
||||||
float const frequency_err = gr::fast_atan2f(acc)/_num_samples_since_filter_update; // frequency error (rad/sample)
|
|
||||||
_control_loop.advance_loop(frequency_err);
|
|
||||||
_control_loop.phase_wrap();
|
|
||||||
_control_loop.frequency_limit();
|
|
||||||
_rotator.set_phase_incr(gr_expj(_control_loop.get_frequency()));
|
|
||||||
|
|
||||||
// (3b) update of adaptive filter taps
|
|
||||||
gr_complex const err = filter_output - known_symbol;
|
gr_complex const err = filter_output - known_symbol;
|
||||||
// taps_samples
|
// taps_samples
|
||||||
for (int j=0; j<_nB+_nF+1; ++j) {
|
for (int j=0; j<_nB+_nF+1; ++j) {
|
||||||
_last_taps_samples[j] = _taps_samples[j];
|
_last_taps_samples[j] = _taps_samples[j];
|
||||||
_taps_samples[j] -= _mu*err*std::conj(start[j]);
|
_taps_samples[j] -= _mu*err*std::conj(start[j]);
|
||||||
_num_samples_since_filter_update = 0;
|
|
||||||
}
|
}
|
||||||
// taps_symbols
|
// taps_symbols
|
||||||
if (_use_symbol_taps) {
|
if (_use_symbol_taps) {
|
||||||
|
@ -316,6 +305,20 @@ gr_complex adaptive_dfe_impl::filter(gr_complex const* start, gr_complex const*
|
||||||
_hist_symbol_index = 0;
|
_hist_symbol_index = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// (3b) control loop update for doppler correction using the adaptibve filter taps
|
||||||
|
if (_symbol_counter+1 == _symbols.size()) {
|
||||||
|
gr_complex acc(0);
|
||||||
|
for (int j=_nB+1-2*_sps; j<_nB+1+2*_sps+1; ++j)
|
||||||
|
acc += std::conj(_last_taps_samples[j]) * _taps_samples[j];
|
||||||
|
float const frequency_err = gr::fast_atan2f(acc)/(1+0*_num_samples_since_filter_update); // frequency error (rad/sample)
|
||||||
|
std::cout << "frequency_err " << frequency_err << " " << _num_samples_since_filter_update << std::endl;
|
||||||
|
_control_loop.advance_loop(frequency_err);
|
||||||
|
_control_loop.phase_wrap();
|
||||||
|
_control_loop.frequency_limit();
|
||||||
|
_rotator.set_phase_incr(gr_expj(_control_loop.get_frequency()));
|
||||||
|
_num_samples_since_filter_update = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// (4) save the descrambled symbol (-> frame_info)
|
// (4) save the descrambled symbol (-> frame_info)
|
||||||
_descrambled_symbols[_symbol_counter] = filter_output*std::conj(_scramble[_symbol_counter]);
|
_descrambled_symbols[_symbol_counter] = filter_output*std::conj(_scramble[_symbol_counter]);
|
||||||
return _descrambled_symbols[_symbol_counter++];
|
return _descrambled_symbols[_symbol_counter++];
|
||||||
|
|
|
@ -55,7 +55,7 @@ class physical_layer_driver(gr.hier_block2):
|
||||||
self._rrc_taps = filter.firdes.root_raised_cosine(1.0, samp_rate, samp_rate/sps, 0.35, 11*sps)
|
self._rrc_taps = filter.firdes.root_raised_cosine(1.0, samp_rate, samp_rate/sps, 0.35, 11*sps)
|
||||||
preamble_offset,preamble_samples = self._physical_layer_driver_description.get_preamble_z()
|
preamble_offset,preamble_samples = self._physical_layer_driver_description.get_preamble_z()
|
||||||
preamble_length = self._sps * len(self._physical_layer_driver_description.get_preamble()) ## len(preamble_samples)
|
preamble_length = self._sps * len(self._physical_layer_driver_description.get_preamble()) ## len(preamble_samples)
|
||||||
preamble_length = len(preamble_samples)
|
##preamble_length = len(preamble_samples)
|
||||||
self._rrc_filter = filter.fir_filter_ccc(1, (self._rrc_taps))
|
self._rrc_filter = filter.fir_filter_ccc(1, (self._rrc_taps))
|
||||||
self._corr_est = digital.corr_est_cc(symbols = (preamble_samples.tolist()),
|
self._corr_est = digital.corr_est_cc(symbols = (preamble_samples.tolist()),
|
||||||
sps = sps,
|
sps = sps,
|
||||||
|
|
Loading…
Reference in a new issue