vivilyly 发表于 2024-11-30 21:49

AD8032的滤波算法

AD8032的滤波算法并提供软件截图

gaochy1126 发表于 2024-11-30 21:51

AD8032的滤波算法

/data/attachment/album/202411/30/215112k7unofj7wfu9sfsj.jpeg

#include "FIRfilterPtByPt.h"

/**
* \brief   Function used for initialization FIR filter structure used for filtering
* \param   signalBufferLength    Length of cyclic buffer storing signal
* \param   signalCyclicBuffer[]   Cyclic buffer storing signal
* \param   coeffLength            Number of filter coefficients
* \param   coefficients[]            Filter coefficients
* \return      FIRfilterObject          FIR filter structure
*/
FIRfilterObject CreateFIRfilterObject(uint16_t signalBufferLength, float signalCyclicBuffer[], uint16_t coeffLength, float coefficients[])
{
                FIRfilterObject _FIRfilterObject;
                _FIRfilterObject.coefficients = &coefficients;
                _FIRfilterObject.coefficientsLength = coeffLength;
                _FIRfilterObject.signalBuffer = &signalCyclicBuffer;
                _FIRfilterObject.signalBufferHead = 0;
                _FIRfilterObject.signalBufferLength = signalBufferLength;
                _FIRfilterObject.signalBufferMask = signalBufferLength - 1;
               
        //======= Zero out signalBuffer values=======//
                uint16_t i;
                uint16_t counterBy8 = _FIRfilterObject.signalBufferLength >> 3;//Division by 8
                uint16_t remainder = _FIRfilterObject.signalBufferLength - ((_FIRfilterObject.signalBufferLength >> 3) << 3);// % 8
                float* signalBufferPtr = &_FIRfilterObject.signalBuffer;
       
                for(i=0; i<counterBy8; i++)
                {
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                                *signalBufferPtr++ = 0.0f;
                }
               
                for(i=0; i<remainder; i++)
                {
                                *signalBufferPtr++ = 0.0f;
                }
        //===================================//
               
                return _FIRfilterObject;
}

/**
* \brief   Function filtering input signal point-by-point
* \param   filterObject    Pointer to FIR filter structure
* \param   signal         One sample of input signal
* \param   result            Result of filtering
*/
void FIRfilterPtByPt(FIRfilterObject* filterObject, float signal, float* result)
{
    *result = 0;
    filterObject->signalBuffer = signal;
    float* coefficientsPtr;
    coefficientsPtr        = &filterObject->coefficients;
    float* signalPtr;
    signalPtr        = &filterObject->signalBuffer;
    int16_t i;
    int16_t counterBy8;
    int16_t remainder;
       
                if( filterObject->signalBufferHead >=filterObject->coefficientsLength)
                {
      counterBy8 = filterObject->coefficientsLength >> 3;   //filterObject->coefficientsLength / 8
      remainder = filterObject->coefficientsLength - ((filterObject->coefficientsLength >> 3) << 3);// filterObject->coefficientsLength % 8
                                for(i=0; i<counterBy8; i++)
                                {
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                }
                               
                                for(i=0; i<remainder; i++)
                                {
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                }
                }
                else
                {       
      counterBy8 = filterObject->signalBufferHead >> 3;//filterObject->signalBufferHead / 8
      remainder = filterObject->signalBufferHead - ((filterObject->signalBufferHead >> 3) << 3);// filterObject->signalBufferHead % 8

                                for(i=0; i<counterBy8; i++)
                                {
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                                *result += *signalPtr-- * *coefficientsPtr++;
                                }
                               
      for(i=0; i<remainder; i++)
      {
            *result += *signalPtr-- * *coefficientsPtr++;
      }
                               
      *result += filterObject->signalBuffer * *coefficientsPtr++;
      signalPtr = &filterObject->signalBuffer;
                               
      counterBy8 = filterObject->coefficientsLength - filterObject->signalBufferHead - 1;
      remainder = counterBy8 - ((counterBy8 >> 3) << 3);// counterBy8 % 8
      counterBy8 = counterBy8 >> 3;//counterBy8 / 8
                               
      for(i=0; i<counterBy8; i++)
      {
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
            *result += *signalPtr-- * *coefficientsPtr++;
      }               
                               
      for(i=0; i<remainder; i++)
      {
            *result += *signalPtr-- * *coefficientsPtr++;
      }
    }
       
    filterObject->signalBufferHead = (filterObject->signalBufferHead + 1) & filterObject->signalBufferMask;
}




#include "IIRfilterPtByPt.h"

/**
* \brief   Function used for initialization IIR 2nd order filter structure used for filtering
* \param   forwardCoeff            Filter forward coefficients
* \param   reverseCoeff            Filter reverse coefficients
* \return      IIR2ndOrderFilterObj    IIR 2nd order filter structure
*/
IIR2ndOrderFilterObj IIR_2ndOrderSignalFilteringPtByPtInitialize(float forwardCoeff, float reverseCoeff)
{
    IIR2ndOrderFilterObjIIR2ndOrderFilterObj_;
    IIR2ndOrderFilterObj_.forwardCoeff = forwardCoeff;
    IIR2ndOrderFilterObj_.reverseCoeff = reverseCoeff;

    return IIR2ndOrderFilterObj_;
}

