Add StdDev/SNR calc for debug.

kf7r_9600_experimental
Rob Riggs 2020-04-14 21:02:15 -05:00
rodzic f84a4a289e
commit 6420bd4f58
10 zmienionych plików z 105 dodań i 7 usunięć

Wyświetl plik

@ -3,7 +3,7 @@
<configuration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1309195742.6250637" name="ARM_Debug">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1332118872860258658" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-875080106735501948" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -14,7 +14,7 @@
<configuration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1309195742.6250637.815824991" name="ARM_Release">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1246452000316836338" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-789413234192079628" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

Wyświetl plik

@ -895,7 +895,7 @@ static void MX_DAC1_Init(void)
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_T7_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
@ -904,9 +904,11 @@ static void MX_DAC1_Init(void)
/**DAC channel OUT2 config
*/
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);

Wyświetl plik

@ -5,6 +5,7 @@
#include "Goertzel.h"
#include "AudioInput.hpp"
#include "GPIO.hpp"
#include "Log.h"
namespace mobilinkd { namespace tnc {
@ -32,8 +33,31 @@ hdlc::IoFrame* Fsk9600Demodulator::operator()(const q15_t* samples)
if (tmp) hdlc::release(tmp);
} else {
result = hdlc_decoder_(nrzi_.decode(lfsr_(bit)), locked_);
#ifdef KISS_LOGGING
if (result) {
INFO("samples = %ld, mean = %d, dev = %d",
snr_.samples, int(snr_.mean), int(snr_.stdev()));
INFO("SNR = %dmB", int(snr_.SNR() * 100.0f));
snr_.reset();
}
#endif
}
#ifdef KISS_LOGGING
if (hdlc_decoder_.active())
{
if (!decoding_)
{
snr_.reset();
decoding_ = true;
}
snr_.capture(float(abs(sample)));
} else {
decoding_ = false;
}
#endif
}
}
return result;
}

Wyświetl plik

@ -10,6 +10,7 @@
#include "NRZI.hpp"
#include "HdlcDecoder.hpp"
#include "KissHardware.hpp"
#include "StandardDeviation.hpp"
namespace mobilinkd { namespace tnc {
@ -46,6 +47,8 @@ struct Fsk9600Demodulator : IDemodulator
Descrambler lfsr_;
libafsk::NRZI nrzi_;
hdlc::NewDecoder hdlc_decoder_;
StandardDeviation snr_;
bool decoding_{false};
virtual ~Fsk9600Demodulator() {}

Wyświetl plik

@ -205,6 +205,7 @@ struct Encoder {
void send_delay() {
const size_t tmp = tx_delay_ * 1.25 * modulator_->bits_per_ms();
INFO("Sending %u IDLE bytes", tmp);
for (size_t i = 0; i != tmp; i++) {
send_raw(IDLE);

Wyświetl plik

@ -68,6 +68,11 @@ struct NewDecoder
{
dcd = config;
}
bool active() const
{
return state != State::IDLE;
}
};
}}} // mobilinkd::tnc::hdlc

Wyświetl plik

@ -112,7 +112,7 @@ void reply16(uint8_t cmd, uint16_t result) {
ioport->write(data, 3, 6, osWaitForever);
}
inline void reply(uint8_t cmd, const uint8_t* data, uint16_t len) {
void reply(uint8_t cmd, const uint8_t* data, uint16_t len) {
uint8_t* buffer = static_cast<uint8_t*>(alloca(len + 1));
buffer[0] = cmd;
for (uint16_t i = 0; i != len; i++)

Wyświetl plik

@ -105,6 +105,8 @@ constexpr const uint8_t GET_MAC_ADDRESS = 48;
constexpr const uint8_t GET_DATETIME = 49;
constexpr const uint8_t SET_DATETIME = 50;
constexpr const uint8_t GET_ERROR_MSG = 51;
constexpr const uint8_t GET_SNR = 52;
constexpr const uint8_t GET_BER = 53;
constexpr const uint8_t SET_BLUETOOTH_NAME = 65;
constexpr const uint8_t GET_BLUETOOTH_NAME = 66;
@ -402,4 +404,6 @@ void reply8(uint8_t cmd, uint8_t result) __attribute__((noinline));
void reply16(uint8_t cmd, uint16_t result) __attribute__((noinline));
void reply(uint8_t cmd, const uint8_t* data, uint16_t len) __attribute__((noinline));
}}} // mobilinkd::tnc::kiss

Wyświetl plik

@ -0,0 +1,59 @@
// Copyright 2020 Mobilinkd LLC <rob@mobilinkd.com>
// All rights reserved.
#pragma once
#include "main.h"
#include <arm_math.h>
#include <cstdint>
namespace mobilinkd {
/**
* Compute a running standard deviation.
*
* Based on https://dsp.stackexchange.com/a/1187/36581
*/
struct StandardDeviation
{
float mean{0.0};
float S{0.0};
uint32_t samples{0};
void reset()
{
mean = 0.0;
S = 0.0;
samples = 0;
}
void capture(float sample)
{
auto prev = mean;
samples += 1;
mean = mean + (sample - mean) / samples;
S = S + (sample - mean) * (sample - prev);
}
float variance() const
{
return samples == 0 ? -1.0 : S / samples;
}
float stdev() const
{
float result = -1.0;
arm_sqrt_f32(variance(), &result);
return result;
}
// SNR in dB
float SNR() const
{
return 10.0 * log10(mean / stdev());
}
};
} // mobilinkd

Wyświetl plik

@ -9,4 +9,4 @@ source [find target/stm32l4x.cfg]
reset_config srst_only
itm port 0 on
tpiu config internal swv uart off 48000000
tpiu config internal swv uart off 80000000