Peak-to-average power

import matplotlib.pyplot as plt
import numpy as np

import sdr

%config InlineBackend.print_figure_kwargs = {"facecolor" : "w"}
# %matplotlib widget
span = 8  # Length of the pulse shape in symbols
sps = 20  # Samples per symbol
# Create a BPSK impulse signal
N_symbols = 500
x = np.zeros(N_symbols * sps)
symbol_map = np.array([1, -1])
x[::sps] = symbol_map[np.random.randint(0, 2, N_symbols)]

Rectangular pulse shape

# Pulse shape the signal with a rectangular pulse
h = np.zeros(span * sps + 1)
h[span * sps // 2 - sps // 2 : span * sps // 2 + sps // 2] = 1 / np.sqrt(sps)
x_bb_rect = np.convolve(x, h, mode="valid")
papr_bb_rect = sdr.papr(x_bb_rect)

x_pb_rect = x_bb_rect * np.exp(1j * np.pi / 5 * np.arange(x_bb_rect.size)).real
papr_pb_rect = sdr.papr(x_pb_rect)

Square-root raised cosine pulse shape

# Pulse shape the signal with a square-root raised cosine filter
h = sdr.root_raised_cosine(0.9, span, sps)
x_bb_0p9 = np.convolve(x, h, mode="valid")
papr_bb_0p9 = sdr.papr(x_bb_0p9)

h = sdr.root_raised_cosine(0.5, span, sps)
x_bb_0p5 = np.convolve(x, h, mode="valid")
papr_bb_0p5 = sdr.papr(x_bb_0p5)

h = sdr.root_raised_cosine(0.1, span, sps)
x_bb_0p1 = np.convolve(x, h, mode="valid")
papr_bb_0p1 = sdr.papr(x_bb_0p1)
plt.figure(figsize=(10, 5))
sdr.plot.time_domain(x_bb_rect, color="k", label=f"Rectangular, PAPR = {papr_bb_rect:.2f} dB")
sdr.plot.time_domain(x_bb_0p9, label=rf"$\alpha = 0.9$, PAPR = {papr_bb_0p9:.2f} dB")
sdr.plot.time_domain(x_bb_0p5, label=rf"$\alpha = 0.5$, PAPR = {papr_bb_0p5:.2f} dB")
sdr.plot.time_domain(x_bb_0p1, label=rf"$\alpha = 0.1$, PAPR = {papr_bb_0p1:.2f} dB")
plt.xlim(0, 50 * sps)
plt.legend()
plt.title("Baseband BPSK with SRRC pulse shaping")
plt.tight_layout()
plt.show()
../../_images/e89eb5bd71d23e0734134bd0b1f7cfaae4812bf3a18bbe5a024ac641a0f73517.png
plt.figure(figsize=(10, 5))
sdr.plot.periodogram(x_bb_rect, length=1024, overlap=1024 - 256, label=f"Rectangular, PAPR = {papr_bb_rect:.2f} dB")
sdr.plot.periodogram(x_bb_0p9, length=1024, overlap=1024 - 256, label=rf"$\alpha = 0.9$, PAPR = {papr_bb_0p9:.2f} dB")
sdr.plot.periodogram(x_bb_0p5, length=1024, overlap=1024 - 256, label=rf"$\alpha = 0.5$, PAPR = {papr_bb_0p5:.2f} dB")
sdr.plot.periodogram(x_bb_0p1, length=1024, overlap=1024 - 256, label=rf"$\alpha = 0.1$, PAPR = {papr_bb_0p1:.2f} dB")
plt.title("Power spectral density of baseband BPSK with SRRC pulse shaping")
plt.show()
../../_images/990a6b7c848f878d19625b66ffb8300fe7f39e52e3b6c3521800bd9098f66d37.png
x_pb_0p9 = x_bb_0p9 * np.exp(1j * np.pi / 5 * np.arange(x_bb_0p9.size)).real
papr_pb_0p9 = sdr.papr(x_pb_0p9)

x_pb_0p5 = x_bb_0p5 * np.exp(1j * np.pi / 5 * np.arange(x_bb_0p5.size)).real
papr_pb_0p5 = sdr.papr(x_pb_0p5)

x_pb_0p1 = x_bb_0p1 * np.exp(1j * np.pi / 5 * np.arange(x_bb_0p1.size)).real
papr_pb_0p1 = sdr.papr(x_pb_0p1)
plt.figure(figsize=(10, 5))
sdr.plot.time_domain(x_pb_rect, color="k", label=f"Rectangular, PAPR = {papr_pb_rect:.2f} dB")
sdr.plot.time_domain(x_pb_0p9, label=rf"$\alpha = 0.9$, PAPR = {papr_pb_0p9:.2f} dB")
sdr.plot.time_domain(x_pb_0p5, label=rf"$\alpha = 0.5$, PAPR = {papr_pb_0p5:.2f} dB")
sdr.plot.time_domain(x_pb_0p1, label=rf"$\alpha = 0.1$, PAPR = {papr_pb_0p1:.2f} dB")
plt.xlim(0, 50 * sps)
plt.legend()
plt.title("Passband BPSK with SRRC pulse shaping")
plt.tight_layout()
plt.show()
../../_images/2c82097f889fecc06283a2f4798ecc66d2f284632a9e6a6efb943e99cb0ea241.png
plt.figure(figsize=(10, 5))
sdr.plot.periodogram(
    x_pb_rect,
    length=1024,
    overlap=1024 - 256,
    x_axis="one-sided",
    label=f"Rectangular, PAPR = {papr_pb_rect:.2f} dB",
)
sdr.plot.periodogram(
    x_pb_0p9,
    length=1024,
    overlap=1024 - 256,
    x_axis="one-sided",
    label=rf"$\alpha = 0.9$, PAPR = {papr_pb_0p9:.2f} dB",
)
sdr.plot.periodogram(
    x_pb_0p5,
    length=1024,
    overlap=1024 - 256,
    x_axis="one-sided",
    label=rf"$\alpha = 0.5$, PAPR = {papr_pb_0p5:.2f} dB",
)
sdr.plot.periodogram(
    x_pb_0p1,
    length=1024,
    overlap=1024 - 256,
    x_axis="one-sided",
    label=rf"$\alpha = 0.1$, PAPR = {papr_pb_0p1:.2f} dB",
)
plt.title("Power spectral density of passband BPSK with SRRC pulse shaping")
plt.show()
../../_images/c648c8f9fd3a688d659b04d898bf659026613b5482e80c6282e3ea4d78f09cd7.png

Last update: Jul 16, 2023