/**
* \brief   Function used for initialization IIR 3rd order filter structure used for filtering
* \param   forwardCoeff            Filter forward coefficients
* \param   reverseCoeff            Filter reverse coefficients
* \return      IIR3rdOrderFilterObj   IIR 3rd order filter structure
*/
IIR3rdOrderFilterObj IIR_3rdOrderSignalFilteringPtByPtInitialize(float forwardCoeff, float reverseCoeff)
{
    IIR3rdOrderFilterObjIIR3rdOrderFilterObj_;
    IIR3rdOrderFilterObj_.forwardCoeff = forwardCoeff;
    IIR3rdOrderFilterObj_.reverseCoeff = reverseCoeff;

    return IIR3rdOrderFilterObj_;
}

/**
* \brief   Function used for initialization IIR 4th order filter structure used for filtering
* \param   forwardCoeff            Filter forward coefficients
* \param   reverseCoeff            Filter reverse coefficients
* \return      IIR4thOrderFilterObj   IIR 4th order filter structure
*/
IIR4thOrderFilterObj IIR_4thOrderSignalFilteringPtByPtInitialize(float forwardCoeff, float reverseCoeff)
{
    IIR4thOrderFilterObjIIR4thOrderFilterObj_;
    IIR4thOrderFilterObj_.forwardCoeff = forwardCoeff;
    IIR4thOrderFilterObj_.reverseCoeff = reverseCoeff;

    return IIR4thOrderFilterObj_;
}

/**
* \brief   Function for recursive Infinite Impulse Response 2nd order filtering of input signal point-by-point
* \warning This IIR filter implemantation can be used only when first reverse coefficient value == 1
* \paramfilterObject       Pointer to structure of 2nd order IIR filter
* \paramsignal               Input signal last sample
* \param result            Output filtered signal sample
*/
void IIR_2ndOrderSignalFilteringPtByPt(IIR2ndOrderFilterObj* filterObject, float signal, float* result)
{
                static float as;         

                filterObject->stateBuffer += signal * filterObject->forwardCoeff;
    filterObject->stateBuffer += signal * filterObject->forwardCoeff;
    filterObject->stateBuffer += signal * filterObject->forwardCoeff;

                as = -filterObject->stateBuffer;

                filterObject->stateBuffer += as * filterObject->reverseCoeff;
    filterObject->stateBuffer += as * filterObject->reverseCoeff;

                *result = filterObject->stateBuffer;

                filterObject->stateBuffer = filterObject->stateBuffer;
    filterObject->stateBuffer = filterObject->stateBuffer;
    filterObject->stateBuffer = 0;
}

/**
* \brief   Function for recursive Infinite Impulse Response 3rd order filtering of input signal point-by-point
* \warning This IIR filter implemantation can be used only when first reverse coefficient value == 1
* \paramfilterObject       Pointer to structure of 3rd order IIR filter
* \paramsignal               Input signal last sample
* \param result            Output filtered signal sample
*/
void IIR_3rdOrderSignalFilteringPtByPt(IIR3rdOrderFilterObj* filterObject, float signal, float* result)
{
                static float as;         

                filterObject->stateBuffer += signal * filterObject->forwardCoeff;
    filterObject->stateBuffer += signal * filterObject->forwardCoeff;
    filterObject->stateBuffer += signal * filterObject->forwardCoeff;
          filterObject->stateBuffer += signal * filterObject->forwardCoeff;

                as = -filterObject->stateBuffer;

                filterObject->stateBuffer += as * filterObject->reverseCoeff;
    filterObject->stateBuffer += as * filterObject->reverseCoeff;
          filterObject->stateBuffer += as * filterObject->reverseCoeff;

                *result = filterObject->stateBuffer;

                filterObject->stateBuffer = filterObject->stateBuffer;
    filterObject->stateBuffer = filterObject->stateBuffer;
    filterObject->stateBuffer = filterObject->stateBuffer;
          filterObject->stateBuffer = 0;
}

/**
* \brief   Function for recursive Infinite Impulse Response 4th order filtering of input signal point-by-point
* \warning This IIR filter implemantation can be used only when first reverse coefficient value == 1
* \paramfilterObject       Pointer to structure of 4th order IIR filter
* \paramsignal               Input signal last sample
* \param result            Output filtered signal sample
*/
void IIR_4thOrderSignalFilteringPtByPt(IIR4thOrderFilterObj* filterObject, float signal, float* result)
{
                static float as;         

                filterObject->stateBuffer += signal * filterObject->forwardCoeff;
    filterObject->stateBuffer += signal * filterObject->forwardCoeff;
    filterObject->stateBuffer += signal * filterObject->forwardCoeff;
          filterObject->stateBuffer += signal * filterObject->forwardCoeff;
          filterObject->stateBuffer += signal * filterObject->forwardCoeff;

                as = -filterObject->stateBuffer;

                filterObject->stateBuffer += as * filterObject->reverseCoeff;
    filterObject->stateBuffer += as * filterObject->reverseCoeff;
          filterObject->stateBuffer += as * filterObject->reverseCoeff;
          filterObject->stateBuffer += as * filterObject->reverseCoeff;

                *result = filterObject->stateBuffer;

                filterObject->stateBuffer = filterObject->stateBuffer;
    filterObject->stateBuffer = filterObject->stateBuffer;
    filterObject->stateBuffer = filterObject->stateBuffer;
          filterObject->stateBuffer = filterObject->stateBuffer;
                filterObject->stateBuffer = 0;
}




页: [1]
查看完整版本: AD8032的滤波算法