EchoMap 2026-07-25 6d3977c
An experimental cross-platform digital signal processing application for sound-source localisation.
Loading...
Searching...
No Matches
echomap::SignalDFTPanel Class Referencefinal

Provides an IPanel to display and interact with previews of Signal frequency spectra (i.e., Signal DFTs). More...

#include <SignalDFTPanel.hpp>

Inheritance diagram for echomap::SignalDFTPanel:
[legend]

Classes

struct  CallbackData
struct  CacheKey
 A three-way key into the FrequencySpectrum cache. More...
struct  CacheValue
 A keyed value within the FrequencySpectrum cache, either denoting a pending, failed, or present DFT. More...
struct  CacheKeyHash
 The hash functor for CacheKey. More...

Public Member Functions

 SignalDFTPanel (Worker *parent_worker, WorkerResultDespatcher &despatcher, EchoMap *app, const Project *initial_project=nullptr)
 Create a new SignalDFTPanel to display DFTs of Signal waveforms in the frequency domain.
 SignalDFTPanel (const SignalDFTPanel &)=delete
SignalDFTPaneloperator= (const SignalDFTPanel &)=delete
 SignalDFTPanel (SignalDFTPanel &&) noexcept
SignalDFTPaneloperator= (SignalDFTPanel &&) noexcept=delete
void draw () noexcept override
 Draw the panel to the active rendering context.
const char * get_imgui_name () const noexcept override
 Retrieves the name of the IPanel for Dear ImGui API functions.
void change_active_project (const Project *new_project) override
 Updates the active Project being described by the IPanel.
Public Member Functions inherited from echomap::IPanel
virtual void update_gpu (const wgpu::CommandEncoder &command_encoder)
 Delegate work to the GPU via the WebGPU platform.

Static Public Member Functions

static const char * get_imgui_stable_name () noexcept

Private Member Functions

void handle_completed_dft (DFTResult &&result)
void draw_configuration_section () noexcept
void draw_configuration_window_function () noexcept
void draw_configuration_transform_size () noexcept
void draw_configuration_scale_type () noexcept
void draw_configuration_preview_actions () noexcept
void draw_preview_section () noexcept
void draw_preview_of_signal (std::shared_ptr< Signal > signal) noexcept
void reset_available_transform_sizes ()
void update_spectrum_bounds (const FrequencySpectrum &spectrum) noexcept
void update_spectrum_bounds () noexcept
void update_available_sizes (std::uint64_t maximum_sample_count)
void reset_viewport_bounds () noexcept
const FrequencySpectrumget_spectra (std::shared_ptr< Signal > signal, WindowFunctions::AllFunctions window_function, std::size_t transform_size)

Static Private Member Functions

static ImPlotPoint get_indexed_frequency_bin (int index, void *user_data) noexcept

Private Attributes

ImPlotRect spectrum_bounds
 The minimal bounding box required to fully contain the DFT spectrum plot.
ImPlotRect viewport_bounds
 The user-controlled bounding box of the DFT plots.
std::string panel_name
ImPlotSpec plotting_spec_2d
Workerparent_worker
const Projectactive_project = nullptr
EchoMapapp
std::unordered_map< CacheKey, CacheValue, CacheKeyHashspectra_cache
 Cached DFT spectra.
bool use_log_scale = false
 Should the DFT be plotted with a linear or base-10 logarithmic freq.
std::vector< std::stringavailable_sizes
 Strings of all available transform sizes.
unsigned int selected_size_log = default_size_log
 Base-2 log of selected transform size.
WindowFunctions::AllFunctions selected_window = WindowFunctions::Constant{}
std::vector< sigc::scoped_connection > connections

Static Private Attributes

static constexpr unsigned int default_size_log = 7
 Base-2 log of the minimum transform size.

Additional Inherited Members

Static Protected Attributes inherited from echomap::IPanel
static constexpr ImVec2 button_size {80.0f, 20.0f}
static constexpr auto table_flags

Detailed Description

Provides an IPanel to display and interact with previews of Signal frequency spectra (i.e., Signal DFTs).

Definition at line 34 of file SignalDFTPanel.hpp.

Constructor & Destructor Documentation

◆ SignalDFTPanel()

echomap::SignalDFTPanel::SignalDFTPanel ( Worker * parent_worker,
WorkerResultDespatcher & despatcher,
EchoMap * app,
const Project * initial_project = nullptr )
explicit

Create a new SignalDFTPanel to display DFTs of Signal waveforms in the frequency domain.

