Spectrum streaming control, spectrum attributes back in each frame.

TODO: This feels kinda complex, and there's some repeated Processor code that needs to be refactored into a base class.
This commit is contained in:
Jared Boone
2016-01-10 10:42:20 -08:00
parent 0647f26707
commit d821afc60d
10 changed files with 101 additions and 29 deletions

View File

@@ -53,6 +53,10 @@ void NarrowbandAMAudio::on_message(const Message* const message) {
configure(*reinterpret_cast<const AMConfigureMessage*>(message));
break;
case Message::ID::SpectrumStreamingConfig:
streaming_config(*reinterpret_cast<const SpectrumStreamingConfigMessage*>(message));
break;
default:
break;
}
@@ -82,3 +86,11 @@ void NarrowbandAMAudio::configure(const AMConfigureMessage& message) {
configured = true;
}
void NarrowbandAMAudio::streaming_config(const SpectrumStreamingConfigMessage& message) {
if( message.mode == SpectrumStreamingConfigMessage::Mode::Running ) {
channel_spectrum.start();
} else {
channel_spectrum.stop();
}
}

View File

@@ -64,6 +64,8 @@ private:
bool configured { false };
void configure(const AMConfigureMessage& message);
void streaming_config(const SpectrumStreamingConfigMessage& message);
};
#endif/*__PROC_AM_AUDIO_H__*/

View File

@@ -66,6 +66,10 @@ void NarrowbandFMAudio::on_message(const Message* const message) {
configure(*reinterpret_cast<const NBFMConfigureMessage*>(message));
break;
case Message::ID::SpectrumStreamingConfig:
streaming_config(*reinterpret_cast<const SpectrumStreamingConfigMessage*>(message));
break;
default:
break;
}
@@ -99,3 +103,11 @@ void NarrowbandFMAudio::configure(const NBFMConfigureMessage& message) {
configured = true;
}
void NarrowbandFMAudio::streaming_config(const SpectrumStreamingConfigMessage& message) {
if( message.mode == SpectrumStreamingConfigMessage::Mode::Running ) {
channel_spectrum.start();
} else {
channel_spectrum.stop();
}
}

View File

@@ -66,6 +66,8 @@ private:
bool configured { false };
void configure(const NBFMConfigureMessage& message);
void streaming_config(const SpectrumStreamingConfigMessage& message);
};
#endif/*__PROC_NFM_AUDIO_H__*/

View File

@@ -84,6 +84,10 @@ void WidebandFMAudio::on_message(const Message* const message) {
configure(*reinterpret_cast<const WFMConfigureMessage*>(message));
break;
case Message::ID::SpectrumStreamingConfig:
streaming_config(*reinterpret_cast<const SpectrumStreamingConfigMessage*>(message));
break;
default:
break;
}
@@ -117,3 +121,11 @@ void WidebandFMAudio::configure(const WFMConfigureMessage& message) {
configured = true;
}
void WidebandFMAudio::streaming_config(const SpectrumStreamingConfigMessage& message) {
if( message.mode == SpectrumStreamingConfigMessage::Mode::Running ) {
channel_spectrum.start();
} else {
channel_spectrum.stop();
}
}

View File

@@ -67,6 +67,8 @@ private:
bool configured { false };
void configure(const WFMConfigureMessage& message);
void streaming_config(const SpectrumStreamingConfigMessage& message);
};
#endif/*__PROC_WFM_AUDIO_H__*/

View File

@@ -29,6 +29,16 @@
#include <algorithm>
void SpectrumCollector::start() {
streaming = true;
ChannelSpectrumConfigMessage message { &fifo };
shared_memory.application_queue.push(message);
}
void SpectrumCollector::stop() {
streaming = false;
}
void SpectrumCollector::set_decimation_factor(
const size_t decimation_factor
) {
@@ -48,7 +58,7 @@ void SpectrumCollector::feed(
// Called from baseband processing thread.
channel_filter_pass_frequency = filter_pass_frequency;
channel_filter_stop_frequency = filter_stop_frequency;
post_configuration_message();
channel_spectrum_decimator.feed(
channel,
[this](const buffer_c16_t& data) {
@@ -59,7 +69,7 @@ void SpectrumCollector::feed(
void SpectrumCollector::post_message(const buffer_c16_t& data) {
// Called from baseband processing thread.
if( !channel_spectrum_request_update ) {
if( streaming && !channel_spectrum_request_update ) {
fft_swap(data, channel_spectrum);
channel_spectrum_sampling_rate = data.sampling_rate;
channel_spectrum_request_update = true;
@@ -67,24 +77,17 @@ void SpectrumCollector::post_message(const buffer_c16_t& data) {
}
}
void SpectrumCollector::post_configuration_message() {
ChannelSpectrumConfigMessage message {
channel_spectrum_sampling_rate,
channel_filter_pass_frequency,
channel_filter_stop_frequency,
&fifo
};
shared_memory.application_queue.push(message);
}
void SpectrumCollector::update() {
// Called from idle thread (after EVT_MASK_SPECTRUM is flagged)
if( channel_spectrum_request_update ) {
if( streaming && channel_spectrum_request_update ) {
/* Decimated buffer is full. Compute spectrum. */
channel_spectrum_request_update = false;
fft_c_preswapped(channel_spectrum);
ChannelSpectrum spectrum;
spectrum.sampling_rate = channel_spectrum_sampling_rate;
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
@@ -95,7 +98,6 @@ void SpectrumCollector::update() {
const unsigned int v = (db * mag_scale) + 255.0f;
spectrum.db[i] = std::max(0U, std::min(255U, v));
}
fifo.in(spectrum);
}
}

View File

@@ -39,6 +39,9 @@ public:
{
}
void start();
void stop();
void set_decimation_factor(const size_t decimation_factor);
void feed(
@@ -54,13 +57,13 @@ private:
ChannelSpectrumFIFO fifo;
volatile bool channel_spectrum_request_update { false };
bool streaming { false };
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 };
void post_message(const buffer_c16_t& data);
void post_configuration_message();
};
#endif/*__SPECTRUM_COLLECTOR_H__*/