Merge 'upstream/master' - At least it builds...

This commit is contained in:
furrtek
2017-01-16 03:45:44 +00:00
298 changed files with 8122 additions and 4685 deletions
+3 -1
View File
@@ -35,7 +35,7 @@ set(USE_OPT "-O3 -g -falign-functions=16 -fno-math-errno --specs=nano.specs")
set(USE_COPT "-std=gnu99")
# C++ specific options here (added to USE_OPT).
set(USE_CPPOPT "-std=c++11 -fno-rtti -fno-exceptions")
set(USE_CPPOPT "-std=c++14 -fno-rtti -fno-exceptions -Weffc++ -Wuninitialized")
# Enable this if you want the linker to remove unused code and data
set(USE_LINK_GC yes)
@@ -106,6 +106,7 @@ set(CPPSRC
baseband_dma.cpp
${COMMON}/baseband_sgpio.cpp
${COMMON}/portapack_shared_memory.cpp
${COMMON}/buffer.cpp
baseband_thread.cpp
baseband_processor.cpp
baseband_stats_collector.cpp
@@ -259,6 +260,7 @@ macro(DeclareTargets chunk_tag name)
include_directories(. ${INCDIR})
link_directories(${LLIBDIR})
target_link_libraries(${PROJECT_NAME}.elf ${LIBS})
target_link_libraries(${PROJECT_NAME}.elf -Wl,-Map=${PROJECT_NAME}.map)
add_custom_command(
OUTPUT ${PROJECT_NAME}.bin ${PROJECT_NAME}.img
+5 -5
View File
@@ -59,13 +59,13 @@ private:
BlockDecimator<float, 32> block_buffer { 1 };
IIRBiquadFilter hpf;
IIRBiquadFilter deemph;
FMSquelch squelch;
IIRBiquadFilter hpf { };
IIRBiquadFilter deemph { };
FMSquelch squelch { };
std::unique_ptr<StreamInput> stream;
std::unique_ptr<StreamInput> stream { };
AudioStatsCollector audio_stats;
AudioStatsCollector audio_stats { };
uint64_t audio_present_history = 0;
+1 -1
View File
@@ -50,7 +50,7 @@ private:
float max_squared { 0 };
size_t count { 0 };
AudioStatistics statistics;
AudioStatistics statistics { };
void consume_audio_buffer(const buffer_f32_t& src);
Binary file not shown.
Binary file not shown.
+14
View File
@@ -149,6 +149,20 @@ void disable() {
gpdma_channel_sgpio.disable();
}
/*baseband::buffer_t wait_for_buffer() {
const auto next_index = thread_wait.sleep();
if( next_index >= 0 ) {
const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask;
const auto src = lli_loop[free_index].srcaddr;
const auto dst = lli_loop[free_index].destaddr;
const auto p = (src == reinterpret_cast<uint32_t>(&LPC_SGPIO->REG_SS[0])) ? dst : src;
return { reinterpret_cast<sample_t*>(p), transfer_samples };
} else {
return { };
}
}*/
baseband::buffer_t wait_for_rx_buffer() {
const auto next_index = thread_wait.sleep();
-2
View File
@@ -31,8 +31,6 @@
namespace baseband {
namespace dma {
using Handler = void (*)();
void init();
void configure(
baseband::sample_t* const buffer_base,
+1 -1
View File
@@ -40,7 +40,7 @@ protected:
void feed_channel_stats(const buffer_c16_t& channel);
private:
ChannelStatsCollector channel_stats;
ChannelStatsCollector channel_stats { };
};
#endif/*__BASEBAND_PROCESSOR_H__*/
+8 -6
View File
@@ -33,6 +33,8 @@ using namespace lpc43xx;
#include "portapack_shared_memory.hpp"
#include "utility.hpp"
#include <array>
static baseband::SGPIO baseband_sgpio;
@@ -45,11 +47,11 @@ BasebandThread::BasebandThread(
uint32_t sampling_rate,
BasebandProcessor* const baseband_processor,
const tprio_t priority,
const baseband::Direction dir
const baseband::Direction direction
) : baseband_processor { baseband_processor },
_direction { direction },
sampling_rate { sampling_rate }
{
direction = dir;
thread = chThdCreateStatic(baseband_thread_wa, sizeof(baseband_thread_wa),
priority, ThreadBase::fn,
this
@@ -69,15 +71,15 @@ void BasebandThread::run() {
const auto baseband_buffer = std::make_unique<std::array<baseband::sample_t, 8192>>();
baseband::dma::configure(
baseband_buffer->data(),
direction
direction()
);
//baseband::dma::allocate(4, 2048);
baseband_sgpio.configure(direction);
baseband::dma::enable(direction);
baseband_sgpio.configure(direction());
baseband::dma::enable(direction());
baseband_sgpio.streaming_enable();
if (direction == baseband::Direction::Transmit) {
if (_direction == baseband::Direction::Transmit) {
while( !chThdShouldTerminate() ) {
// TODO: Place correct sampling rate into buffer returned here:
const baseband::buffer_t buffer_tmp = baseband::dma::wait_for_tx_buffer();
+13 -2
View File
@@ -34,13 +34,24 @@ public:
uint32_t sampling_rate,
BasebandProcessor* const baseband_processor,
const tprio_t priority,
const baseband::Direction dir
const baseband::Direction direction = baseband::Direction::Receive
);
~BasebandThread();
BasebandThread(const BasebandThread&) = delete;
BasebandThread(BasebandThread&&) = delete;
BasebandThread& operator=(const BasebandThread&) = delete;
BasebandThread& operator=(BasebandThread&&) = delete;
// This getter should die, it's just here to leak information to code that
// isn't in the right place to begin with.
baseband::Direction direction() const {
return _direction;
}
private:
static Thread* thread;
baseband::Direction direction;
baseband::Direction _direction;
BasebandProcessor* baseband_processor { nullptr };
uint32_t sampling_rate;
Binary file not shown.
+1 -1
View File
@@ -85,7 +85,7 @@ public:
}
private:
std::array<T, N> buffer;
std::array<T, N> buffer { };
uint32_t input_sampling_rate_ { 0 };
size_t factor_ { 1 };
size_t src_i { 0 };
+9 -15
View File
@@ -38,12 +38,6 @@ public:
By16,
By32,
};
constexpr ChannelDecimator(
) : decimation_factor { DecimationFactor::By32 },
fs_over_4_downconvert { true }
{
}
constexpr ChannelDecimator(
const DecimationFactor decimation_factor,
@@ -64,17 +58,17 @@ public:
}
private:
std::array<complex16_t, 1024> work_baseband;
std::array<complex16_t, 1024> work_baseband { };
dsp::decimate::TranslateByFSOver4AndDecimateBy2CIC3 translate;
dsp::decimate::Complex8DecimateBy2CIC3 cic_0;
dsp::decimate::DecimateBy2CIC3 cic_1;
dsp::decimate::DecimateBy2CIC3 cic_2;
dsp::decimate::DecimateBy2CIC3 cic_3;
dsp::decimate::DecimateBy2CIC3 cic_4;
dsp::decimate::TranslateByFSOver4AndDecimateBy2CIC3 translate { };
dsp::decimate::Complex8DecimateBy2CIC3 cic_0 { };
dsp::decimate::DecimateBy2CIC3 cic_1 { };
dsp::decimate::DecimateBy2CIC3 cic_2 { };
dsp::decimate::DecimateBy2CIC3 cic_3 { };
dsp::decimate::DecimateBy2CIC3 cic_4 { };
DecimationFactor decimation_factor;
const bool fs_over_4_downconvert;
DecimationFactor decimation_factor { DecimationFactor::By32 };
const bool fs_over_4_downconvert { true };
buffer_c16_t execute_decimation(const buffer_c8_t& buffer);
+20 -8
View File
@@ -23,6 +23,7 @@
#define __CHANNEL_STATS_COLLECTOR_H__
#include "dsp_types.hpp"
#include "simd.hpp"
#include "message.hpp"
#include "utility.hpp"
@@ -35,14 +36,7 @@ class ChannelStatsCollector {
public:
template<typename Callback>
void feed(const buffer_c16_t& src, Callback callback) {
auto src_p = src.p;
while(src_p < &src.p[src.count]) {
const uint32_t sample = *__SIMD32(src_p)++;
const uint32_t mag_sq = __SMUAD(sample, sample);
if( mag_sq > max_squared ) {
max_squared = mag_sq;
}
}
max_squared = compute_max_squared(src, max_squared);
count += src.count;
const size_t samples_per_update = src.sampling_rate * update_interval;
@@ -61,6 +55,24 @@ private:
static constexpr float update_interval { 0.1f };
uint32_t max_squared { 0 };
size_t count { 0 };
static uint32_t compute_max_squared(
const buffer_c16_t& src,
uint32_t max_squared
) {
auto p = simd32_ptr(src.p);
const auto end_p = simd32_ptr(&src.p[src.count]);
while(p < end_p) {
const uint32_t sample = *(p++);
const uint32_t mag_sq = __SMUAD(sample, sample);
if( mag_sq > max_squared ) {
max_squared = mag_sq;
}
}
return max_squared;
}
};
#endif/*__CHANNEL_STATS_COLLECTOR_H__*/
+4 -4
View File
@@ -60,7 +60,7 @@ public:
}
private:
std::array<float, 3> t { { 0.0f, 0.0f, 0.0f } };
std::array<float, 3> t { };
size_t symbol_phase { 0 };
};
@@ -154,9 +154,9 @@ public:
}
private:
dsp::interpolation::LinearResampler resampler;
GardnerTimingErrorDetector timing_error_detector;
ErrorFilter error_filter;
dsp::interpolation::LinearResampler resampler { };
GardnerTimingErrorDetector timing_error_detector { };
ErrorFilter error_filter { };
const SymbolHandler symbol_handler;
void resampler_callback(const float interpolated_sample) {
+40 -38
View File
@@ -21,6 +21,8 @@
#include "dsp_decimate.hpp"
#include "simd.hpp"
#include <hal.h>
namespace dsp {
@@ -566,39 +568,39 @@ buffer_c16_t DecimateBy2CIC3::execute(
uint32_t t1 = _iq0;
uint32_t t2 = _iq1;
const uint32_t taps = 0x00000003;
auto s = src.p;
auto d = dst.p;
const auto d_end = &dst.p[src.count / 2];
auto s = simd32_ptr(&src.p[0]);
auto d = simd32_ptr(&dst.p[0]);
const auto d_end = simd32_ptr(&dst.p[src.count / 2]);
while(d < d_end) {
uint32_t i = __SXTH(t1, 0); /* 1: I0 */
uint32_t q = __SXTH(t1, 16); /* 1: Q0 */
i = __SMLABB(t2, taps, i); /* 1: I1*3 + I0 */
q = __SMLATB(t2, taps, q); /* 1: Q1*3 + Q0 */
const uint32_t t3 = *__SIMD32(s)++; /* 3: Q2:I2 */
const uint32_t t4 = *__SIMD32(s)++; /* Q3:I3 */
const uint32_t t3 = *(s++); /* 3: Q2:I2 */
const uint32_t t4 = *(s++); /* Q3:I3 */
i = __SMLABB(t3, taps, i); /* 1: I2*3 + I1*3 + I0 */
q = __SMLATB(t3, taps, q); /* 1: Q2*3 + Q1*3 + Q0 */
int32_t si0 = __SXTAH(i, t4, 0); /* 1: I3 + Q2*3 + Q1*3 + Q0 */
int32_t sq0 = __SXTAH(q, t4, 16); /* 1: Q3 + Q2*3 + Q1*3 + Q0 */
i = __BFI(si0 / 8, sq0 / 8, 16, 16); /* 1: D2_Q0:D2_I0 */
*__SIMD32(d)++ = i; /* D2_Q0:D2_I0 */
*(d++) = i; /* D2_Q0:D2_I0 */
i = __SXTH(t3, 0); /* 1: I2 */
q = __SXTH(t3, 16); /* 1: Q2 */
i = __SMLABB(t4, taps, i); /* 1: I3*3 + I2 */
q = __SMLATB(t4, taps, q); /* 1: Q3*3 + Q2 */
t1 = *__SIMD32(s)++; /* 3: Q4:I4 */
t2 = *__SIMD32(s)++; /* Q5:I5 */
t1 = *(s++); /* 3: Q4:I4 */
t2 = *(s++); /* Q5:I5 */
i = __SMLABB(t1, taps, i); /* 1: I4*3 + I3*3 + I2 */
q = __SMLATB(t1, taps, q); /* 1: Q4*3 + Q3*3 + Q2 */
int32_t si1 = __SXTAH(i, t2, 0) ; /* 1: I5 + Q4*3 + Q3*3 + Q2 */
int32_t sq1 = __SXTAH(q, t2, 16); /* 1: Q5 + Q4*3 + Q3*3 + Q2 */
i = __BFI(si1 / 8, sq1 / 8, 16, 16); /* 1: D2_Q1:D2_I1 */
*__SIMD32(d)++ = i; /* D2_Q1:D2_I1 */
*(d++) = i; /* D2_Q1:D2_I1 */
}
_iq0 = t1;
_iq1 = t2;
@@ -665,57 +667,57 @@ buffer_c16_t FIRAndDecimateComplex::execute(
const auto output_sampling_rate = src.sampling_rate / decimation_factor_;
const size_t output_samples = src.count / decimation_factor_;
sample_t* dst_p = dst.p;
auto dst_p = simd32_ptr(dst.p);
const buffer_c16_t result { dst.p, output_samples, output_sampling_rate };
const sample_t* src_p = src.p;
auto src_p = simd32_ptr(src.p);
size_t outer_count = output_samples;
while(outer_count > 0) {
/* Put new samples into delay buffer */
auto z_new_p = &samples_[taps_count_ - decimation_factor_];
auto z_new_p = simd32_ptr(&samples_[taps_count_ - decimation_factor_]);
for(size_t i=0; i<decimation_factor_; i++) {
*__SIMD32(z_new_p)++ = *__SIMD32(src_p)++;
*(z_new_p++) = *(src_p++);
}
size_t loop_count = taps_count_ / 8;
auto t_p = &taps_reversed_[0];
auto z_p = &samples_[0];
auto t_p = simd32_ptr(&taps_reversed_[0]);
auto z_p = simd32_ptr(&samples_[0]);
int64_t t_real = 0;
int64_t t_imag = 0;
while(loop_count > 0) {
const auto tap0 = *__SIMD32(t_p)++;
const auto sample0 = *__SIMD32(z_p)++;
const auto tap1 = *__SIMD32(t_p)++;
const auto sample1 = *__SIMD32(z_p)++;
const auto tap0 = *(t_p++);
const auto sample0 = *(z_p++);
const auto tap1 = *(t_p++);
const auto sample1 = *(z_p++);
t_real = __SMLSLD(sample0, tap0, t_real);
t_imag = __SMLALDX(sample0, tap0, t_imag);
t_real = __SMLSLD(sample1, tap1, t_real);
t_imag = __SMLALDX(sample1, tap1, t_imag);
const auto tap2 = *__SIMD32(t_p)++;
const auto sample2 = *__SIMD32(z_p)++;
const auto tap3 = *__SIMD32(t_p)++;
const auto sample3 = *__SIMD32(z_p)++;
const auto tap2 = *(t_p++);
const auto sample2 = *(z_p++);
const auto tap3 = *(t_p++);
const auto sample3 = *(z_p++);
t_real = __SMLSLD(sample2, tap2, t_real);
t_imag = __SMLALDX(sample2, tap2, t_imag);
t_real = __SMLSLD(sample3, tap3, t_real);
t_imag = __SMLALDX(sample3, tap3, t_imag);
const auto tap4 = *__SIMD32(t_p)++;
const auto sample4 = *__SIMD32(z_p)++;
const auto tap5 = *__SIMD32(t_p)++;
const auto sample5 = *__SIMD32(z_p)++;
const auto tap4 = *(t_p++);
const auto sample4 = *(z_p++);
const auto tap5 = *(t_p++);
const auto sample5 = *(z_p++);
t_real = __SMLSLD(sample4, tap4, t_real);
t_imag = __SMLALDX(sample4, tap4, t_imag);
t_real = __SMLSLD(sample5, tap5, t_real);
t_imag = __SMLALDX(sample5, tap5, t_imag);
const auto tap6 = *__SIMD32(t_p)++;
const auto sample6 = *__SIMD32(z_p)++;
const auto tap7 = *__SIMD32(t_p)++;
const auto sample7 = *__SIMD32(z_p)++;
const auto tap6 = *(t_p++);
const auto sample6 = *(z_p++);
const auto tap7 = *(t_p++);
const auto sample7 = *(z_p++);
t_real = __SMLSLD(sample6, tap6, t_real);
t_imag = __SMLALDX(sample6, tap6, t_imag);
t_real = __SMLSLD(sample7, tap7, t_real);
@@ -731,7 +733,7 @@ buffer_c16_t FIRAndDecimateComplex::execute(
const int32_t i = t_imag >> 16;
const int32_t r_sat = __SSAT(r, 16);
const int32_t i_sat = __SSAT(i, 16);
*__SIMD32(dst_p)++ = __PKHBT(
*(dst_p++) = __PKHBT(
r_sat,
i_sat,
16
@@ -741,14 +743,14 @@ buffer_c16_t FIRAndDecimateComplex::execute(
const size_t unroll_factor = 4;
size_t shift_count = (taps_count_ - decimation_factor_) / unroll_factor;
sample_t* t = &samples_[0];
const sample_t* s = &samples_[decimation_factor_];
auto t = simd32_ptr(&samples_[0]);
auto s = simd32_ptr(&samples_[decimation_factor_]);
while(shift_count > 0) {
*__SIMD32(t)++ = *__SIMD32(s)++;
*__SIMD32(t)++ = *__SIMD32(s)++;
*__SIMD32(t)++ = *__SIMD32(s)++;
*__SIMD32(t)++ = *__SIMD32(s)++;
*(t++) = *(s++);
*(t++) = *(s++);
*(t++) = *(s++);
*(t++) = *(s++);
shift_count--;
}
+16 -20
View File
@@ -86,8 +86,8 @@ public:
);
private:
std::array<int16_t, taps_count + 2> z;
std::array<int16_t, taps_count> taps;
std::array<int16_t, taps_count + 2> z { };
std::array<int16_t, taps_count> taps { };
};
class FIRC8xR16x24FS4Decim4 {
@@ -115,8 +115,8 @@ public:
);
private:
std::array<vec2_s16, taps_count - decimation_factor> z_;
std::array<tap_t, taps_count> taps_;
std::array<vec2_s16, taps_count - decimation_factor> z_ { };
std::array<tap_t, taps_count> taps_ { };
int32_t output_scale = 0;
};
@@ -145,8 +145,8 @@ public:
);
private:
std::array<vec2_s16, taps_count - decimation_factor> z_;
std::array<tap_t, taps_count> taps_;
std::array<vec2_s16, taps_count - decimation_factor> z_ { };
std::array<tap_t, taps_count> taps_ { };
int32_t output_scale = 0;
};
@@ -169,8 +169,8 @@ public:
);
private:
std::array<vec2_s16, taps_count - decimation_factor> z_;
std::array<tap_t, taps_count> taps_;
std::array<vec2_s16, taps_count - decimation_factor> z_ { };
std::array<tap_t, taps_count> taps_ { };
int32_t output_scale = 0;
};
@@ -193,8 +193,8 @@ public:
);
private:
std::array<vec2_s16, taps_count - decimation_factor> z_;
std::array<tap_t, taps_count> taps_;
std::array<vec2_s16, taps_count - decimation_factor> z_ { };
std::array<tap_t, taps_count> taps_ { };
int32_t output_scale = 0;
};
@@ -208,11 +208,6 @@ public:
/* NOTE! Current code makes an assumption that block of samples to be
* processed will be a multiple of the taps_count.
*/
FIRAndDecimateComplex(
) : taps_count_ { 0 },
decimation_factor_ { 1 }
{
}
template<typename T>
void configure(
@@ -230,10 +225,10 @@ public:
private:
using samples_t = sample_t[];
std::unique_ptr<samples_t> samples_;
std::unique_ptr<taps_t> taps_reversed_;
size_t taps_count_;
size_t decimation_factor_;
std::unique_ptr<samples_t> samples_ { };
std::unique_ptr<taps_t> taps_reversed_ { };
size_t taps_count_ { 0 };
size_t decimation_factor_ { 1 };
template<typename T>
void configure(
@@ -259,7 +254,8 @@ public:
);
private:
int16_t z[5];
int16_t z[5] { };
int16_t _dummy { }; // TODO: Addresses GCC bug when constructing a class that's not sizeof() % 4 == 0?
};
} /* namespace decimate */
+14 -13
View File
@@ -24,6 +24,7 @@
#include "complex.hpp"
#include "fxpt_atan2.hpp"
#include "utility_m4.hpp"
#include "simd.hpp"
#include <hal.h>
@@ -34,12 +35,12 @@ buffer_f32_t AM::execute(
const buffer_c16_t& src,
const buffer_f32_t& dst
) {
const auto src_p = src.p;
const auto src_end = &src.p[src.count];
auto src_p = simd32_ptr(src.p);
auto src_end = simd32_ptr(&src.p[src.count]);
auto dst_p = dst.p;
while(src_p < src_end) {
const uint32_t sample0 = *__SIMD32(src_p)++;
const uint32_t sample1 = *__SIMD32(src_p)++;
const uint32_t sample0 = *(src_p++);
const uint32_t sample1 = *(src_p++);
const uint32_t mag_sq0 = __SMUAD(sample0, sample0);
const uint32_t mag_sq1 = __SMUAD(sample1, sample1);
*(dst_p++) = __builtin_sqrtf(mag_sq0) * k;
@@ -90,12 +91,12 @@ buffer_f32_t FM::execute(
) {
auto z = z_;
const auto src_p = src.p;
const auto src_end = &src.p[src.count];
auto src_p = simd32_ptr(src.p);
auto src_end = simd32_ptr(&src.p[src.count]);
auto dst_p = dst.p;
while(src_p < src_end) {
const auto s0 = *__SIMD32(src_p)++;
const auto s1 = *__SIMD32(src_p)++;
const auto s0 = *(src_p++);
const auto s1 = *(src_p++);
const auto t0 = multiply_conjugate_s16_s32(s0, z);
const auto t1 = multiply_conjugate_s16_s32(s1, s0);
z = s1;
@@ -113,12 +114,12 @@ buffer_s16_t FM::execute(
) {
auto z = z_;
const auto src_p = src.p;
const auto src_end = &src.p[src.count];
auto src_p = simd32_ptr(src.p);
auto src_end = simd32_ptr(&src.p[src.count]);
auto dst_p = dst.p;
while(src_p < src_end) {
const auto s0 = *__SIMD32(src_p)++;
const auto s1 = *__SIMD32(src_p)++;
const auto s0 = *(src_p++);
const auto s1 = *(src_p++);
const auto t0 = multiply_conjugate_s16_s32(s0, z);
const auto t1 = multiply_conjugate_s16_s32(s1, s0);
z = s1;
@@ -126,7 +127,7 @@ buffer_s16_t FM::execute(
const int32_t theta0_sat = __SSAT(theta0_int, 16);
const int32_t theta1_int = angle_approx_0deg27(t1) * ks16;
const int32_t theta1_sat = __SSAT(theta1_int, 16);
*__SIMD32(dst_p)++ = __PKHBT(
*(dst_p++) = __PKHBT(
theta0_sat,
theta1_sat,
16
Binary file not shown.
+2 -2
View File
@@ -66,8 +66,8 @@ public:
private:
using samples_t = sample_t[];
std::unique_ptr<samples_t> samples_;
std::unique_ptr<taps_t> taps_reversed_;
std::unique_ptr<samples_t> samples_ { };
std::unique_ptr<taps_t> taps_reversed_ { };
size_t taps_count_ { 0 };
size_t decimation_factor_ { 1 };
size_t decimation_phase { 0 };
+6 -1
View File
@@ -43,5 +43,10 @@
#define LPC43XX_M0APPTXEVENT_IRQ_PRIORITY 4
/* M4 is initialized by M0, which has already started PLL1 */
#if !defined(LPC43XX_M4_CLK) || defined(__DOXYGEN__)
#define LPC43XX_M4_CLK 200000000
#define LPC43XX_M4_CLK_SRC 0x09
#endif
#if !defined(LPC43XX_M4_CLK_SRC) || defined(__DOXYGEN__)
#define LPC43XX_M4_CLK_SRC 0x09
#endif
+2 -2
View File
@@ -70,8 +70,8 @@ public:
constexpr OOKClockRecovery(
const float samples_per_symbol
) : symbol_phase_inc_nominal { static_cast<uint32_t>(std::round((1ULL << 32) / samples_per_symbol)) },
symbol_phase_inc_k { symbol_phase_inc_nominal * (2.0f / 8.0f) / samples_per_symbol },
phase_detector { samples_per_symbol },
symbol_phase_inc_k { static_cast<uint32_t>(std::round(symbol_phase_inc_nominal * (2.0f / 8.0f) / samples_per_symbol)) },
phase_detector { static_cast<size_t>(std::round(samples_per_symbol)) },
phase_accumulator { symbol_phase_inc_nominal }
{
}
+5 -5
View File
@@ -122,13 +122,13 @@ private:
const PayloadHandlerFunc payload_handler;
BitHistory bit_history;
PreambleMatcher preamble;
UnstuffMatcher unstuff;
EndMatcher end;
BitHistory bit_history { };
PreambleMatcher preamble { };
UnstuffMatcher unstuff { };
EndMatcher end { };
State state { State::Preamble };
baseband::Packet packet;
baseband::Packet packet { };
void reset_state() {
packet.clear();
+5 -5
View File
@@ -54,21 +54,21 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
std::array<complex16_t, 512> dst;
std::array<complex16_t, 512> dst { };
const buffer_c16_t dst_buffer {
dst.data(),
dst.size()
};
dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0;
dsp::decimate::FIRC16xR16x32Decim8 decim_1;
dsp::matched_filter::MatchedFilter mf { baseband::ais::rrc_taps_38k4_4t_p, 2 };
dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0 { };
dsp::decimate::FIRC16xR16x32Decim8 decim_1 { };
dsp::matched_filter::MatchedFilter mf { baseband::ais::square_taps_38k4_1t_p, 2 };
clock_recovery::ClockRecovery<clock_recovery::FixedErrorFilter> clock_recovery {
19200, 9600, { 0.0555f },
[this](const float symbol) { this->consume_symbol(symbol); }
};
symbol_coding::NRZIDecoder nrzi_decode;
symbol_coding::NRZIDecoder nrzi_decode { };
PacketBuilder<BitPattern, BitPattern, BitPattern> packet_builder {
{ 0b0101010101111110, 16, 1 },
{ 0b111110, 6 },
+11 -11
View File
@@ -49,31 +49,31 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
std::array<complex16_t, 512> dst;
std::array<complex16_t, 512> dst { };
const buffer_c16_t dst_buffer {
dst.data(),
dst.size()
};
std::array<float, 32> audio;
std::array<float, 32> audio { };
const buffer_f32_t audio_buffer {
audio.data(),
audio.size()
};
dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0;
dsp::decimate::FIRC16xR16x32Decim8 decim_1;
dsp::decimate::FIRAndDecimateComplex decim_2;
dsp::decimate::FIRAndDecimateComplex channel_filter;
dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0 { };
dsp::decimate::FIRC16xR16x32Decim8 decim_1 { };
dsp::decimate::FIRAndDecimateComplex decim_2 { };
dsp::decimate::FIRAndDecimateComplex channel_filter { };
uint32_t channel_filter_pass_f = 0;
uint32_t channel_filter_stop_f = 0;
bool modulation_ssb = false;
dsp::demodulate::AM demod_am;
dsp::demodulate::SSB demod_ssb;
FeedForwardCompressor audio_compressor;
AudioOutput audio_output;
dsp::demodulate::AM demod_am { };
dsp::demodulate::SSB demod_ssb { };
FeedForwardCompressor audio_compressor { };
AudioOutput audio_output { };
SpectrumCollector channel_spectrum;
SpectrumCollector channel_spectrum { };
bool configured { false };
void configure(const AMConfigureMessage& message);
+5 -5
View File
@@ -51,20 +51,20 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
std::array<complex16_t, 512> dst;
std::array<complex16_t, 512> dst { };
const buffer_c16_t dst_buffer {
dst.data(),
dst.size()
};
dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0;
dsp::decimate::FIRC16xR16x16Decim2 decim_1;
dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0 { };
dsp::decimate::FIRC16xR16x16Decim2 decim_1 { };
uint32_t channel_filter_pass_f = 0;
uint32_t channel_filter_stop_f = 0;
std::unique_ptr<StreamInput> stream;
std::unique_ptr<StreamInput> stream { };
SpectrumCollector channel_spectrum;
SpectrumCollector channel_spectrum { };
size_t spectrum_interval_samples = 0;
size_t spectrum_samples = 0;
+7 -7
View File
@@ -46,12 +46,12 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
std::array<complex16_t, 512> dst;
std::array<complex16_t, 512> dst { };
const buffer_c16_t dst_buffer {
dst.data(),
dst.size()
};
std::array<float, 32> audio;
std::array<float, 32> audio { };
const buffer_f32_t audio_buffer {
audio.data(),
audio.size()
@@ -63,15 +63,15 @@ private:
sizeof(pwm) / sizeof(int16_t)
};
dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0;
dsp::decimate::FIRC16xR16x32Decim8 decim_1;
dsp::decimate::FIRAndDecimateComplex channel_filter;
dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0 { };
dsp::decimate::FIRC16xR16x32Decim8 decim_1 { };
dsp::decimate::FIRAndDecimateComplex channel_filter { };
uint32_t channel_filter_pass_f = 0;
uint32_t channel_filter_stop_f = 0;
dsp::demodulate::FM demod;
dsp::demodulate::FM demod { };
AudioOutput audio_output;
AudioOutput audio_output { };
SpectrumCollector channel_spectrum;
+9 -9
View File
@@ -34,17 +34,17 @@ ReplayProcessor::ReplayProcessor() {
void ReplayProcessor::execute(const buffer_c8_t& buffer) {
/* 2.4576MHz, 2048 samples */
const auto decim_0_out = decim_0.execute(buffer, dst_buffer);
const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer);
const auto& decimator_out = decim_1_out;
const auto& channel = decimator_out;
//const auto decim_0_out = decim_0.execute(buffer, dst_buffer);
//const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer);
//const auto& decimator_out = decim_1_out;
//const auto& channel = decimator_out;
if( stream ) {
const size_t bytes_to_write = sizeof(*decimator_out.p) * decimator_out.count;
const auto result = stream->write(decimator_out.p, bytes_to_write);
}
//if( stream ) {
// const size_t bytes_to_write = sizeof(*decimator_out.p) * decimator_out.count;
// const auto result = stream->write(decimator_out.p, bytes_to_write);
//}
feed_channel_stats(channel);
//feed_channel_stats(channel);
/*spectrum_samples += channel.count;
if( spectrum_samples >= spectrum_interval_samples ) {
+3 -3
View File
@@ -69,14 +69,14 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
std::array<complex16_t, 512> dst;
std::array<complex16_t, 512> dst { };
const buffer_c16_t dst_buffer {
dst.data(),
dst.size()
};
dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0;
dsp::decimate::FIRC16xR16x16Decim2 decim_1;
dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0 { };
dsp::decimate::FIRC16xR16x16Decim2 decim_1 { };
dsp::matched_filter::MatchedFilter mf_38k4_1t_19k2 { rect_taps_307k2_38k4_1t_19k2_p, 8 };
+9 -9
View File
@@ -45,7 +45,7 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
std::array<complex16_t, 512> dst;
std::array<complex16_t, 512> dst { };
const buffer_c16_t dst_buffer {
dst.data(),
dst.size()
@@ -61,19 +61,19 @@ private:
sizeof(pwm) / sizeof(int16_t)
};
dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0;
dsp::decimate::FIRC16xR16x16Decim2 decim_1;
dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0 { };
dsp::decimate::FIRC16xR16x16Decim2 decim_1 { };
uint32_t channel_filter_pass_f = 0;
uint32_t channel_filter_stop_f = 0;
dsp::demodulate::FM demod;
dsp::decimate::DecimateBy2CIC4Real audio_dec_1;
dsp::decimate::DecimateBy2CIC4Real audio_dec_2;
dsp::decimate::FIR64AndDecimateBy2Real audio_filter;
dsp::demodulate::FM demod { };
dsp::decimate::DecimateBy2CIC4Real audio_dec_1 { };
dsp::decimate::DecimateBy2CIC4Real audio_dec_2 { };
dsp::decimate::FIR64AndDecimateBy2Real audio_filter { };
AudioOutput audio_output;
AudioOutput audio_output { };
SpectrumCollector channel_spectrum;
SpectrumCollector channel_spectrum { };
size_t spectrum_interval_samples = 0;
size_t spectrum_samples = 0;
+2 -2
View File
@@ -46,9 +46,9 @@ private:
BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive };
RSSIThread rssi_thread { NORMALPRIO + 10 };
SpectrumCollector channel_spectrum;
SpectrumCollector channel_spectrum { };
std::array<complex16_t, 256> spectrum;
std::array<complex16_t, 256> spectrum { };
size_t phase = 0;
};
+6 -6
View File
@@ -52,22 +52,22 @@ constexpr adc::Config adc1_config {
};
void init() {
adc1.clock_enable();
adc1.interrupts_disable();
adc1.power_up(adc1_config);
adc1.interrupts_enable(adc1_interrupt_mask);
adc1::clock_enable();
adc1::interrupts_disable();
adc1::power_up(adc1_config);
adc1::interrupts_enable(adc1_interrupt_mask);
dma::init();
}
void start() {
dma::enable();
adc1.start_burst();
adc1::start_burst();
}
void stop() {
dma::disable();
adc1.stop_burst();
adc1::stop_burst();
}
} /* namespace rssi */
+1 -1
View File
@@ -69,7 +69,7 @@ public:
private:
static constexpr float update_interval { 0.1f };
RSSIStatistics statistics;
RSSIStatistics statistics { };
};
#endif/*__RSSI_STATS_COLLECTOR_H__*/
+26 -3
View File
@@ -103,6 +103,31 @@ void SpectrumCollector::post_message(const buffer_c16_t& data) {
}
}
template<typename T>
static typename T::value_type spectrum_window_none(const T& s, const size_t i) {
static_assert(power_of_two(s.size()), "Array size must be power of 2");
return s[i];
};
template<typename T>
static typename T::value_type spectrum_window_hamming_3(const T& s, const size_t i) {
static_assert(power_of_two(s.size()), "Array size must be power of 2");
constexpr size_t mask = s.size() - 1;
// Three point Hamming window.
return s[i] * 0.54f + (s[(i-1) & mask] + s[(i+1) & mask]) * -0.23f;
};
template<typename T>
static typename T::value_type spectrum_window_blackman_3(const T& s, const size_t i) {
static_assert(power_of_two(s.size()), "Array size must be power of 2");
constexpr size_t mask = s.size() - 1;
// Three term Blackman window.
constexpr float alpha = 0.42f;
constexpr float beta = 0.5f * 0.5f;
constexpr float gamma = 0.08f * 0.05f;
return s[i] * alpha - (s[(i-1) & mask] + s[(i+1) & mask]) * beta + (s[(i-2) & mask] + s[(i+2) & mask]) * gamma;
};
void SpectrumCollector::update() {
// Called from idle thread (after EVT_MASK_SPECTRUM is flagged)
if( streaming && channel_spectrum_request_update ) {
@@ -114,9 +139,7 @@ void SpectrumCollector::update() {
spectrum.channel_filter_pass_frequency = channel_filter_pass_frequency;
spectrum.channel_filter_stop_frequency = channel_filter_stop_frequency;
for(size_t i=0; i<spectrum.db.size(); i++) {
// Three point Hamming window.
const auto corrected_sample = channel_spectrum[i] * 0.54f
+ (channel_spectrum[(i-1) & 0xff] + channel_spectrum[(i+1) & 0xff]) * -0.23f;
const auto corrected_sample = spectrum_window_hamming_3(channel_spectrum, i);
const auto mag2 = magnitude_squared(corrected_sample * (1.0f / 32768.0f));
const float db = mag2_to_dbv_norm(mag2);
constexpr float mag_scale = 5.0f;
+4 -10
View File
@@ -34,12 +34,6 @@
class SpectrumCollector {
public:
constexpr SpectrumCollector(
) : channel_spectrum_decimator { 1 },
fifo { fifo_data, ChannelSpectrumConfigMessage::fifo_k }
{
}
void on_message(const Message* const message);
void set_decimation_factor(const size_t decimation_factor);
@@ -51,13 +45,13 @@ public:
);
private:
BlockDecimator<complex16_t, 256> channel_spectrum_decimator;
ChannelSpectrumFIFO fifo;
ChannelSpectrum fifo_data[1 << ChannelSpectrumConfigMessage::fifo_k];
BlockDecimator<complex16_t, 256> channel_spectrum_decimator { 1 };
ChannelSpectrum fifo_data[1 << ChannelSpectrumConfigMessage::fifo_k] { };
ChannelSpectrumFIFO fifo { fifo_data, ChannelSpectrumConfigMessage::fifo_k };
volatile bool channel_spectrum_request_update { false };
bool streaming { false };
std::array<std::complex<float>, 256> channel_spectrum;
std::array<std::complex<float>, 256> channel_spectrum { };
uint32_t channel_spectrum_sampling_rate { 0 };
uint32_t channel_filter_pass_frequency { 0 };
uint32_t channel_filter_stop_frequency { 0 };
+9 -4
View File
@@ -34,6 +34,11 @@ class StreamInput {
public:
StreamInput(CaptureConfig* const config);
StreamInput(const StreamInput&) = delete;
StreamInput(StreamInput&&) = delete;
StreamInput& operator=(const StreamInput&) = delete;
StreamInput& operator=(StreamInput&&) = delete;
size_t write(const void* const data, const size_t length);
private:
@@ -42,12 +47,12 @@ private:
FIFO<StreamBuffer*> fifo_buffers_empty;
FIFO<StreamBuffer*> fifo_buffers_full;
std::array<StreamBuffer, buffer_count_max> buffers;
std::array<StreamBuffer*, buffer_count_max> buffers_empty;
std::array<StreamBuffer*, buffer_count_max> buffers_full;
std::array<StreamBuffer, buffer_count_max> buffers { };
std::array<StreamBuffer*, buffer_count_max> buffers_empty { };
std::array<StreamBuffer*, buffer_count_max> buffers_full { };
StreamBuffer* active_buffer { nullptr };
CaptureConfig* const config { nullptr };
std::unique_ptr<uint8_t[]> data;
std::unique_ptr<uint8_t[]> data { };
};
#endif/*__STREAM_INPUT_H__*/
Binary file not shown.