-
Notifications
You must be signed in to change notification settings - Fork 3
/
FIRfilterPtByPt.c
135 lines (120 loc) · 5.16 KB
/
FIRfilterPtByPt.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "FIRfilterPtByPt.h"
/**
* \brief Function used for initialization FIR filter structure used for filtering
* \param[in] signalBufferLength Length of cyclic buffer storing signal
* \param[in] signalCyclicBuffer[] Cyclic buffer storing signal
* \param[in] coeffLength Number of filter coefficients
* \param[in] 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[0];
_FIRfilterObject.coefficientsLength = coeffLength;
_FIRfilterObject.signalBuffer = &signalCyclicBuffer[0];
_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[0];
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[in] filterObject Pointer to FIR filter structure
* \param[in] signal One sample of input signal
* \param[out] result Result of filtering
*/
void FIRfilterPtByPt(FIRfilterObject* filterObject, float signal, float* result)
{
*result = 0;
filterObject->signalBuffer[filterObject->signalBufferHead] = signal;
float* coefficientsPtr;
coefficientsPtr = &filterObject->coefficients[0];
float* signalPtr;
signalPtr = &filterObject->signalBuffer[filterObject->signalBufferHead];
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[0] * *coefficientsPtr++;
signalPtr = &filterObject->signalBuffer[filterObject->signalBufferLength-1];
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;
}