AD8032的滤波算法
AD8032的滤波算法并提供软件截图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]