1
0
Fork 0

Very slight speed improvement in FIR filters.

This commit is contained in:
Joris van Rantwijk 2013-12-31 15:19:14 +01:00
parent cecf407d00
commit 47525ef796
1 changed files with 15 additions and 10 deletions

View File

@ -109,22 +109,27 @@ void LowPassFilterFirIQ::process(const IQSampleVector& samples_in,
if (n == 0) if (n == 0)
return; return;
// NOTE: We use m_coeff the wrong way around because it is slightly
// faster to scan forward through the array. The result is still correct
// because the coefficients are symmetric.
// The first few samples need data from m_state. // The first few samples need data from m_state.
unsigned int i = 0; unsigned int i = 0;
for (; i < n && i < order; i++) { for (; i < n && i < order; i++) {
IQSample y(0); IQSample y = 0;
for (unsigned int j = 0; j <= i; j++) for (unsigned int j = 0; j < order - i; j++)
y += samples_in[i-j] * m_coeff[j]; y += m_state[i+j] * m_coeff[j];
for (unsigned int j = i + 1; j <= order; j++) for (unsigned int j = order - i; j <= order; j++)
y += m_state[order + i - j] * m_coeff[j]; y += samples_in[i-order+j] * m_coeff[j];
samples_out[i] = y; samples_out[i] = y;
} }
// Remaining samples only need data from samples_in. // Remaining samples only need data from samples_in.
for (; i < n; i++) { for (; i < n; i++) {
IQSample y(0); IQSample y = 0;
IQSampleVector::const_iterator inp = samples_in.begin() + i - order;
for (unsigned int j = 0; j <= order; j++) for (unsigned int j = 0; j <= order; j++)
y += samples_in[i-j] * m_coeff[j]; y += inp[j] * m_coeff[j];
samples_out[i] = y; samples_out[i] = y;
} }
@ -182,7 +187,7 @@ void DownsampleFilter::process(const SampleVector& samples_in,
unsigned int i = 0; unsigned int i = 0;
for (; p < n && p < order; p += pstep, i++) { for (; p < n && p < order; p += pstep, i++) {
Sample y = 0; Sample y = 0;
for (unsigned int j = 0; j <= p; j++) for (unsigned int j = 1; j <= p; j++)
y += samples_in[p-j] * m_coeff[j]; y += samples_in[p-j] * m_coeff[j];
for (unsigned int j = p + 1; j <= order; j++) for (unsigned int j = p + 1; j <= order; j++)
y += m_state[order+p-j] * m_coeff[j]; y += m_state[order+p-j] * m_coeff[j];
@ -192,7 +197,7 @@ void DownsampleFilter::process(const SampleVector& samples_in,
// Remaining samples only need data from samples_in. // Remaining samples only need data from samples_in.
for (; p < n; p += pstep, i++) { for (; p < n; p += pstep, i++) {
Sample y = 0; Sample y = 0;
for (unsigned int j = 0; j <= order; j++) for (unsigned int j = 1; j <= order; j++)
y += samples_in[p-j] * m_coeff[j]; y += samples_in[p-j] * m_coeff[j];
samples_out[i] = y; samples_out[i] = y;
} }