Go to the documentation of this file.
23 #define MAX_DATA_ENTRY_LEN_IQ 87
24 #define MAX_DATA_ENTRY_LEN_FLOAT 44
31 if (vector_iq == NULL)
36 vector_iq->
data = malloc(data_length *
sizeof(
float complex));
38 if (vector_iq->
data == NULL)
54 if (vector_float == NULL)
59 vector_float->
data = malloc(data_length *
sizeof(
float));
61 if (vector_float->
data == NULL)
99 if (time_constant_s <= 0.0f)
105 return expf(-1.0f / (time_constant_s * update_rate_hz));
112 return fminf(static_sf, 1.0f - 1.0f / (1.0f + update_count));
120 for (uint32_t i = 0; i < current->
data_length; i++)
122 averaged_data->
data[i] = sf * averaged_data->
data[i] + (1.0f - sf) * current->
data[i];
131 for (uint32_t i = 0; i < current->
data_length; i++)
133 averaged_data->
data[i] = sf * averaged_data->
data[i] + (1.0f - sf) * current->
data[i];
144 for (uint32_t i = 0; i < data_length; i++)
154 assert(point < control_helper_state->proc_meta.sweep_data_length);
158 for (uint32_t i = 0; i < vector_out->
data_length; i++)
168 return (peak_width_points / step_length) | 1;
176 assert(data_length % 2 == 1);
178 uint32_t mid_offset = (data_length + 1) / 2;
181 for (uint32_t i = 0; i < data_length; i++)
185 vector_out->
data[i] = (float)i + 1;
189 vector_out->
data[i] = (float)(data_length - i);
192 sum += vector_out->
data[i];
196 for (uint32_t i = 0; i < data_length; i++)
198 vector_out->
data[i] /= sum;
210 for (uint32_t i = 0; i < vector_out->
data_length; i++)
212 vector_out->
data[i] = 0.0f;
214 for (uint32_t j = 0; j < filter_vector->
data_length; j++)
216 int32_t a_index = i + j - offset;
217 if (a_index >= 0 && (uint32_t)a_index < vector_a->data_length)
219 vector_out->
data[i] += vector_a->
data[a_index] * filter_vector->
data[j];
230 for (uint32_t i = 0; i < vector_a->
data_length; i++)
232 vector_out->
data[i] = vector_a->
data[i];
242 for (uint32_t i = 0; i < vector_a->
data_length; i++)
244 vector_out->
data[i] = vector_a->
data[i] + vector_b->
data[i];
254 for (uint32_t i = 0; i < vector_a->
data_length; i++)
256 vector_out->
data[i] = vector_a->
data[i] - vector_b->
data[i];
266 for (uint32_t i = 0; i < vector_a->
data_length; i++)
268 vector_out->
data[i] = vector_a->
data[i] * vector_b->
data[i];
278 for (uint32_t i = 0; i < vector_a->
data_length; i++)
280 vector_out->
data[i] = vector_a->
data[i] * conjf(vector_b->
data[i]);
287 float complex rotated_unit_vector = cexpf(radians*I);
289 for (uint32_t i = 0; i < vector_a->
data_length; i++)
291 vector_a->
data[i] *= rotated_unit_vector;
298 for (uint32_t i = 0; i < vector_a->
data_length; i++)
300 vector_a->
data[i] = conjf(vector_a->
data[i]);
309 for (uint32_t i = 0; i < vector_a->
data_length; i++)
311 vector_out->
data[i] = cabsf(vector_a->
data[i]);
320 float complex coherent_mean = 0;
322 for (uint32_t i = 0; i < vector_a->
data_length; i++)
324 coherent_mean += vector_a->
data[i];
327 return cabsf(coherent_mean / vector_a->
data_length);
335 float noncoherent_mean_amplitude = 0;
337 for (uint32_t i = 0; i < vector_a->
data_length; i++)
339 noncoherent_mean_amplitude += cabsf(vector_a->
data[i]);
342 return noncoherent_mean_amplitude / vector_a->
data_length;
350 for (uint32_t i = 0; i < vector_a->
data_length; i++)
352 vector_out->
data[i] = cargf(vector_a->
data[i]);
359 float max = -INFINITY;
362 for (uint32_t i = 0; i < vector_a->
data_length; i++)
364 if (vector_a->
data[i] > max)
366 max = vector_a->
data[i];
377 float max = -INFINITY;
380 assert(elemets_to_skip < vector_a->data_length - elemets_to_skip);
382 for (uint32_t i = elemets_to_skip; i < (vector_a->
data_length - elemets_to_skip); i++)
384 if (vector_a->
data[i] > max)
386 max = vector_a->
data[i];
397 return (y1 - y3) / (2.0f * y1 - 4.0f * y2 + 2.0f * y3);
403 printf(
"%s:\n", label);
407 for (uint16_t i = 0; i < vector_a->
data_length; i++)
409 if ((i > 0) && ((i % 8) == 0))
416 printf(
"%14s ", buffer);
425 printf(
"%s: ", label);
429 for (uint16_t i = 0; i < vector_a->
data_length; i++)
431 if ((i > 0) && ((i % 8) == 0))
440 printf(
"%14s ", buffer);
float acc_processing_helper_dynamic_sf(float static_sf, uint32_t update_count)
Calculate a dynamic smoothing factor.
void acc_vector_iq_apply_filter(const acc_vector_iq_t *vector_a, acc_vector_float_t *filter_vector, acc_vector_iq_t *vector_out)
Apply a FIR filter to an IQ vector.
void acc_vector_iq_amplitude(const acc_vector_iq_t *vector_a, acc_vector_float_t *vector_out)
Amplitude of an IQ vector.
void acc_vector_iq_mult(const acc_vector_iq_t *vector_a, const acc_vector_iq_t *vector_b, acc_vector_iq_t *vector_out)
Multiply two IQ vectors.
#define MAX_DATA_ENTRY_LEN_IQ
Data type for interger-based representation of complex numbers.
void acc_vector_iq_rotate_phase_inline(acc_vector_iq_t *vector_a, float radians)
Rotate the phase of elements in an IQ vector.
void acc_vector_iq_update_exponential_average(const acc_vector_iq_t *current, acc_vector_iq_t *averaged_data, float sf)
Update the exponential average of an IQ vector.
void acc_vector_float_create_depth_filter_vector(acc_vector_float_t *vector_out)
Create a distance filter vector.
void acc_vector_float_update_exponential_average(const acc_vector_float_t *current, acc_vector_float_t *averaged_data, float sf)
Update the exponential average of a float vector.
void acc_get_iq_point_vector(const acc_control_helper_t *control_helper_state, uint32_t point, acc_vector_iq_t *vector_out)
Extract an IQ vector with sweep data for a specific point from a newly captured IQ frame with multipl...
void acc_get_iq_sweep_vector(const acc_control_helper_t *control_helper_state, acc_vector_iq_t *vector_out)
Converts a newly captured IQ frame with one sweep to an IQ vector.
void acc_vector_iq_mult_conj(const acc_vector_iq_t *vector_a, const acc_vector_iq_t *vector_b, acc_vector_iq_t *vector_out)
Multiply first IQ vector with conjugate of second IQ vector.
acc_vector_iq_t * acc_vector_iq_alloc(uint32_t data_length)
Allocate storage for an IQ vector.
void acc_vector_float_print(const char *label, acc_vector_float_t *vector_a)
Print float vector.
uint32_t acc_vector_float_argmax(acc_vector_float_t *vector_a)
Index of element with maximum value in a float vector.
float acc_processing_helper_tc_to_sf(float time_constant_s, float update_rate_hz)
Convert time constant to smoothing factor.
acc_processing_metadata_t proc_meta
float acc_vector_iq_noncoherent_mean_amplitude(const acc_vector_iq_t *vector_a)
Non-coherent mean amplitude of IQ vector.
void acc_vector_iq_add(const acc_vector_iq_t *vector_a, const acc_vector_iq_t *vector_b, acc_vector_iq_t *vector_out)
Add two IQ vectors.
float acc_vector_iq_coherent_mean_amplitude(const acc_vector_iq_t *vector_a)
Coherent mean amplitude of IQ vector.
void acc_vector_iq_subtract(const acc_vector_iq_t *vector_a, const acc_vector_iq_t *vector_b, acc_vector_iq_t *vector_out)
Subtract two IQ vectors.
void acc_vector_iq_free(acc_vector_iq_t *vector)
Free storage of data elements in an IQ vector.
acc_vector_float_t * acc_vector_float_alloc(uint32_t data_length)
Allocate storage for a float vector.
float acc_processing_helper_interpolate_peak_position(float y1, float y2, float y3)
Interpolate peak position.
void acc_vector_iq_phase(const acc_vector_iq_t *vector_a, acc_vector_float_t *vector_out)
Phase of an IQ vector.
acc_int16_complex_t * frame
#define ACC_LOG_FLOAT_TO_INTEGER(a)
void acc_vector_iq_print(const char *label, acc_vector_iq_t *vector_a)
Print IQ vector.
void acc_vector_float_free(acc_vector_float_t *vector)
Free storage of data elements in a float vector.
void acc_vector_iq_copy(const acc_vector_iq_t *vector_a, acc_vector_iq_t *vector_out)
Copy an IQ vector.
uint32_t acc_processing_helper_get_filter_length(uint32_t peak_width_points, uint32_t step_length)
Calculate filter vector length.
#define PRIfloat
Specifier for printing float type using integers.
uint32_t acc_vector_float_argmax_skip_edges(acc_vector_float_t *vector_a, uint32_t elemets_to_skip)
Index of element with maximum value in a float vector disregarding edge elements.
#define MAX_DATA_ENTRY_LEN_FLOAT
acc_processing_result_t proc_result
void acc_vector_iq_conj_inline(acc_vector_iq_t *vector_a)
Update an IQ vector with its conjugate.