From dd370499f8fcc5ce5a41a86a08b1e2058af194e7 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Mon, 11 Sep 2023 20:00:48 +0800 Subject: [PATCH] TEC control loop --- main.cpp | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/main.cpp b/main.cpp index 55764d3..bfeb3af 100644 --- a/main.cpp +++ b/main.cpp @@ -33,6 +33,11 @@ static int waterfall_width = 1000; static int waterfall_height = 2000; static unsigned int waterfall_data[1000*2000]; +static std::atomic freq_setpoint; +static std::atomic freq_peak; +static std::atomic tec_bias; +static std::atomic tec_p; + static std::atomic fps; static void dsp_thread() { @@ -47,10 +52,11 @@ static void dsp_thread() { std::vector> frames_f(len); pocketfft::shape_t shape{len}; pocketfft::stride_t stride(1); - stride[0] = 2*sizeof(float); + stride[0] = sizeof(std::complex); pocketfft::shape_t axes; axes.push_back(0); - std::vector> frames_ft(len); + std::vector> frames_ft_rev(len); + std::vector frames_mag(len); int iterations = 0; auto last_second = std::chrono::steady_clock::now(); @@ -65,12 +71,22 @@ static void dsp_thread() { // FFT for(size_t i=0;i= 100ms) { + float freq_peak_local; + freq_peak_local = 40.0f*float(distance(frames_mag.begin(), max_element(frames_mag.begin(), frames_mag.end())))/float(len); + freq_peak = freq_peak_local; // FIXME: net::write seems unimplemented as of libstdc++ 13 - tec_socket.write_some(net::buffer(std::format(":SOUR2:VOLT {:.3f}\n", 0.1))); + float freq_error = freq_peak_local - freq_setpoint; + tec_socket.write_some(net::buffer(std::format(":SOUR2:VOLT {:.3f}\n", + std::min(tec_bias+tec_p*freq_error, 0.0f)))); last_tec += 100ms; } @@ -80,9 +96,9 @@ static void dsp_thread() { std::memmove(&waterfall_data[waterfall_width], &waterfall_data[0], sizeof(int)*waterfall_width*(waterfall_height - 1)); for(int i=0;i