Symbol Synchronizer (polyphase filter bank)

This component recovers symbol timing information using a polyphase filter bank for simultaneous matched filtering and decimation.

Profiling results

Here are the results of some profiling of the SymbolSyncPoly component using oprofile. For information on how to get these or similar results please see the Profiling page.

CPU: P4 / Xeon with 2 hyper-threads, speed 3391.93 MHz (estimated)
Counted GLOBAL_POWER_EVENTS events (time during which processor is not stopped)
with a unit mask of 0x01 (mandatory) count 100000
GLOBAL_POWER_E...|
samples| %|
------------------
216324 37.7020 SymbolSyncPoly
GLOBAL_POWER_E...|
samples| %|
------------------
172100 79.5566 libsigproc.so.0.0.7
20587 9.5167 SymbolSyncPoly
10011 4.6278 libomniORB4.so.0.7
4588 2.1209 libc-2.4.so
2786 1.2879 libstandardInterfaces.so.0.0.6
1885 0.8714 libpthread-2.4.so
1753 0.8104 ld-2.4.so
1474 0.6814 libm-2.4.so
494 0.2284 libstdc++.so.6.0.8
360 0.1664 libomnithread.so.3.2
279 0.1290 anon (tgid:27975 range:0xfc8000-0xfc9000)
4 0.0018 libomniDynamic4.so.0.7
1 4.6e-04 libossieidl.so.0.0.4
1 4.6e-04 libossieparser.so.0.0.4
1 4.6e-04 libxerces-c.so.27.0

Annotating libsigproc.so.0.0.7 produces the following results for the FIRPolyphaseFilterBank filter class (revision 3805). Notice that nearly 75% of the CPU time is spent in computing the dot product.

/*
* Total samples for file : \"/home/jgaeddert/src/SigProc/filters.cpp\"
*
* 144909 84.1394
*/

...

:/// compute filter output from current buffer state using specific filter
:void SigProc::FIRPolyphaseFilterBank::ComputeOutput(
: short &y, // output sample
: unsigned int _b // filter bank index
2196 1.2751 : ) /* SigProc::FIRPolyphaseFilterBank::ComputeOutput(short&, unsigned int) total: 143356 83.2376 */
:{
: // Ensure the requested filter bank index does not exceed the number
: // of filters actually in the bank
425 0.2468 : if ( _b >= Npfb )
: {
: std::cerr << \"ERROR: SigProc::FIRPolyphaseFitlerBank::ComputeOutput, \"
: << \" index exceeds filter bank size (\"
: << _b << \" > \" << Npfb << \")\" << std::endl;
: throw 0;
: }
:
: // Initialize floating point value for output
: /// \\todo make this compatable with FPM
: float yf(0.0f);
:
: // Set B to memory block in filter bank array
: unsigned int B;
25 0.0145 : B = _b*h_len;
:
: // Accumulate (apply filter)
29767 17.2838 : for (unsigned int i=0; i<h_len; i++)
99607 57.8354 : yf += float( v[i] ) * H[B+i];
:
: // Ensure yf is within the scope of short int
3323 1.9295 : if ( yf < SHRT_MIN ) {
: y = SHRT_MIN;
1294 0.7513 : } else if ( yf > SHRT_MAX ) {
: y = SHRT_MAX;
: } else {
3062 1.7779 : y = (short) yf;
: }
:
1990 1.1555 :}






注:SymbolSyncPoly(原文出处,翻译整理仅供参考!)