Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3b65796 authored by Rivukanta Bhattacharya's avatar Rivukanta Bhattacharya
Browse files

Biquad filter integration to LVM : Initial changes

Bug: 120944950
Test: lvmtest
Change-Id: Iffabb7e630749fd5450e6884e9a4f7549022cae7
parent 3fb5f496
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -131,12 +131,15 @@ cc_library_static {
    shared_libs: [
        "liblog",
    ],
    static_libs: [
        "libaudioutils",
    ],
    header_libs: [
        "libhardware_headers",
    ],
    cppflags: [
        "-DBIQUAD_OPT",
        "-fvisibility=hidden",

        "-Wall",
        "-Werror",
    ],
+20 −0
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@
/*                                                                                      */
/****************************************************************************************/

#ifdef BIQUAD_OPT
#include <audio_utils/BiquadFilter.h>
#endif
#include "LVDBE.h"
#include "LVDBE_Private.h"
#include "VectorArithmetic.h"
@@ -107,12 +110,20 @@ void LVDBE_SetFilters(LVDBE_Instance_t* pInstance, LVDBE_Params_t* pParams) {
    /*
     * Setup the high pass filter
     */
#ifdef BIQUAD_OPT
    std::array<LVM_FLOAT, android::audio_utils::kBiquadNumCoefs> coefs = {
            LVDBE_HPF_Table[Offset].A0, LVDBE_HPF_Table[Offset].A1, LVDBE_HPF_Table[Offset].A2,
            -(LVDBE_HPF_Table[Offset].B1), -(LVDBE_HPF_Table[Offset].B2)};
    pInstance->pBqInstance
            ->setCoefficients<std::array<LVM_FLOAT, android::audio_utils::kBiquadNumCoefs>>(coefs);
#else
    LoadConst_Float(0,                                      /* Clear the history, value 0 */
                    (LVM_FLOAT*)&pInstance->pData->HPFTaps, /* Destination */
                    sizeof(pInstance->pData->HPFTaps) / sizeof(LVM_FLOAT)); /* Number of words */
    BQ_2I_D32F32Cll_TRC_WRA_01_Init(&pInstance->pCoef->HPFInstance, /* Initialise the filter */
                                    &pInstance->pData->HPFTaps,
                                    (BQ_FLOAT_Coefs_t*)&LVDBE_HPF_Table[Offset]);
#endif

    /*
     * Setup the band pass filter
@@ -275,6 +286,15 @@ LVDBE_ReturnStatus_en LVDBE_Control(LVDBE_Handle_t hInstance, LVDBE_Params_t* pP
    LVDBE_Instance_t* pInstance = (LVDBE_Instance_t*)hInstance;
    LVMixer3_2St_FLOAT_st* pBypassMixer_Instance = &pInstance->pData->BypassMixer;

#ifdef BIQUAD_OPT
    /*
     * Create biquad instance
     */
    pInstance->pBqInstance.reset(
            new android::audio_utils::BiquadFilter<LVM_FLOAT>(pParams->NrChannels));
    pInstance->pBqInstance->clear();
#endif

    /*
     * Update the filters
     */
+8 −0
Original line number Diff line number Diff line
@@ -94,6 +94,14 @@ LVDBE_ReturnStatus_en LVDBE_Init(LVDBE_Handle_t* phInstance, LVDBE_Capabilities_
        return LVDBE_NULLADDRESS;
    }

#ifdef BIQUAD_OPT
    /*
     * Create biquad instance
     */
    pInstance->pBqInstance.reset(
            new android::audio_utils::BiquadFilter<LVM_FLOAT>(LVM_MAX_CHANNELS));
#endif

    /*
     * Initialise the filters
     */
+11 −0
Original line number Diff line number Diff line
@@ -33,6 +33,9 @@
/*                                                                                      */
/****************************************************************************************/

#ifdef BIQUAD_OPT
#include <audio_utils/BiquadFilter.h>
#endif
#include "LVDBE.h" /* Calling or Application layer definitions */
#include "BIQUAD.h"
#include "LVC_Mixer.h"
@@ -63,7 +66,9 @@ typedef struct {
    AGC_MIX_VOL_2St1Mon_FLOAT_t AGCInstance; /* AGC instance parameters */

    /* Process variables */
#ifndef BIQUAD_OPT
    Biquad_2I_Order2_FLOAT_Taps_t HPFTaps; /* High pass filter taps */
#endif
    Biquad_1I_Order2_FLOAT_Taps_t BPFTaps; /* Band pass filter taps */
    LVMixer3_1St_FLOAT_st BypassVolume;    /* Bypass volume scaler */
    LVMixer3_2St_FLOAT_st BypassMixer;     /* Bypass Mixer for Click Removal */
@@ -73,7 +78,9 @@ typedef struct {
/* Coefs structure */
typedef struct {
    /* Process variables */
#ifndef BIQUAD_OPT
    Biquad_FLOAT_Instance_t HPFInstance; /* High pass filter instance */
#endif
    Biquad_FLOAT_Instance_t BPFInstance; /* Band pass filter instance */
} LVDBE_Coef_FLOAT_t;
/* Instance structure */
@@ -86,6 +93,10 @@ typedef struct {
    LVDBE_Data_FLOAT_t* pData; /* Instance data */
    LVDBE_Coef_FLOAT_t* pCoef; /* Instance coefficients */
    void* pScratch;            /* scratch pointer */
#ifdef BIQUAD_OPT
    std::unique_ptr<android::audio_utils::BiquadFilter<LVM_FLOAT>>
            pBqInstance; /* Biquad filter instance */
#endif
} LVDBE_Instance_t;

/****************************************************************************************/
+7 −0
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@
/*    Includes                                                                          */
/*                                                                                      */
/****************************************************************************************/
#ifdef BIQUAD_OPT
#include <audio_utils/BiquadFilter.h>
#endif

#include <string.h>  // memset
#include "LVDBE.h"
@@ -125,10 +128,14 @@ LVDBE_ReturnStatus_en LVDBE_Process(
         * Apply the high pass filter if selected
         */
        if (pInstance->Params.HPFSelect == LVDBE_HPF_ON) {
#ifdef BIQUAD_OPT
            pInstance->pBqInstance->process(pScratch, pScratch, NrFrames);
#else
            BQ_MC_D32F32C30_TRC_WRA_01(&pInstance->pCoef->HPFInstance, /* Filter instance      */
                                       pScratch,                       /* Source               */
                                       pScratch,                       /* Destination          */
                                       (LVM_INT16)NrFrames, (LVM_INT16)NrChannels);
#endif
        }

        /*