Transceiver52M: Generate delay filter with SSE memory alignment
This requires an additional memcpy() on the signal vector constructor, but allows the interpolation filter to use SSE optimzationed convolution. Signed-off-by: Thomas Tsou <tom@tsou.cc>
This commit is contained in:
parent
92c16df875
commit
2c282f5e12
|
@ -766,44 +766,61 @@ float sinc(float x)
|
||||||
|
|
||||||
bool delayVector(signalVector &wBurst, float delay)
|
bool delayVector(signalVector &wBurst, float delay)
|
||||||
{
|
{
|
||||||
|
int whole, h_len = 20;
|
||||||
int intOffset = (int) floor(delay);
|
float frac;
|
||||||
float fracOffset = delay - intOffset;
|
complex *data;
|
||||||
|
signalVector *h, *shift;
|
||||||
|
signalVector::iterator itr;
|
||||||
|
|
||||||
// do fractional shift first, only do it for reasonable offsets
|
whole = floor(delay);
|
||||||
if (fabs(fracOffset) > 1e-2) {
|
frac = delay - whole;
|
||||||
// create sinc function
|
|
||||||
signalVector sincVector(21);
|
/* Sinc interpolated fractional shift (if allowable) */
|
||||||
sincVector.isRealOnly(true);
|
if (fabs(frac) > 1e-2) {
|
||||||
signalVector::iterator sincBurstItr = sincVector.end();
|
data = (complex *) convolve_h_alloc(h_len);
|
||||||
for (int i = 0; i < 21; i++)
|
h = new signalVector(data, 0, h_len);
|
||||||
*--sincBurstItr = (complex) sinc(M_PI_F*(i-10-fracOffset));
|
h->setAligned(true);
|
||||||
|
h->isRealOnly(true);
|
||||||
signalVector shiftedBurst(wBurst.size());
|
|
||||||
if (!convolve(&wBurst, &sincVector, &shiftedBurst, NO_DELAY))
|
itr = h->end();
|
||||||
|
for (int i = 0; i < h_len; i++)
|
||||||
|
*--itr = (complex) sinc(M_PI_F * (i - h_len / 2 - frac));
|
||||||
|
|
||||||
|
shift = convolve(&wBurst, h, NULL, NO_DELAY);
|
||||||
|
|
||||||
|
delete h;
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
if (!shift)
|
||||||
return false;
|
return false;
|
||||||
wBurst.clone(shiftedBurst);
|
|
||||||
|
wBurst.clone(*shift);
|
||||||
|
delete shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intOffset < 0) {
|
/* Integer sample shift */
|
||||||
intOffset = -intOffset;
|
if (whole < 0) {
|
||||||
|
whole = -whole;
|
||||||
signalVector::iterator wBurstItr = wBurst.begin();
|
signalVector::iterator wBurstItr = wBurst.begin();
|
||||||
signalVector::iterator shiftedItr = wBurst.begin()+intOffset;
|
signalVector::iterator shiftedItr = wBurst.begin() + whole;
|
||||||
|
|
||||||
while (shiftedItr < wBurst.end())
|
while (shiftedItr < wBurst.end())
|
||||||
*wBurstItr++ = *shiftedItr++;
|
*wBurstItr++ = *shiftedItr++;
|
||||||
while (wBurstItr < wBurst.end())
|
while (wBurstItr < wBurst.end())
|
||||||
*wBurstItr++ = 0.0;
|
*wBurstItr++ = 0.0;
|
||||||
}
|
} else {
|
||||||
else {
|
signalVector::iterator wBurstItr = wBurst.end() - 1;
|
||||||
signalVector::iterator wBurstItr = wBurst.end()-1;
|
signalVector::iterator shiftedItr = wBurst.end() - 1 - whole;
|
||||||
signalVector::iterator shiftedItr = wBurst.end()-1-intOffset;
|
|
||||||
while (shiftedItr >= wBurst.begin())
|
while (shiftedItr >= wBurst.begin())
|
||||||
*wBurstItr-- = *shiftedItr--;
|
*wBurstItr-- = *shiftedItr--;
|
||||||
while (wBurstItr >= wBurst.begin())
|
while (wBurstItr >= wBurst.begin())
|
||||||
*wBurstItr-- = 0.0;
|
*wBurstItr-- = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
signalVector *gaussianNoise(int length,
|
signalVector *gaussianNoise(int length,
|
||||||
float variance,
|
float variance,
|
||||||
complex mean)
|
complex mean)
|
||||||
|
|
Loading…
Reference in New Issue