mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-19 00:13:21 +08:00
240 lines
7.2 KiB
C
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__
|