The SignalDFTPanel consumes the DFTResult message.

Parameters
parent_workerThe Worker to receive ITask commands over the command bus.
despatcherThe despatcher to expose the result buses.
appThe parent application instance.
initial_projectAn optional initial Project for the IPanel to display.

Definition at line 37 of file SignalDFTPanel.cpp.

42 :
43 panel_name(std::string("Signal DFT Panel") + get_imgui_stable_name()),
44 parent_worker(parent_worker),
45 active_project(initial_project),
46 app(app)
47{
48 connections.emplace_back(despatcher.dft_finished_channel.nominate_consumer(
49 sigc::mem_fun(*this, &SignalDFTPanel::handle_completed_dft)
50 ));
51
52 reset_available_transform_sizes();
53}

Member Function Documentation

◆ change_active_project()

void echomap::SignalDFTPanel::change_active_project ( const Project * new_project)
overridevirtual

Updates the active Project being described by the IPanel.

Parameters
new_projectAn observing pointer to the new active Project.

Implements echomap::IProjectPanel.

Definition at line 90 of file SignalDFTPanel.cpp.

93{
94 active_project = new_project;
95 spectra_cache.clear();
96 reset_available_transform_sizes();
97 update_spectrum_bounds();
98 reset_viewport_bounds();
99}
std::unordered_map< CacheKey, CacheValue, CacheKeyHash > spectra_cache
Cached DFT spectra.

◆ draw()

void echomap::SignalDFTPanel::draw ( )
overridevirtualnoexcept

Draw the panel to the active rendering context.

Implements echomap::IPanel.

Definition at line 59 of file SignalDFTPanel.cpp.

60{
61 if (ImGui::Begin(panel_name.c_str())) {
62 if (active_project == nullptr)
63 ImGui::Text("No project is loaded.");
64 else {
65 bool drawn_any = false;
66 std::uint64_t max_sample_count = 0;
67
68 for (const auto& signal : active_project->observe_signals()) {
69 max_sample_count = std::max(max_sample_count, signal.get_sample_count());
70 drawn_any = true;
71 }
72
73 if (drawn_any) {
74 update_available_sizes(max_sample_count);
75 draw_configuration_section();
76 draw_preview_section();
77 } else
78 ImGui::Text("No signals are available.");
79 }
80 }
81
82 ImGui::End();
83}
T max(T... args)
T signal(T... args)

◆ draw_configuration_preview_actions()

void echomap::SignalDFTPanel::draw_configuration_preview_actions ( )
privatenoexcept

Definition at line 268 of file SignalDFTPanel.cpp.

269{
270 ImGui::TextUnformatted("Preview Actions");
271 ImGui::TableNextColumn();
272
273 if (ImGui::Button("Reset Viewports##DFTOptionsResetViewport"))
274 reset_viewport_bounds();
275 ImGui::SameLine();
276 if (ImGui::Button("Reset Cached DFTs##DFTOptionsResetCache")) {
277 spectra_cache.clear();
278 update_spectrum_bounds();
279 reset_viewport_bounds();
280 app->increment_forced_frames();
281 }
282}

◆ draw_configuration_scale_type()

void echomap::SignalDFTPanel::draw_configuration_scale_type ( )
privatenoexcept

Definition at line 257 of file SignalDFTPanel.cpp.

258{
259 ImGui::TextUnformatted("Logarithmic Frequency Scale");
260 ImGui::TableNextColumn();
261
262 if (ImGui::Checkbox("##DFTOptionsLogScale", &use_log_scale)) {
263 update_spectrum_bounds();
264 reset_viewport_bounds();
265 }
266}
bool use_log_scale
Should the DFT be plotted with a linear or base-10 logarithmic freq.

◆ draw_configuration_section()

void echomap::SignalDFTPanel::draw_configuration_section ( )
privatenoexcept

Definition at line 158 of file SignalDFTPanel.cpp.

159{
160 ImGui::SeparatorText("DFT Configuration");
161
162 if (ImGui::BeginTable("##DFTOptionsTable", 2, table_flags)) {
163 ImGui::TableSetupColumn("##DFTOptionsTableLabel", ImGuiTableColumnFlags_WidthFixed);
164 ImGui::TableSetupColumn("##DFTOptionsTableControl", ImGuiTableColumnFlags_WidthStretch);
165
166 ImGui::TableNextRow();
167 ImGui::TableNextColumn();
168 draw_configuration_window_function();
169
170 ImGui::TableNextRow();
171 ImGui::TableNextColumn();
172 draw_configuration_transform_size();
173
174 ImGui::TableNextRow();
175 ImGui::TableNextColumn();
176 draw_configuration_scale_type();
177
178 ImGui::TableNextRow();
179 ImGui::TableNextColumn();
180 draw_configuration_preview_actions();
181
182 ImGui::EndTable();
183 }
184}

