On Fri, Dec 12, 2008 at 2:42 PM, Glenn R. [email protected]
wrote:
Our transmit chain indeed follows this exact pattern. The RRC was/is used
to shape the data stream, and then we resampled in a second block.
I would be interested to measure the performance gain by eliminating the
extra block(s). (There is a constant gain block as well, to bring the level
up to the USRP’s expectations.) However, I’m still back working on
understanding how all these taps are “properly created”.
You can eliminate the constant gain block by scaling the RRC taps by
that much. In fact, the RRC tap calculator has a gain parameter to do
just that.
To “properly” calculate the RRC taps, you have to understand how the
polyphase rational resampler works. First the incoming sample stream
is zero-stuffed by the interpolation rate, then this sample stream
goes into a polyphase FIR filter that produces output samples at the
decimated output rate. However, the taps for the FIR filter need to be
calculated as if you weren’t decimating the result; that is, at the
input data rate * the interpolation rate. The filter doesn’t actually
run at this possibly very high rate–it only operates to produce
samples at the output that wouldn’t get thrown away by the decimation,
For example, let’s say you have a 7 Mbps QPSK transmitter and the
USRP1. At some point in the flowgraph, the item stream will be 3.5
Msps QPSK constellation points. If you set the USRP interpolation to
16, then it expects an item stream at 8 Msps. This can be achieved by
using a rational resampler that interpolates by 16 and decimates by 7.
You would calculate the RRC taps assuming an input rate of 1
sample/symbol and sample rate of 16 samples/symbol. From Python (the
formatting probably won’t survive):
taps = gr.firdes.root_raised_cosine(interpamplitude, #gain
interp, # sample rate
1.0, # symbol rate
excess_bw, # excess
bandwidth
interptaps_per_sym) # ntaps
The gain parameter is calculated assuming the QPSK symbols have unity
values and overcome the interpolation loss as well. Taps per symbol
is based on how many symbol periods you want to apply the RRC filter
kernel over.
Hope this makes things more clear. The perfomance gain is
demonstrable–you are eliminating a FIR filter and multiplier block,
both of which are operating at the highest data rate in your
flowgraph.
-Johnathan