example_processing_coherent_mean.c

example_processing_coherent_mean.c Example program that shows how to calculate the coherent mean of the values in an A121 sparse IQ frame with multiple sweeps.

// Copyright (c) Acconeer AB, 2022-2023
// All rights reserved
// This file is subject to the terms and conditions defined in the file
// 'LICENSES/license_acconeer.txt', (BSD 3-Clause License) which is part
// of this source code package.
/** \example example_processing_coherent_mean.c
* @brief example_processing_coherent_mean.c
* Example program that shows how to calculate the coherent mean of the values in
* an A121 sparse IQ frame with multiple sweeps.
*/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "acc_config.h"
#include "acc_hal_definitions_a121.h"
#include "acc_hal_integration_a121.h"
#include "acc_integration_log.h"
#include "acc_rss_a121.h"
#include "acc_version.h"
#include "acc_processing_helpers.h"
#define SENSOR_ID (1U)
#define SWEEPS_PER_FRAME 16
static void update_configuration(acc_config_t *config);
int acconeer_main(int argc, char *argv[]);
int acconeer_main(int argc, char *argv[])
{
(void)argc;
(void)argv;
acc_control_helper_t control_helper_state = {0};
printf("Acconeer software version %s\n", acc_version_get());
const acc_hal_a121_t *hal = acc_hal_rss_integration_get_implementation();
if (!acc_rss_hal_register(hal))
{
return EXIT_FAILURE;
}
bool res = acc_control_helper_create(&control_helper_state, SENSOR_ID);
if (!res)
{
printf("acc_control_helper_create() failed\n");
return EXIT_FAILURE;
}
update_configuration(control_helper_state.config);
res = acc_control_helper_activate(&control_helper_state);
if (!res)
{
printf("acc_control_helper_activate() failed\n");
acc_control_helper_destroy(&control_helper_state);
return EXIT_FAILURE;
}
uint32_t sweep_data_length = control_helper_state.proc_meta.sweep_data_length;
uint32_t point_vector_length = SWEEPS_PER_FRAME;
acc_vector_float_t *current_sweep_coherent_mean_amplitude = acc_vector_float_alloc(sweep_data_length);
acc_vector_iq_t *point_vector = acc_vector_iq_alloc(point_vector_length);
bool mem_ok = (current_sweep_coherent_mean_amplitude != NULL) && (point_vector != NULL);
if (!mem_ok)
{
printf("Memory allocation for vectors failed\n");
}
else
{
uint32_t iterations = 25U;
for (uint32_t i = 0U; i < iterations; i++)
{
if (!acc_control_helper_get_next(&control_helper_state))
{
printf("acc_control_helper_get_next() failed\n");
break;
}
// The acc_vector_iq_coherent_mean calculates the coherent mean by taking the mean value
// of the complex vector elements and then return the absabsolute value of the mean
// coherent mean = (z=0..n) sqrt(mean(real(z))^2 + mean(imag(z))^2)
for (uint32_t p = 0U; p < sweep_data_length; p++)
{
acc_get_iq_point_vector(&control_helper_state, p, point_vector);
current_sweep_coherent_mean_amplitude->data[p] = acc_vector_iq_coherent_mean_amplitude(point_vector);
}
acc_vector_float_print("Coherent mean amplitude", current_sweep_coherent_mean_amplitude);
uint32_t max_peak_index = acc_vector_float_argmax(current_sweep_coherent_mean_amplitude);
printf("Highest peak index: %" PRIu32 ", peak ampliude %" PRIfloat "\n",
max_peak_index,
ACC_LOG_FLOAT_TO_INTEGER(current_sweep_coherent_mean_amplitude->data[max_peak_index]));
}
}
acc_vector_iq_free(point_vector);
acc_vector_float_free(current_sweep_coherent_mean_amplitude);
acc_control_helper_destroy(&control_helper_state);
printf("Application finished OK\n");
return EXIT_SUCCESS;
}
static void update_configuration(acc_config_t *config)
{
int32_t start_point = 100; // start at 250 mm
uint16_t step_length = 2; // 2*2.5 mm = 5 mm
uint16_t num_points = 100; // range length 2*100*2.5 mm = 500 mm
acc_config_start_point_set(config, start_point);
acc_config_num_points_set(config, num_points);
acc_config_step_length_set(config, step_length);
acc_config_profile_set(config, ACC_CONFIG_PROFILE_2);
acc_config_hwaas_set(config, 30);
// The processing in this example assumes that sweeps_per_frame > 1
acc_config_sweeps_per_frame_set(config, SWEEPS_PER_FRAME);
acc_config_prf_set(config, ACC_CONFIG_PRF_13_0_MHZ);
}
acc_config_start_point_set
void acc_config_start_point_set(acc_config_t *config, int32_t start_point)
Set the starting point of the sweep.
acc_control_helper_create
bool acc_control_helper_create(acc_control_helper_t *radar, acc_sensor_id_t sensor_id)
Create a helper instance.
Definition: acc_control_helper.c:41
acc_rss_a121.h
acc_vector_iq_coherent_mean_amplitude
float acc_vector_iq_coherent_mean_amplitude(const acc_vector_iq_t *vector_a)
Coherent mean amplitude of IQ vector.
Definition: acc_processing_helpers.c:316
acc_get_iq_point_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...
Definition: acc_processing_helpers.c:152
acc_vector_float_free
void acc_vector_float_free(acc_vector_float_t *vector)
Free storage of data elements in a float vector.
Definition: acc_processing_helpers.c:85
acc_vector_iq_free
void acc_vector_iq_free(acc_vector_iq_t *vector)
Free storage of data elements in an IQ vector.
Definition: acc_processing_helpers.c:73
acc_control_helper_t::config
acc_config_t * config
Definition: acc_control_helper.h:25
acc_version.h
SENSOR_ID
#define SENSOR_ID
Definition: example_processing_coherent_mean.c:30
acc_config_profile_set
void acc_config_profile_set(acc_config_t *config, acc_config_profile_t profile)
Set a profile.
acc_config_sweeps_per_frame_set
void acc_config_sweeps_per_frame_set(acc_config_t *config, uint16_t sweeps)
Set sweeps per frame.
acc_vector_float_t::data
float * data
Definition: acc_processing_helpers.h:36
acc_control_helper_destroy
void acc_control_helper_destroy(acc_control_helper_t *radar)
Destroy a helper instance.
Definition: acc_control_helper.c:50
acc_hal_rss_integration_get_implementation
const acc_hal_a121_t * acc_hal_rss_integration_get_implementation(void)
Get hal implementation reference.
Definition: acc_hal_integration_stm32cube_xm.c:166
SWEEPS_PER_FRAME
#define SWEEPS_PER_FRAME
Definition: example_processing_coherent_mean.c:32
acc_vector_iq_t
Definition: acc_processing_helpers.h:27
acconeer_main
int acconeer_main(int argc, char *argv[])
Assembly test example.
Definition: example_processing_coherent_mean.c:41
acc_hal_a121_t
Definition: acc_hal_definitions_a121.h:82
acc_control_helper_t::proc_meta
acc_processing_metadata_t proc_meta
Definition: acc_control_helper.h:32
acc_rss_hal_register
bool acc_rss_hal_register(const acc_hal_a121_t *hal)
Register an integration.
ACC_CONFIG_PRF_13_0_MHZ
@ ACC_CONFIG_PRF_13_0_MHZ
Definition: acc_definitions_a121.h:110
acc_config_hwaas_set
void acc_config_hwaas_set(acc_config_t *config, uint16_t hwaas)
Set the hardware accelerated average samples (HWAAS)
acc_processing_metadata_t::sweep_data_length
uint16_t sweep_data_length
Definition: acc_processing.h:41
acc_hal_integration_a121.h
update_configuration
static void update_configuration(acc_config_t *config)
Definition: example_processing_coherent_mean.c:127
acc_version_get
const char * acc_version_get(void)
Get the version of the Acconeer software.
acc_config_t
struct acc_config acc_config_t
Definition: acc_config.h:26
printf
#define printf
Definition: printf.h:60
acc_config_step_length_set
void acc_config_step_length_set(acc_config_t *config, uint16_t step_length)
Set the step length in a sweep.
acc_config_num_points_set
void acc_config_num_points_set(acc_config_t *config, uint16_t num_points)
Set the number of data points to measure.
acc_hal_definitions_a121.h
acc_processing_helpers.h
acc_vector_float_t
Definition: acc_processing_helpers.h:33
acc_integration_log.h
ACC_LOG_FLOAT_TO_INTEGER
#define ACC_LOG_FLOAT_TO_INTEGER(a)
Definition: acc_integration_log.h:26
acc_vector_iq_alloc
acc_vector_iq_t * acc_vector_iq_alloc(uint32_t data_length)
Allocate storage for an IQ vector.
Definition: acc_processing_helpers.c:27
acc_vector_float_alloc
acc_vector_float_t * acc_vector_float_alloc(uint32_t data_length)
Allocate storage for a float vector.
Definition: acc_processing_helpers.c:50
acc_vector_float_print
void acc_vector_float_print(const char *label, acc_vector_float_t *vector_a)
Print float vector.
Definition: acc_processing_helpers.c:401
acc_control_helper_t
Definition: acc_control_helper.h:23
acc_control_helper_activate
bool acc_control_helper_activate(acc_control_helper_t *radar)
Activate the sensor.
Definition: acc_control_helper.c:81
ACC_CONFIG_PROFILE_2
@ ACC_CONFIG_PROFILE_2
Definition: acc_definitions_a121.h:43
acc_config_prf_set
void acc_config_prf_set(acc_config_t *config, acc_config_prf_t prf)
Set Pulse Repetition Frequency.
acc_config.h
PRIfloat
#define PRIfloat
Specifier for printing float type using integers.
Definition: acc_integration_log.h:31
acc_control_helper_get_next
bool acc_control_helper_get_next(acc_control_helper_t *radar)
Perform a radar measurement and wait for the result.
Definition: acc_control_helper.c:157
acc_vector_float_argmax
uint32_t acc_vector_float_argmax(acc_vector_float_t *vector_a)
Index of element with maximum value in a float vector.
Definition: acc_processing_helpers.c:357