◆ draw_configuration_transform_size()

void echomap::SignalDFTPanel::draw_configuration_transform_size ( )
privatenoexcept

Definition at line 229 of file SignalDFTPanel.cpp.

230{
231 ImGui::TextUnformatted("Transform Size");
232 ImGui::TableNextColumn();
233
234 ImGui::SetNextItemWidth(-std::numeric_limits<float>::min());
235
236 if (ImGui::BeginCombo("##DFTOptionsTransformSize", available_sizes[selected_size_log - default_size_log].c_str())) {
237 for (unsigned int item_idx = 0; item_idx < available_sizes.size(); ++item_idx) {
238 const auto is_selected = item_idx == selected_size_log - default_size_log;
239 if (ImGui::Selectable(available_sizes[item_idx].c_str(), is_selected) &&
240 selected_size_log != item_idx + default_size_log) {
241
242 // The selected size has changed.
244 update_spectrum_bounds();
245 reset_viewport_bounds();
246 }
247
248 if (is_selected)
249 ImGui::SetItemDefaultFocus();
250 }
251
252 ImGui::EndCombo();
253 app->increment_forced_frames();
254 }
255}
unsigned int selected_size_log
Base-2 log of selected transform size.
std::vector< std::string > available_sizes
Strings of all available transform sizes.
static constexpr unsigned int default_size_log
Base-2 log of the minimum transform size.
T min(T... args)

◆ draw_configuration_window_function()

void echomap::SignalDFTPanel::draw_configuration_window_function ( )
privatenoexcept

Definition at line 186 of file SignalDFTPanel.cpp.

187{
188 ImGui::TextUnformatted("Input Window Function");
189 ImGui::TableNextColumn();
190
191 ImGui::SetNextItemWidth(-std::numeric_limits<float>::min());
192
193 if (auto selected_idx = selected_window.index();
194 /*
195 * Disabled string_view::data warnings: we know that the views were constructed from string literals, hence
196 * NULL-terminated. Dear ImGui provides no API for specifying the lengths of the expected data, so we can rely
197 * on the termination here.
198 */
199
200 // NOLINTNEXTLINE(*-suspicious-stringview-data-usage)
201 ImGui::BeginCombo("##DFTOptionsWindowFunction", window_function_names[selected_idx].data())) {
202 for (std::size_t item_idx = 0; item_idx < window_function_names.size(); ++item_idx) {
203 const auto is_selected = item_idx == selected_idx;
204
205 // NOLINTNEXTLINE(*-suspicious-stringview-data-usage)
206 if (ImGui::Selectable(window_function_names[item_idx].data(), is_selected) && selected_idx != item_idx) {
207 selected_idx = item_idx;
208
209 try {
210 selected_window = variant_helpers::variant_from_index<WindowFunctions::AllFunctions>(selected_idx);
211 } catch (const std::out_of_range&) {
212 LOG_WARN("Invalid window function index was selected. Resetting to the default.");
213 selected_window = WindowFunctions::Constant{};
214 }
215
216 update_spectrum_bounds();
217 reset_viewport_bounds();
218 }
219
220 if (is_selected)
221 ImGui::SetItemDefaultFocus();
222 }
223
224 ImGui::EndCombo();
225 app->increment_forced_frames();
226 }
227}
#define LOG_WARN(msg)
Logs an unformatted warning-level message using echomap::Logger::log.
Definition Logger.hpp:162
T data(T... args)

◆ draw_preview_of_signal()

void echomap::SignalDFTPanel::draw_preview_of_signal ( std::shared_ptr< Signal > signal)
privatenoexcept

Definition at line 302 of file SignalDFTPanel.cpp.

