# Root raised cosine pulse shaping peak value

I am using a FIR filter to generate Root Raised Cosine pulse for an IQ modulator.

How can I predict the peak value at the output, depending on the roll-off factor of the pulse ?

Knowing that :

• FIR taps are root raised cosine pulse, with a peak value of 1.0
• Input of the filter is I or Q channel, valued +1 or -1, upsampled by adding 0s between each symbol

By experimenting, I can see that depending on the input sequence and the roll-off factor, the peak output varies. But I can't predict it theoretically.

This plot illustrates my question (while this particular sequence may not generates the maximum peak that I want to predict) : You can derive an upper bound for the peak value of the output signal depending on the filter's impulse response. The output is given by

$$y[n]=\sum_{k=0}^{N-1}h[k]x[n-k]\tag{1}$$

where $h[k]$ is the length $N$ impulse response, and $x[k]$ is the input signal. From $(1)$ we have

$$|y[n]|=\left|\sum_{k=0}^{N-1}h[k]x[n-k]\right|\le\sum_{k=0}^{N-1}|h[k]||x[n-k]|\le |x[n]|_{\text{max}}\sum_{k=0}^{N-1}|h[k]|\tag{2}$$

Since in your case $|x[n]|_{\text{max}}=1$, the magnitude of the peak value of the output signal is guaranteed to be smaller than the sum of the absolute value of all filter coefficients.

However, since your input signal is upsampled by a factor $L$ (i.e., it has $L-1$ zeros between two signal values), we can come up with an improved (i.e., tighter) bound:

$$|y[n]|\le\max_{l=0,1,\ldots L-1}\sum_{k=0}^{\lfloor \frac{N-1}{L}\rfloor}|h[l+kL]|$$

because in the sums $(1)$ and $(2)$ only every $L^{th}$ filter coefficient is multiplied by a non-zero input value.

The following Matlab/Octave script shows the computation of the bound:

h = randn(50,1);    % some impulse response
x = randi([-1,1],1,20); % input signal
L = 10;         % interpolation factor
x = [x;zeros(L-1,20)]; x=x(:);  % interpolate x
y = filter(h,1,x);  % compute output signal
p = max(abs(y));    % peak value

% compute bound
b = zeros(L,1);
for i = 1:L, b(i) = sum(abs(h(i:L:end))); end
b = max(b);

% show peak value and bound
[p,b]


A few runs of the script show that the bound is pretty tight.