https://wiki.gnuradio.org/api.php?action=feedcontributions&user=ThomasHabets&feedformat=atomGNU Radio - User contributions [en]2022-12-08T04:11:16ZUser contributionsMediaWiki 1.37.1https://wiki.gnuradio.org/index.php?title=Vector_Sink&diff=12639Vector Sink2022-10-26T12:13:14Z<p>ThomasHabets: correct syntax for Python 3</p>
<hr />
<div>[[Category:Block Docs]]<br />
Stores stream to a vector, useful if you’re running for a short time, for example<br />
in a test. You can access that data using snk.data() after tb.run() has completed.<br />
<br />
So something like:<br />
tb.run()<br />
time.sleep(10)<br />
my_data = tb.my_vec_snk.data()<br />
print("data: ",my_data)<br />
<br />
To extract data from a running flow graph use the probe blocks.<br />
tb.start()<br />
time.sleep(10)<br />
my_data = tb.my_probe_signal.level()<br />
print("data: ",my_data)<br />
<br />
== Parameters ==<br />
; Reserve Memory for Items<br />
: Reserve space in the internal storage for this many items; the internal storage will still grow to accommodate more item if necessary, but setting this to a realistic value can avoid memory allocations during runtime, especially if you know a priori how many items you're going to store.<br />
<br />
== Example Flowgraph ==<br />
<br />
Insert description of flowgraph here, then show a screenshot of the flowgraph and the output if there is an interesting GUI. Currently we have no standard method of uploading the actual flowgraph to the wiki or git repo, unfortunately. The plan is to have an example flowgraph showing how the block might be used, for every block, and the flowgraphs will live in the git repo.<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Block definition<br />
: [https://github.com/gnuradio/gnuradio TODO]</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=Constellation_Object&diff=12599Constellation Object2022-09-30T15:51:35Z<p>ThomasHabets: Clarify dimensionality</p>
<hr />
<div>[[Category:Block Docs]]<br />
GNU Radio supports the creation and use of Constellation objects for many of its digital communications needs. We define these constellations with a set of constellation points in complex space and the symbol mappings to those points. For a constellation that has 4 symbols, it then has log2(4) = 2 bits/symbol. We define this constellation with a list of Constellation Points and Symbol Map. For example, 16QAM would have:<br />
<br />
Constellation Points = [(-3-3j), (-1-3j), (1-3j), (3-3j), (-3-1j), (-1-1j), (1-1j), (3-1j), (-3+1j), (-1+1j), (1+1j), (3+1j), (-3+3j), (-1+3j), (1+3j), (3+3j)]<br />
Symbol Map = [0, 4, 12, 8, 1, 5, 13, 9, 3, 7, 15, 11, 2, 6, 14, 10]<br />
<br />
The mapping is a 1-to-1 for the items in both lists. The symbols are referred to as the 'pre_diff_code' since this is the mapping before the application of differential modulation, if used.<br />
<br />
See [https://www.gnuradio.org/doc/doxygen/page_digital.html] for more info.<br />
<br />
== Parameters ==<br />
<br />
; Constellation Type<br />
: Type of modulation scheme. Choose Variable Constellation for more control.<br />
<br />
; Soft Decisions Precision<br />
: Specifies how accurate the look up table (LUT) is to a given number of bits.<br />
<br />
; Soft Decisions LUT<br />
: Vector of floating point tuples that acts as the look up table (LUT). Can be set to 'auto' for GNU Radio to populate it. <br />
<br />
; Symbol Map<br />
: (Available when using Variable Constellation) Manually specify the symbol map (in pre-diff values) in list form. For manually defined symbols in QPSK, symbols start in quadrant 1 and proceeding counterclockwise (standardvalues are sometimes in different order). 8PSK symbols start at (0.92,0.38) and proceed in the nonsensical order of Pi/8 times: 1, 7, 15, 9, 3, 5, 13, 11. So symbols [0,1,2,3,4,5,6,7] become 0, 4, 5, 1, 3, 7, 6, 2, counterclockwise from (0.92,0.38).<br />
<br />
; Constellation Points<br />
: (Available when using Variable Constellation) Manually specify the constellation points, using a list of complex numbers. <br />
<br />
; Rotational Symmetry<br />
: (Available when using Variable Constellation) The number of rotations per 360 degrees that the constellation is symmetric, which is 4 for the common constellations. This doesn't affect the encoding / decoding, but allows unit tests and potentially other blocks to know if decodes will work for rotated constellations.<br />
<br />
; Dimensionality<br />
: (Available when using Variable Constellation) The number of dimensions, typically set to 1. Dimensionality is the number of imput samples per symbol, all of which should be close to the constellation point. I.e. if greater than 1 these should **not** be samples for a smooth transition between constellation points, but will de facto be treated as an averaged for symbol selection.<br />
<br />
; Normalization Type<br />
: Optionally normalize the average amplitude or power of the constellation points around 1.<br />
<br />
== Example Flowgraph ==<br />
<br />
This flowgraph generates symbols using a chosen modulation scheme, runs the signal through a channel model, and then simulates a receiver by synchronizing to the signal and performing soft decoding.<br />
<br />
[[File:constellation_soft_decoder_ex.png|800px]]<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio/blob/0fa281fd7369348dbdeadcecfebb20b73082e93e/gr-digital/lib/constellation.cc see middle of this page]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio/blob/0fa281fd7369348dbdeadcecfebb20b73082e93e/gr-digital/include/gnuradio/digital/constellation.h Here]<br />
<br />
; Block definition<br />
: TODO</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=Constellation_Object&diff=12598Constellation Object2022-09-30T15:46:45Z<p>ThomasHabets: Clarify rotational symmetry parameter</p>
<hr />
<div>[[Category:Block Docs]]<br />
GNU Radio supports the creation and use of Constellation objects for many of its digital communications needs. We define these constellations with a set of constellation points in complex space and the symbol mappings to those points. For a constellation that has 4 symbols, it then has log2(4) = 2 bits/symbol. We define this constellation with a list of Constellation Points and Symbol Map. For example, 16QAM would have:<br />
<br />
Constellation Points = [(-3-3j), (-1-3j), (1-3j), (3-3j), (-3-1j), (-1-1j), (1-1j), (3-1j), (-3+1j), (-1+1j), (1+1j), (3+1j), (-3+3j), (-1+3j), (1+3j), (3+3j)]<br />
Symbol Map = [0, 4, 12, 8, 1, 5, 13, 9, 3, 7, 15, 11, 2, 6, 14, 10]<br />
<br />
The mapping is a 1-to-1 for the items in both lists. The symbols are referred to as the 'pre_diff_code' since this is the mapping before the application of differential modulation, if used.<br />
<br />
See [https://www.gnuradio.org/doc/doxygen/page_digital.html] for more info.<br />
<br />
== Parameters ==<br />
<br />
; Constellation Type<br />
: Type of modulation scheme. Choose Variable Constellation for more control.<br />
<br />
; Soft Decisions Precision<br />
: Specifies how accurate the look up table (LUT) is to a given number of bits.<br />
<br />
; Soft Decisions LUT<br />
: Vector of floating point tuples that acts as the look up table (LUT). Can be set to 'auto' for GNU Radio to populate it. <br />
<br />
; Symbol Map<br />
: (Available when using Variable Constellation) Manually specify the symbol map (in pre-diff values) in list form. For manually defined symbols in QPSK, symbols start in quadrant 1 and proceeding counterclockwise (standardvalues are sometimes in different order). 8PSK symbols start at (0.92,0.38) and proceed in the nonsensical order of Pi/8 times: 1, 7, 15, 9, 3, 5, 13, 11. So symbols [0,1,2,3,4,5,6,7] become 0, 4, 5, 1, 3, 7, 6, 2, counterclockwise from (0.92,0.38).<br />
<br />
; Constellation Points<br />
: (Available when using Variable Constellation) Manually specify the constellation points, using a list of complex numbers. <br />
<br />
; Rotational Symmetry<br />
: (Available when using Variable Constellation) The number of rotations per 360 degrees that the constellation is symmetric, which is 4 for the common constellations. This doesn't affect the encoding / decoding, but allows unit tests and potentially other blocks to know if decodes will work for rotated constellations.<br />
<br />
; Dimensionality<br />
: (Available when using Variable Constellation) The number of dimensions, typically set to 1.<br />
<br />
; Normalization Type<br />
: Optionally normalize the average amplitude or power of the constellation points around 1.<br />
<br />
== Example Flowgraph ==<br />
<br />
This flowgraph generates symbols using a chosen modulation scheme, runs the signal through a channel model, and then simulates a receiver by synchronizing to the signal and performing soft decoding.<br />
<br />
[[File:constellation_soft_decoder_ex.png|800px]]<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio/blob/0fa281fd7369348dbdeadcecfebb20b73082e93e/gr-digital/lib/constellation.cc see middle of this page]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio/blob/0fa281fd7369348dbdeadcecfebb20b73082e93e/gr-digital/include/gnuradio/digital/constellation.h Here]<br />
<br />
; Block definition<br />
: TODO</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=Constellation_Object&diff=12597Constellation Object2022-09-29T19:00:00Z<p>ThomasHabets: Add Normalization Type</p>
<hr />
<div>[[Category:Block Docs]]<br />
GNU Radio supports the creation and use of Constellation objects for many of its digital communications needs. We define these constellations with a set of constellation points in complex space and the symbol mappings to those points. For a constellation that has 4 symbols, it then has log2(4) = 2 bits/symbol. We define this constellation with a list of Constellation Points and Symbol Map. For example, 16QAM would have:<br />
<br />
Constellation Points = [(-3-3j), (-1-3j), (1-3j), (3-3j), (-3-1j), (-1-1j), (1-1j), (3-1j), (-3+1j), (-1+1j), (1+1j), (3+1j), (-3+3j), (-1+3j), (1+3j), (3+3j)]<br />
Symbol Map = [0, 4, 12, 8, 1, 5, 13, 9, 3, 7, 15, 11, 2, 6, 14, 10]<br />
<br />
The mapping is a 1-to-1 for the items in both lists. The symbols are referred to as the 'pre_diff_code' since this is the mapping before the application of differential modulation, if used.<br />
<br />
See [https://www.gnuradio.org/doc/doxygen/page_digital.html] for more info.<br />
<br />
== Parameters ==<br />
<br />
; Constellation Type<br />
: Type of modulation scheme. Choose Variable Constellation for more control.<br />
<br />
; Soft Decisions Precision<br />
: Specifies how accurate the look up table (LUT) is to a given number of bits.<br />
<br />
; Soft Decisions LUT<br />
: Vector of floating point tuples that acts as the look up table (LUT). Can be set to 'auto' for GNU Radio to populate it. <br />
<br />
; Symbol Map<br />
: (Available when using Variable Constellation) Manually specify the symbol map (in pre-diff values) in list form. For manually defined symbols in QPSK, symbols start in quadrant 1 and proceeding counterclockwise (standardvalues are sometimes in different order). 8PSK symbols start at (0.92,0.38) and proceed in the nonsensical order of Pi/8 times: 1, 7, 15, 9, 3, 5, 13, 11. So symbols [0,1,2,3,4,5,6,7] become 0, 4, 5, 1, 3, 7, 6, 2, counterclockwise from (0.92,0.38).<br />
<br />
; Constellation Points<br />
: (Available when using Variable Constellation) Manually specify the constellation points, using a list of complex numbers. <br />
<br />
; Rotational Symmetry<br />
: (Available when using Variable Constellation) The number of rotations per 360 degrees that the constellation is symmetric, which is 4 for the common constellations. Unclear if this affects anything other than some tests in qa_constellation.py.<br />
<br />
; Dimensionality<br />
: (Available when using Variable Constellation) The number of dimensions, typically set to 1.<br />
<br />
; Normalization Type<br />
: Optionally normalize the average amplitude or power of the constellation points around 1.<br />
<br />
== Example Flowgraph ==<br />
<br />
This flowgraph generates symbols using a chosen modulation scheme, runs the signal through a channel model, and then simulates a receiver by synchronizing to the signal and performing soft decoding.<br />
<br />
[[File:constellation_soft_decoder_ex.png|800px]]<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio/blob/0fa281fd7369348dbdeadcecfebb20b73082e93e/gr-digital/lib/constellation.cc see middle of this page]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio/blob/0fa281fd7369348dbdeadcecfebb20b73082e93e/gr-digital/include/gnuradio/digital/constellation.h Here]<br />
<br />
; Block definition<br />
: TODO</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=Polyphase_Channelizer&diff=9468Polyphase Channelizer2021-12-31T15:30:18Z<p>ThomasHabets: fix typo</p>
<hr />
<div>[[Category:Block Docs]]<br />
(Note, there also exists a [[Hierarchical Polyphase Channelizer]] block which may be easier to use.)<br />
<br />
This block takes in complex inputs and channelizes it to channels of equal bandwidth. Each of the resulting channels is decimated to the new rate that is the input sampling rate divided by the number of channels.<br />
<br />
The PFB channelizer code takes the taps generated above and builds a set of filters. The set contains number of filters and each filter contains ceil(taps.size()/decim) number of taps. Each tap from the filter prototype is sequentially inserted into the next filter. When all of the input taps are used, the remaining filters in the filterbank are filled out with 0’s to make sure each filter has the same number of taps.<br />
<br />
Each filter operates using the [[FIR Filter]] class of GNU Radio, which takes the input stream at and performs the inner product calculation to where is the number of filter taps. To efficiently handle this in the GNU Radio structure, each filter input must come from its own input stream. So the channelizer must be provided with streams where the input stream has been deinterleaved. This is most easily done using the [[Stream to Streams]] block.<br />
<br />
The output is then produced as a vector, where index in the vector is the next sample from the th channel. This is most easily handled by sending the output to a [[Vector to Streams]] block to handle the conversion and passing streams out.<br />
<br />
The filter’s taps should be based on the input sampling rate.<br />
<br />
For example, using the GNU Radio’s firdes utility to building filters, we build a low-pass filter with a sampling rate of , a 3-dB bandwidth of and a transition bandwidth of . We can also specify the out-of-band attenuation to use, , and the filter window function (a Blackman-harris window in this case). The first input is the gain of the filter, which we specify here as unity.<br />
<br />
The filter output can also be oversampled. The over sampling rate is the ratio of the the actual output sampling rate to the normal output sampling rate. It must be rationally related to the number of channels as N/i for i in [1,N], which gives an outputsample rate of [fs/N, fs] where fs is the input sample rate and N is the number of channels.<br />
<br />
For example, for 6 channels with fs = 6000 Hz, the normal rate is 6000/6 = 1000 Hz. Allowable oversampling rates are 6/6, 6/5, 6/4, 6/3, 6/2, and 6/1 where the output sample rate of a 6/1 oversample ratio is 6000 Hz, or 6 times the normal 1000 Hz. A rate of 6/5 = 1.2, so the output rate would be 1200 Hz.<br />
<br />
See [http://www.trondeau.com/examples/2014/1/23/pfb-channelizers-and-synthesizers.html] for a guide on these polyphase filterbank blocks.<br />
<br />
== Parameters ==<br />
<br />
; Channels<br />
: Specifies the number of channels<br />
<br />
; Taps<br />
: The prototype filter to populate the filterbank.<br />
<br />
; Oversampling Ratio<br />
: The over sampling rate is the ratio of the the actual output sampling rate to the normal output sampling rate. It must be rationally related to the number of channels as N/i for i in [1,N], which gives an outputsample rate of [fs/N, fs] where fs is the input sample rate and N is the number of channels.<br />
<br />
; Attenuation<br />
: Attenuation of stop band.<br />
<br />
; Sample Delay<br />
: Sample delay of filter.<br />
<br />
; Channel Map<br />
: The Channel Map can be used to rearrange which channels go to which output stream. See [[Channel Map]].<br />
<br />
; Bus Connections<br />
: No idea. Default is [[0,],]</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=RRC_Filter_Taps&diff=7920RRC Filter Taps2020-12-10T18:32:22Z<p>ThomasHabets: </p>
<hr />
<div>[[Category:Block Docs]]<br />
This is a convenience wrapper for calling firdes.root_raised_cosine(). A root-raised-cosine (RRC) filter is one of the most common pulse shaping filters in digital communications systems, used to perform matched filtering. See [https://en.wikipedia.org/wiki/Root-raised-cosine_filter RRC filter at wikipedia] for more info on RRC filtering.<br />
<br />
== Parameters ==<br />
; Gain<br />
: Scaling factor applied to output.<br />
<br />
; Sample Rate<br />
: Input sample rate in Hz.<br />
<br />
; Symbol Rate<br />
: Input symbol rate in Hz, NOT samples per symbol.<br />
<br />
; Excess BW<br />
: The filter parameter, sometimes called roll-off factor or beta, between 0 and 1. A higher value means more bandwidth is being used. A common value is 0.35.<br />
<br />
; Num Taps<br />
: Number of taps for the generated filter to have<br />
<br />
== Example Flowgraph ==<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Block definition<br />
: [https://github.com/gnuradio/gnuradio TODO]</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=RRC_Filter_Taps&diff=7919RRC Filter Taps2020-12-10T18:31:56Z<p>ThomasHabets: Fix wikipedia link</p>
<hr />
<div>[[Category:Block Docs]]<br />
This is a convenience wrapper for calling firdes.root_raised_cosine(). A root-raised-cosine (RRC) filter is one of the most common pulse shaping filters in digital communications systems, used to perform matched filtering. See [https://en.wikipedia.org/wiki/Root-raised-cosine_filter](RRC filter at wikipedia) for more info on RRC filtering.<br />
<br />
== Parameters ==<br />
; Gain<br />
: Scaling factor applied to output.<br />
<br />
; Sample Rate<br />
: Input sample rate in Hz.<br />
<br />
; Symbol Rate<br />
: Input symbol rate in Hz, NOT samples per symbol.<br />
<br />
; Excess BW<br />
: The filter parameter, sometimes called roll-off factor or beta, between 0 and 1. A higher value means more bandwidth is being used. A common value is 0.35.<br />
<br />
; Num Taps<br />
: Number of taps for the generated filter to have<br />
<br />
== Example Flowgraph ==<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio TODO]<br />
<br />
; Block definition<br />
: [https://github.com/gnuradio/gnuradio TODO]</div>ThomasHabetshttps://wiki.gnuradio.org/index.php?title=Polyphase_Clock_Sync&diff=7909Polyphase Clock Sync2020-12-09T23:44:20Z<p>ThomasHabets: /* Parameters */ update blog post reference</p>
<hr />
<div>[[Category:Block Docs]]<br />
Timing synchronizer using polyphase filterbanks.<br />
<br />
This block performs timing synchronization for PAM signals by minimizing the derivative of the filtered signal, which in turn maximizes the SNR and minimizes ISI.<br />
<br />
This approach works by setting up two filterbanks; one filterbank contains the signal's pulse shaping matched filter (such as a root raised cosine filter), where each branch of the filterbank contains a different phase of the filter. The second filterbank contains the derivatives of the filters in the first filterbank. Thinking of this in the time domain, the first filterbank contains filters that have a sinc shape to them. We want to align the output signal to be sampled at exactly the peak of the sinc shape. The derivative of the sinc contains a zero at the maximum point of the sinc (sinc(0) = 1, sinc(0)' = 0). Furthermore, the region around the zero point is relatively linear. We make use of this fact to generate the error signal.<br />
<br />
If the signal out of the derivative filters is d_i[n] for the ith filter, and the output of the matched filter is x_i[n], we calculate the error as: e[n] = (Re{x_i[n]} * Re{d_i[n]} + Im{x_i[n]} * Im{d_i[n]}) / 2.0 This equation averages the error in the real and imaginary parts. There are two reasons we multiply by the signal itself. First, if the symbol could be positive or negative going, but we want the error term to always tell us to go in the same direction depending on which side of the zero point we are on. The sign of x_i[n] adjusts the error term to do this. Second, the magnitude of x_i[n] scales the error term depending on the symbol's amplitude, so larger signals give us a stronger error term because we have more confidence in that symbol's value. Using the magnitude of x_i[n] instead of just the sign is especially good for signals with low SNR.<br />
<br />
The error signal, e[n], gives us a value proportional to how far away from the zero point we are in the derivative signal. We want to drive this value to zero, so we set up a second order loop. We have two variables for this loop; d_k is the filter number in the filterbank we are on and d_rate is the rate which we travel through the filters in the steady state. That is, due to the natural clock differences between the transmitter and receiver, d_rate represents that difference and would traverse the filter phase paths to keep the receiver locked. Thinking of this as a second-order PLL, the d_rate is the frequency and d_k is the phase. So we update d_rate and d_k using the standard loop equations based on two error signals, d_alpha and d_beta. We have these two values set based on each other for a critically damped system, so in the block constructor, we just ask for "gain," which is d_alpha while d_beta is equal to (gain^2)/4.<br />
<br />
Reference: <br />
f. j. harris and M. Rice, "Multirate Digital Filters for Symbol Timing Synchronization in Software Defined Radios", IEEE Selected Areas in Communications, Vol. 19, No. 12, Dec., 2001. [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.127.1757]<br />
<br />
== Parameters ==<br />
(''R''): <span class="plainlinks">[https://wiki.gnuradio.org/index.php/GNURadioCompanion#Variable_Controls ''Run-time adjustable'']</span><br />
<br />
; Samples/Symbol<br />
: The clock sync block needs to know the number of samples per symbol, because it defaults to return a single point representing the symbol. The sps can be any positive real number and does not need to be an integer.<br />
<br />
; Loop Bandwidth (''R'')<br />
: The loop bandwidth is used to set the gain of the inner control loop (see: [http://www.trondeau.com/blog/2011/8/13/control-loop-gain-values.html]).<br />
: This should be set small (a value of around 2pi/100 is suggested in that blog post as the step size for the number of radians around the unit circle to move relative to the error).<br />
<br />
; Taps (''R'')<br />
: One of the most important parameters for this block is the taps of the filter.<br />
: One of the benefits of this algorithm is that you can put the matched filter in here as the taps, so you get both the matched filter and sample timing correction in one go. So create your normal matched filter. For a typical digital modulation, this is a root raised cosine filter.<br />
: The number of taps of this filter is based on how long you expect the channel to be; that is, how many symbols do you want to combine to get the current symbols energy back (there's probably a better way of stating that). It's usually 5 to 10 or so. That gives you your filter, but now we need to think about it as a filter with different phase profiles in each filter. So take this number of taps and multiply it by the number of filters. This is the number you would use to create your prototype filter. When you use this in the PFB filerbank, it segments these taps into the filterbanks in such a way that each bank now represents the filter at different phases, equally spaced at 2pi/N, where N is the number of filters.<br />
<br />
; Filter Size<br />
: The number of filters can also be set and defaults to 32. With 32 filters, you get a good enough resolution in the phase to produce very small, almost unnoticeable, ISI. Going to 64 filters can reduce this more, but after that there is very little gained for the extra complexity.<br />
<br />
; Initial Phase<br />
: The initial phase is another settable parameter and refers to the filter path the algorithm initially looks at (i.e., d_k starts at init_phase). This value defaults to zero, but it might be useful to start at a different phase offset, such as the mid-point of the filters.<br />
<br />
; Maximum Rate Deviation<br />
: The next parameter is the max_rate_devitation, which defaults to 1.5. This is how far we allow d_rate to swing, positive or negative, from 0. Constraining the rate can help keep the algorithm from walking too far away to lock during times when there is no signal.<br />
<br />
; Output SPS<br />
: The osps is the number of output samples per symbol. By default, the algorithm produces 1 sample per symbol, sampled at the exact sample value. This osps value was added to better work with equalizers, which do a better job of modelling the channel if they have 2 samps/sym.<br />
<br />
== Example Flowgraph ==<br />
<br />
This flowgraph is taken from the [[Guided_Tutorial_PSK_Demodulation]] tutorial.<br />
<br />
[[File:stage3_grc.png|627px|]]<br />
<br />
[[File:stage3.png|628px|]]<br />
<br />
== Source Files ==<br />
<br />
; C++ files<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/lib/pfb_clock_sync_ccf_impl.cc Complex input]<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/lib/pfb_clock_sync_fff_impl.cc Float input]<br />
<br />
; Header files<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/lib/pfb_clock_sync_ccf_impl.h Complex input]<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/lib/pfb_clock_sync_fff_impl.h Float input]<br />
<br />
; Public header files<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/include/gnuradio/digital/pfb_clock_sync_ccf.h Complex input]<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/include/gnuradio/digital/pfb_clock_sync_fff.h Float input]<br />
<br />
; Block definition<br />
: [https://github.com/gnuradio/gnuradio/blob/master/gr-digital/grc/digital_pfb_clock_sync.block.yml]</div>ThomasHabets