305{
306 const auto* const name = signal->get_imgui_name();
307 if (const auto* const spectrum =
308 get_spectra(std::move(signal), selected_window, std::size_t{1} << selected_size_log);
309 spectrum != nullptr) {
310
311 // Case 1: we got a spectrum immediately.
312 if (ImPlot::BeginPlot(spectrum->get_imgui_name())) {
313 ImPlot::SetupAxes("Frequency (Hz)", "Magnitude (dBfs)");
314 ImPlot::SetupAxisScale(ImAxis_X1, use_log_scale ? ImPlotScale_Log10 : ImPlotScale_Linear);
315 ImPlot::SetupAxisLinks(ImAxis_X1, &viewport_bounds.X.Min, &viewport_bounds.X.Max);
316 ImPlot::SetupAxisLinks(ImAxis_Y1, &viewport_bounds.Y.Min, &viewport_bounds.Y.Max);
317
318 int plottable_bin_count = static_cast<int>(spectrum->get_bin_count());
319 CallbackData callback_data = {.spectrum = spectrum, .index_offset = 0};
320
321 if (plottable_bin_count > 0 && use_log_scale) {
322 // If we're plotting on the log scale, discount the DC component if it exists.
323 --plottable_bin_count;
324 callback_data.index_offset = 1;
325 }
326
327 ImPlot::PlotLineG(
328 "",
329 &SignalDFTPanel::get_indexed_frequency_bin,
330 &callback_data,
331 plottable_bin_count,
332 plotting_spec_2d
333 );
334
335 ImPlot::EndPlot();
336 }
337
338 } else
339 // Case 2: we didn't get one immediately. Either it's pending, or it failed.
340 // TODO: indicate failure here as well as loading.
341 ImGui::Text(
342 "Loading DFT of %s with the %s window function...",
343 name,
344 // NOLINTNEXTLINE(*-suspicious-stringview-data-usage)
345 window_function_names[selected_window.index()].data()
346 );
347}
ImPlotRect viewport_bounds
The user-controlled bounding box of the DFT plots.

◆ draw_preview_section()

void echomap::SignalDFTPanel::draw_preview_section ( )
privatenoexcept

Definition at line 284 of file SignalDFTPanel.cpp.

285{
286 ImGui::SeparatorText("DFT Previews");
287
288 if (ImPlot::BeginAlignedPlots("##DFTAlignedGroup")) {
289 ImPlot::PushStyleColor(ImPlotCol_FrameBg, ImVec4(0.0f, 0.0f, 0.0f, 0.0f));
290
291 for (const auto& signal :
292 active_project->share_signals() | std::views::filter([](const std::shared_ptr<Signal>& candidate) {
293 return candidate->is_uniformly_sampled();
294 }))
295 draw_preview_of_signal(signal);
296
297 ImPlot::EndAlignedPlots();
298 ImPlot::PopStyleColor();
299 }
300}

◆ get_imgui_name()

const char * echomap::SignalDFTPanel::get_imgui_name ( ) const
nodiscardoverridevirtualnoexcept

Retrieves the name of the IPanel for Dear ImGui API functions.

Returns
The human-readable name of the window as a NULL-terminated C string.

Implements echomap::IPanel.

Definition at line 85 of file SignalDFTPanel.cpp.

86{
87 return panel_name.c_str();
88}

◆ get_imgui_stable_name()

const char * echomap::SignalDFTPanel::get_imgui_stable_name ( )
staticnoexcept

Definition at line 101 of file SignalDFTPanel.cpp.

102{
103 return "###SignalDFTPanel";
104}

◆ get_indexed_frequency_bin()

ImPlotPoint echomap::SignalDFTPanel::get_indexed_frequency_bin ( int index,
void * user_data )
staticprivatenoexcept

Definition at line 148 of file SignalDFTPanel.cpp.

152{
153 const auto* const info = static_cast<CallbackData*>(user_data);
154 index += info->index_offset;
155 return {info->spectrum->cbegin()[index].frequency, info->spectrum->cbegin()[index].magnitude};
156}

◆ get_spectra()

const FrequencySpectrum * echomap::SignalDFTPanel::get_spectra ( std::shared_ptr< Signal > signal,
WindowFunctions::AllFunctions window_function,
std::size_t transform_size )
private

Definition at line 448 of file SignalDFTPanel.cpp.

453{
454 assert(signal != nullptr);
455
456 const CacheKey key{
457 .source_id = signal->get_id(),
458 .window_function = window_function,
459 .transform_size = transform_size,
460 };
461
462 auto& entry = spectra_cache[key];
463 if (entry.spectrum != nullptr)
464 return entry.spectrum.get();
465
466 if (entry.status != CacheValue::State::Pending) {
467 entry.status = CacheValue::State::Pending;
468 parent_worker->submit(std::make_unique<DFTTask>(std::move(signal), window_function, transform_size));
469 }
470
471 return nullptr;
472}
T make_unique(T... args)
A three-way key into the FrequencySpectrum cache.

◆ handle_completed_dft()

