133 lines
5 KiB
C
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_
|