MeshTalos-Client/managed_components/espressif__esp-dsp/modules/fir/include/dsps_resampler.h
2025-12-03 14:20:11 +08:00

133 lines
5 KiB
C

/*
* SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _dsps_resampl_H_
#define _dsps_resampl_H_
#include "dsp_err.h"
#include "dsps_fir.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* @brief Data struct of f32 multi-rate resampler
*
* This structure is used by a resampler internally. A user should access this structure only in case of
* extensions for the DSP Library.
* To initialize the resampler, use the dsps_resampler_mr_init() function.
* To execute the resampler, use the dsps_resampler_mr_exec() function.
* To free the resampler, use the dsps_resampler_mr_free() function.
*/
typedef struct dsps_resample_mr_s {
void *filter; /*!< FIR filter structure*/
float samplerate_factor; /*!< Sample rate factor */
int16_t decim_c; /*!< Decimation factor for ceil */
int16_t decim_f; /*!< Decimation factor for floor */
int16_t active_decim; /*!< Active decimation factor */
float decim_avg_in; /*!< Average decimation factor for input */
float decim_avg_out; /*!< Average decimation factor for output */
int32_t (*dsps_firmr)(void *fir, void *input, void *output, int32_t length); /*!< Pointer to FIR filter function */
int32_t fixed_point; /*!< Fixed point flag */
} dsps_resample_mr_t;
/**
* @brief Data struct of f32 poly-phase resampler
*
* This structure is used by a poly-phase resampler internally. A user should access this structure only in case of
* extensions for the DSP Library.
* To initialize the resampler, use the dsps_resampler_ph_init() function.
* To execute the resampler, use the dsps_resampler_ph_exec() function.
*
* It is possible to correct the sample rate by adjust the phase parameter "on the fly".
*/
typedef struct dsps_resample_ph_s {
float phase;
float step;
float delay[4];
int delay_pos;
} dsps_resample_ph_t;
/**
* @brief Initialize the multi-rate resampler
*
* @param resampler Pointer to the resampler structure
* @param coeffs Pointer to the filter coefficients (float or int16_t for fixed point)
* @param length Length of the filter coefficients
* @param interp Interpolation factor for the filter
* @param samplerate_factor Sample rate factor
* @param fixed_point Fixed point flag, 0 for float, 1 for fixed point
* @param shift Shift value for fixed point
*
* @return ESP_OK on success, ESP_ERR_INVALID_ARG if the parameters are invalid
*/
esp_err_t dsps_resampler_mr_init(dsps_resample_mr_t *resampler, void *coeffs, int16_t length, int16_t interp, float samplerate_factor, int32_t fixed_point, int16_t shift);
/**
* @brief Execute the multi-rate resampler
*
* This function executes the multi-rate resampler. The input and output buffers can be the same.
* The function based on multi-rate FIR filter.
* The decimation factor is updated for each execution. The current decimation factor calculated
* as division of average input and average output sample rate.
* To correct the output sample rate, the length_correction parameter is used. To increase
* the output sample rate, the length_correction parameter should be positive. To decrease
* the output sample rate, the length_correction parameter should be negative. This parameter
* is used when the input and output sample rates are comes from different sources.
*
* @param resampler: Pointer to the resampler structure
* @param input: Pointer to the input buffer
* @param output: Pointer to the output buffer
* @param length: Length of the input buffers
* @param length_correction: Length correction for the current execution. Positive value
* increases the output sample rate, negative value decreases
* the output sample rate.
*
* @return Length of the output buffer
*/
int32_t dsps_resampler_mr_exec(dsps_resample_mr_t *resampler, void *input, void *output, int32_t length, int32_t length_correction);
/**
* @brief Free the multi-rate resampler
*
* @param resampler Pointer to the resampler structure
*/
void dsps_resampler_mr_free(dsps_resample_mr_t *resampler);
/**
* @brief Initialize the poly-phase resampler
*
* The poly-phase resampler is a implementation of the poly-phase Farrow filter
* that use cubic interpolation with 4 coefficients.
*
* @param resampler Pointer to the resampler structure
* @param samplerate_factor Sample rate factor
*
* @return ESP_OK on success, ESP_ERR_INVALID_ARG if the parameters are invalid
*/
esp_err_t dsps_resampler_ph_init(dsps_resample_ph_t *resampler, float samplerate_factor);
/**
* @brief Execute the poly-phase resampler
*
* @param resampler Pointer to the resampler structure
* @param input Pointer to the input buffer
* @param output Pointer to the output buffer
* @param length Length of the input buffer
*
* @return Length of the output buffer
*/
int32_t dsps_resampler_ph_exec(dsps_resample_ph_t *resampler, float *input, float *output, int32_t length);
#ifdef __cplusplus
}
#endif
#endif //_dsps_resampl_H_