void echomap::SignalDFTPanel::handle_completed_dft ( DFTResult && result)
private

Definition at line 106 of file SignalDFTPanel.cpp.

109{
110 auto spectrum = std::move(result).take_spectrum();
111
112 if (spectrum == nullptr) {
113 LOG_WARN("Dropping a null DFT result.");
114 return;
115 }
116
117 const CacheKey key{
118 .source_id = result.get_source_id(),
119 .window_function = spectrum->observe_preprocessor(),
120 .transform_size = result.get_transform_size(),
121 };
122
123 const auto cache_slot_it = spectra_cache.find(key);
124 if (cache_slot_it == spectra_cache.end()) {
125 LOG_F_WARN("Dropping an unexpected result for the DFT of Signal {}.", spectrum->get_name());
126 return;
127 }
128
129 cache_slot_it->second.status = CacheValue::State::Success;
130 cache_slot_it->second.spectrum = std::move(spectrum);
131
132 const bool result_is_currently_visible = key.window_function.index() == selected_window.index() &&
133 key.transform_size == (std::size_t{1} << selected_size_log);
134
135 if (result_is_currently_visible) {
136 const auto had_no_visible_spectrum =
137 spectrum_bounds.X.Min > spectrum_bounds.X.Max || spectrum_bounds.Y.Min > spectrum_bounds.Y.Max;
138
139 update_spectrum_bounds(*cache_slot_it->second.spectrum);
140
141 if (had_no_visible_spectrum)
142 reset_viewport_bounds();
143
144 app->increment_forced_frames();
145 }
146}
#define LOG_F_WARN(msg,...)
Logs a formatted warning-level message using echomap::Logger::log_f.
Definition Logger.hpp:115
ImPlotRect spectrum_bounds
The minimal bounding box required to fully contain the DFT spectrum plot.

◆ reset_available_transform_sizes()

void echomap::SignalDFTPanel::reset_available_transform_sizes ( )
private

Definition at line 349 of file SignalDFTPanel.cpp.

350{
351 // TODO: what if we have signals, but they all have less than 128 samples?
352
353 available_sizes.clear();
354 available_sizes.push_back(std::to_string(std::size_t{1} << default_size_log));
356}
T to_string(T... args)

◆ reset_viewport_bounds()

void echomap::SignalDFTPanel::reset_viewport_bounds ( )
privatenoexcept

Definition at line 430 of file SignalDFTPanel.cpp.

431{
433
434 if (use_log_scale && viewport_bounds.X.Min <= 0.0)
435 viewport_bounds.X.Min = 1.0;
436
437 if (viewport_bounds.X.Min >= viewport_bounds.X.Max) {
438 viewport_bounds.X.Min = use_log_scale ? 1.0 : 0.0;
439 viewport_bounds.X.Max = 1.0;
440 }
441
442 if (viewport_bounds.Y.Min >= viewport_bounds.Y.Max) {
443 viewport_bounds.Y.Min = 0.0;
444 viewport_bounds.Y.Max = 1.0;
445 }
446}

◆ update_available_sizes()

void echomap::SignalDFTPanel::update_available_sizes ( std::uint64_t maximum_sample_count)
private

Definition at line 399 of file SignalDFTPanel.cpp.

402{
403 if (available_sizes.empty())
404 reset_available_transform_sizes();
405
406 if (maximum_sample_count > std::uint64_t{1} << (available_sizes.size() + default_size_log - 1)) {
407 /*
408 * If the maximum sample count can support a large transform size than currently advertised, re-create the list.
409 * (Yes, we could be smarter here and just append the tail.)
410 */
411 constexpr std::uint64_t minimum_transform_size = std::uint64_t{1} << default_size_log;
412 const std::size_t maximum_transform_size =
413 std::max(minimum_transform_size, std::bit_floor(maximum_sample_count));
414
415 available_sizes.clear();
416 for (std::uint64_t size = minimum_transform_size; size <= maximum_transform_size; size <<= std::uint64_t{1}) {
417 available_sizes.push_back(std::to_string(size));
419 break;
420 }
421 }
422
423 // Once we know the correct maximum transform size, bound the selection to the maximum available.
426 static_cast<unsigned int>(available_sizes.size() + default_size_log - 1);
427 }
428}
T bit_floor(T... args)
T size(T... args)

◆ update_spectrum_bounds() [1/2]

void echomap::SignalDFTPanel::update_spectrum_bounds ( )
privatenoexcept

Definition at line 384 of file SignalDFTPanel.cpp.

