Files
zTC1/mico-os/platform/MCU/MX1101/peripherals/Libraries/inc/eq.h
2025-03-11 15:54:45 +08:00

240 lines
7.2 KiB
C

/**
**************************************************************************************
* @file eq.h
* @brief EQ part of CODEC
*
* @author Aissen Li
* @version V5.5.0
*
* $Created: 2012-10-22 15:39:09$
*
* © Shanghai Mountain View Silicon Technology Co.,Ltd. All rights reserved.
**************************************************************************************
*/
#ifndef __EQ_H__
#define __EQ_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "type.h"
#define SW_EQ_PROC_FRAME_SAMPLES (192)
#define MAX_SW_EQ_FILTERS_COUNT (10 )
#define MAX_SW_EQ_FILTER_ORDER (3 )
/**
* @brief EQ filter type set
*/
typedef enum _EQ_FILTER_TYPE_SET
{
EQ_FILTER_TYPE_UNKNOW = -1,
EQ_FILTER_TYPE_PEAKING,
EQ_FILTER_TYPE_LOW_SHELF,
EQ_FILTER_TYPE_HIGH_SHELF,
EQ_FILTER_TYPE_LOW_PASS,
EQ_FILTER_TYPE_HIGH_PASS,
EQ_FILTER_TYPE_BAND_PASS
} EQ_FILTER_TYPE_SET;
/**
* @brief EQ filter parameters struct
*/
typedef struct _EqFilterParams
{
int16_t type; /**< filter type, @see EQ_FILTER_TYPE_SET */
uint16_t f0; /**< center frequency (peak) or mid-point frequency (shelf) */
int16_t Q; /**< quality factor (peak) or slope (shelf), format: Q6.10 */
uint16_t sqrtA; /**< Sqrt root value of Amplitude, Gain = 20*log10(A*A), format: Q6.10 */
} EqFilterParams;
/**
* @brief EQ filter coefficients saved as: [b0][b1][b2][a1][a2], [a0] equal to 1.0
*/
typedef struct _EqFilterCoefs
{
int32_t b0: 32;
int32_t b1: 32;
int32_t b2: 32;
int32_t a1: 32;
int32_t a2: 32;
int32_t : 0;
} EqFilterCoefs;
/**
* @brief Configure EQ style parameters
* @param SamplingRate sample rate8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 are supported.
* @param FilterParams EQ style filters parameters
* @param FilterNum EQ style filters count, the value can be 0~5
* @param PreGain EQ style pre-gain, magnitude value, data format Q3.16,
* value range 0x0000~0x7FFFF, convert dB vale is 20*log10(PreGain/2^16) dB,
* 0x00000 means MUTE !
* 0x04000 convert dB vale is -12.04 dB
* 0x08000 convert dB vale is -6.02 dB
* 0x10000 convert dB vale is 0 dB
* 0x7FFFF convert dB vale is 18.06 dB
* @return NONE
*/
void EqStyleConfigure(uint16_t SamplingRate, EqFilterParams* FilterParams, uint32_t FilterNum, uint32_t PreGain);
/**
* @brief Set EQ style pre-gain
* @param PreGain EQ style pre-gain, magnitude value, data format Q3.16,
* value range 0x0000~0x7FFFF, convert dB vale is 20*log10(PreGain/2^16) dB,
* 0x00000 means MUTE !
* 0x04000 convert dB vale is -12.04 dB
* 0x08000 convert dB vale is -6.02 dB
* 0x10000 convert dB vale is 0 dB
* 0x7FFFF convert dB vale is 18.06 dB
* @return NONE
*/
void EqPreGainSet(uint32_t PreGain);
/**
* @brief Get EQ style pre-gain
* @return PreGain EQ style pre-gain, magnitude value, data format Q3.16,
* value range 0x0000~0x7FFFF, convert dB vale is 20*log10(PreGain/2^16) dB,
* 0x00000 means MUTE !
* 0x04000 convert dB vale is -12.04 dB
* 0x08000 convert dB vale is -6.02 dB
* 0x10000 convert dB vale is 0 dB
* 0x7FFFF convert dB vale is 18.06 dB
* @return NONE
*/
uint32_t EqPreGainGet(void);
/**
* @brief Enable EQ
* @param None
* @return None
*/
void EqEnable(void);
/**
* @brief Disable EQ
* @param None
* @return None
*/
void EqDisable(void);
/**
* @brief Check whether eq is enabled
* @param NONE
* @return TRUE:enable, FALSE:disable
*/
bool EqIsUsed(void);
/**
* @brief Clear hardware EQ delay buffer
* @param None
* @return None
*/
void EqRamClear(void);
/***********************************************************************************************
* The Following Code is Software EQ API definition.
***********************************************************************************************/
typedef struct _SwEqContext
{
int16_t FiltersCount;
int16_t WorkStatus;
int32_t FiltersHistoryDataX[MAX_SW_EQ_FILTERS_COUNT][2/*#Channel*/][MAX_SW_EQ_FILTER_ORDER - 1];
int32_t FiltersHistoryDataY[MAX_SW_EQ_FILTERS_COUNT][2/*#Channel*/][MAX_SW_EQ_FILTER_ORDER - 1];
uint32_t PreGain;
EqFilterCoefs FiltersCoefs[MAX_SW_EQ_FILTERS_COUNT];
}SwEqContext;
typedef struct _SwEqWorkBuffer
{
int32_t PcmBuffer[SW_EQ_PROC_FRAME_SAMPLES];
}SwEqWorkBuffer;
/**
* @brief Software EQ initialize
* @param SwEQ Software EQ context pointer
* @return None
*/
void SwEqInit(SwEqContext* SwEQ);
/**
* @brief Configure software EQ style parameters
* @param SwEQ software EQ context pointer
* @param SamplingRate sample rate, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 are supported.
* @param FilterParams EQ style filters parameters
* @param FilterNum EQ style filters count, value can be 0~MAX_SW_EQ_FILTERS_COUNT
* @param PreGain EQ style pre-gain, magnitude value, data format Q3.16,
* value range 0x0000~0x7FFFF, convert dB vale is 20*log10(PreGain/2^16) dB,
* 0x00000 means MUTE !
* 0x04000 convert dB vale is -12.04 dB
* 0x08000 convert dB vale is -6.02 dB
* 0x10000 convert dB vale is 0 dB
* 0x7FFFF convert dB vale is 18.06 dB
* @return NONE
*/
void SwEqStyleConfigure(SwEqContext* SwEQ, uint16_t SamplingRate, EqFilterParams* FilterParams, uint32_t FilterNum, uint32_t PreGain);
/**
* @brief Apply software EQ
* @param SwEQ Software EQ context pointer
* @param Buffer Software EQ work buffer pointer, this buffer can be free after calling function SwEqApply done.
* @param PcmDataInOut Address for both input and output pcm samples
* @param PcmSamplesCount Pcm samples count, value can be 0~SW_EQ_PROC_FRAME_SAMPLES
* @param NumChannels Number of pcm samples channels, value can be 1 or 2
* @return NONE
*/
void SwEqApply(SwEqContext* SwEQ, SwEqWorkBuffer* Buffer, int16_t* PcmDataInOut, int32_t PcmSamplesCount, int32_t NumChannels);
/**
* @brief Set software EQ style pre-gain
* @param SwEQ Software EQ context pointer
* @param PreGain software EQ style pre-gain, magnitude value, data format Q3.16,
* value range 0x0000~0x7FFFF, convert dB vale is 20*log10(PreGain/2^16) dB,
* 0x00000 means MUTE !
* 0x04000 convert dB vale is -12.04 dB
* 0x08000 convert dB vale is -6.02 dB
* 0x10000 convert dB vale is 0 dB
* 0x7FFFF convert dB vale is 18.06 dB
* @return NONE
*/
void SwEqPreGainSet(SwEqContext* SwEQ, uint32_t PreGain);
/**
* @brief Clear software EQ delay buffer
* @param SwEQ Software EQ context pointer
* @return None
*/
void SwEqRamClear(SwEqContext* SwEQ);
/**
* @brief Enable software EQ
* @param SwEQ Software EQ context pointer
* @return None
*/
void SwEqEnable(SwEqContext* SwEQ);
/**
* @brief Disable software EQ
* @param SwEQ Software EQ context pointer
* @return None
*/
void SwEqDisable(SwEqContext* SwEQ);
/**
* @brief Check if software EQ is working
* @param SwEQ Software EQ context pointer
* @return None
*/
bool SwEqIsEnabled(SwEqContext* SwEQ);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif//__EQ_H__