385{
390
391 const auto selected_transform_size = std::size_t{1} << selected_size_log;
392
393 for (const auto& [key, value] : spectra_cache)
394 if (value.spectrum != nullptr && key.window_function.index() == selected_window.index() &&
395 key.transform_size == selected_transform_size)
396 update_spectrum_bounds(*value.spectrum);
397}
T lowest(T... args)

◆ update_spectrum_bounds() [2/2]

void echomap::SignalDFTPanel::update_spectrum_bounds ( const FrequencySpectrum & spectrum)
privatenoexcept

Definition at line 358 of file SignalDFTPanel.cpp.

361{
362 using BoundType = decltype(spectrum_bounds.X.Min);
363
364 const auto bin_count = static_cast<std::ptrdiff_t>(spectrum.get_bin_count());
365 if (bin_count == 0)
366 return;
367
368 const ptrdiff_t first_bin_idx = use_log_scale && bin_count > 1 ? 1 : 0;
369 if (first_bin_idx >= bin_count)
370 return;
371
372 spectrum_bounds.X.Min =
373 std::min(static_cast<BoundType>(spectrum.cbegin()[first_bin_idx].frequency), spectrum_bounds.X.Min);
374 spectrum_bounds.X.Max =
375 std::max(static_cast<BoundType>(spectrum.cbegin()[bin_count - 1].frequency), spectrum_bounds.X.Max);
376
377 for (auto bin_idx = first_bin_idx; bin_idx < bin_count; ++bin_idx) {
378 const auto magnitude = static_cast<BoundType>(spectrum.cbegin()[bin_idx].magnitude);
379 spectrum_bounds.Y.Min = std::min(magnitude, spectrum_bounds.Y.Min);
380 spectrum_bounds.Y.Max = std::max(magnitude, spectrum_bounds.Y.Max);
381 }
382}

Member Data Documentation

◆ active_project

const Project* echomap::SignalDFTPanel::active_project = nullptr
private

Definition at line 120 of file SignalDFTPanel.hpp.

◆ app

EchoMap* echomap::SignalDFTPanel::app
private

Definition at line 121 of file SignalDFTPanel.hpp.

◆ available_sizes

std::vector<std::string> echomap::SignalDFTPanel::available_sizes
private

Strings of all available transform sizes.

Definition at line 168 of file SignalDFTPanel.hpp.

◆ connections

std::vector<sigc::scoped_connection> echomap::SignalDFTPanel::connections
private

Definition at line 174 of file SignalDFTPanel.hpp.

◆ default_size_log

unsigned int echomap::SignalDFTPanel::default_size_log = 7
staticconstexprprivate

Base-2 log of the minimum transform size.

Definition at line 167 of file SignalDFTPanel.hpp.

◆ panel_name

std::string echomap::SignalDFTPanel::panel_name
private

Definition at line 117 of file SignalDFTPanel.hpp.

◆ parent_worker

Worker* echomap::SignalDFTPanel::parent_worker
private

Definition at line 119 of file SignalDFTPanel.hpp.

◆ plotting_spec_2d

ImPlotSpec echomap::SignalDFTPanel::plotting_spec_2d
private

Definition at line 118 of file SignalDFTPanel.hpp.

◆ selected_size_log

unsigned int echomap::SignalDFTPanel::selected_size_log = default_size_log
private

Base-2 log of selected transform size.

Definition at line 169 of file SignalDFTPanel.hpp.

◆ selected_window

WindowFunctions::AllFunctions echomap::SignalDFTPanel::selected_window = WindowFunctions::Constant{}
private

Definition at line 172 of file SignalDFTPanel.hpp.

172{};

◆ spectra_cache

std::unordered_map<CacheKey, CacheValue, CacheKeyHash> echomap::SignalDFTPanel::spectra_cache
private

Cached DFT spectra.

Definition at line 165 of file SignalDFTPanel.hpp.

◆ spectrum_bounds

ImPlotRect echomap::SignalDFTPanel::spectrum_bounds
private

◆ use_log_scale

bool echomap::SignalDFTPanel::use_log_scale = false
private

Should the DFT be plotted with a linear or base-10 logarithmic freq.

axis?

Definition at line 166 of file SignalDFTPanel.hpp.

◆ viewport_bounds

ImPlotRect echomap::SignalDFTPanel::viewport_bounds
private

The user-controlled bounding box of the DFT plots.

Definition at line 115 of file SignalDFTPanel.hpp.


The documentation for this class was generated from the following files: