Power Spectral Density#
Power Spectral Density of a Digitally Modulated Signal with Memory#
We analyze a bandpass modulated signal \( v(t) \) through its equivalent complex-valued, lowpass signal \( v_{lp}(t) \):
\( s_{lp}(t; \vec{I}_n) \) represents one of \( M \) possible lowpass signals based on the information sequence \( \vec{I}_n \).
The process \( \vec{I}_n = (\ldots, I_{n-2}, I_{n-1}, I_{n}) \) is stationary.
The goal is to determine the power spectral density (PSD) of \( v(t) \).
Autocorrelation of \( v_{lp}(t) \)#
The autocorrelation function is given by:
Averaged Autocorrelation#
Since \( v_{lp}(t) \) is a cyclostationary process, we average \( R_{v_{lp}}(t + \tau, t) \) over one period \( T \).
The averaged autocorrelation function \( \bar{R}_{v_{lp}}(\tau) \) is:
After a variable change \( u = t - mT \):
Definition of \( g_k(\tau) \)#
The function \( g_k(\tau) \) is defined as:
which represents the expected autocorrelation between pulses separated by \( k \) symbol periods.
Averaged Autocorrelation in Terms of \( g_k(\tau) \)
Next, the autocorrelation function can be decomposed into a sum of time-shifted versions of \( g_k(\tau) \) as:
Power Spectral Density (PSD) of \( v_{lp}(t) \)#
The power spectral density, \( S_{v_{lp}}(f) \), is the Fourier transform of \( \bar{R}_{v_{lp}}(\tau) \):
By applying the Fourier transform of time-shifted signals:
where \( G_k(f) \) is the Fourier transform of \( g_k(\tau) \).
Expression for \( G_k(f) \)
The quantity \( G_k(f) \) is derived as:
Expanding:
which simplifies to:
where \( S_{lp}(f; \vec{I}_k) \) and \( S_{lp}(f; \vec{I}_0) \) are the Fourier transforms of \( s_{lp}(t; \vec{I}_k) \) and \( s_{lp}(t; \vec{I}_0) \).
Relationship of \( G_k(f) \)
We have:
where \( G_0(f) \) is real.
For \( k \geq 1 \), \( G_{-k}(f) = G_k^*(f) \).
We define:
From this definition:
This redefinition centers the spectral components around \( G_0(f) \) and introduces symmetry properties.
Final PSD Expression
Using these definitions, the PSD \( S_{v_{lp}}(f) \) becomes:
Rearranging:
Continuous and Discrete Components#
By leveraging symmetry properties and Fourier properties:
where:
Continuous Component:
Discrete Component:
Power Spectral Density of Linearly Modulated Signals#
We consider Linearly Modulated Signals, which encompasses modulation schemes like ASK, PSK, and QAM.
For linearly modulated signals, the lowpass equivalent of the modulated signal \( v_{lp}(t) \) is:
where:
\( I_n \): Stationary information component (random symbols, the last component of the sequence \(\vec{I}_n\) considered previously.
\( g(t) \): Basic modulation pulse (e.g., rectangular pulse).
\( T \): Symbol period.
Correspondence with the General Model
Comparing with the general form of \( v_{lp}(t) \) above, we get:
Thus, the signal consists of symbols \( I_n \) multiplied by a common base pulse \( g(t) \).
Derivation of \( G_k(f) \)#
Recall from previous equations:
Now, given \( s_{lp}(t, \vec{I}_n) = I_n g(t)\), the Fourier transform of \( s_{lp}(t, \vec{I}_n) \) is:
where \( G(f) \) is the Fourier transform of \( g(t) \).
So:
The expectation applies only to \( I_k \) and \( I_0 \):
where:
\( R_{II}(k) \) is the autocorrelation function of the information sequence \( \{I_n\} \).
\( |G(f)|^2 \) is the magnitude squared of the Fourier transform of the modulation pulse \( g(t) \).
Derivation of \( S_{v_{lp}}(f) \)#
The PSD of \( v_{lp}(t) \) is:
Substituting \( G_k(f) \):
Factor \( |G(f)|^2 \) out:
Recognizing the summation as the discrete-time Fourier transform (DTFT) of the autocorrelation function \( R_{II}(k) \), we define:
Thus, the power spectral density of \( v_{lp}(t) \) is:
where
\( |G(f)|^2 \) reflects the energy distribution of the base pulse shape \( g(t) \).
\( S_I(f) \) characterizes the spectral properties of the symbol sequence \( I_n \).
Precoding#
Precoding introduces memory into the transmitted symbols by defining a new sequence \( \{J_n\} \) from the original sequence \( \{I_n\} \).
The general precoding can be expressed as
where:
\( L \): Length of the memory in the precoder.
\( \alpha_k \): Coefficients that determine the contribution of past symbols \( I_{n-k} \) to the current precoded symbol \( J_n \).
When \( L = 1 \) and \( \alpha_1 = \alpha \), the simple precoder becomes:
By adjusting \( \alpha \), the correlation properties of the signal are modified, which in turn changes the PSD.
Modulated Waveform After Precoding#
After applying the precoding process, the transmitted waveform becomes:
We can see that:
Each symbol \( J_k \) is convolved with the base pulse \( g(t) \).
The resulting waveform inherits the correlation properties introduced by the precoding.
PSD of the Precoded Signal#
Since the precoding is linear, the PSD of the precoded signal can be derived similarly to the original PSD:
where:
\( |G(f)|^2 \): Spectrum of the base pulse \( g(t) \).
\( S_I(f) \): PSD of the original information sequence.
The additional factor:
reflects the impact of the precoding on the PSD. By choosing different values of \( \alpha_k \), we can control the correlation of symbols and, consequently, the spectral characteristics of the signal.
Practical Significance
Spectral Efficiency: Adjusting \( \alpha_k \) can minimize spectral side lobes, making transmissions more bandwidth-efficient.
ISI Mitigation: Precoding can help shape the spectrum to reduce intersymbol interference in practical communication systems.
Example: Binary Communication System#
Given an information sequence:
\( I_n = \pm 1 \) with equal probability (binary sequence).
Symbols are independent and identically distributed.
Pulse Shape
The information stream linearly modulates a rectangular pulse defined by:
where \( \Pi(x) \) is a rectangular function, which equals 1 for \(|x| \leq 0.5\) and 0 otherwise.
Generated Modulated Signal
The modulated signal is:
This represents a binary PAM waveform modulated by rectangular pulses.
Power Spectral Density (PSD)
The PSD of the modulated signal is given by:
Autocorrelation of \( I_n \)
Since the symbols are independent and identically distributed:
Note that \(I_n\) is real-valued, so we do not need to use \(I_n^*\) in \(R_{II}(k)\). We further have:
For \( k = 0 \): \( R_{II}(0) = 1 \) (variance of binary \(\pm 1\) symbols is 1).
For \( k \ne 0 \): \( R_{II}(k) = 0 \) due to independence.
Thus:
So the PSD becomes:
Precoding with Memory#
A precoder is applied to shape the spectrum:
This introduces correlation between consecutive symbols, affecting the spectrum.
PSD with Precoding
The resulting PSD with this first-order precoding is:
Expanding:
Special Case: \(\alpha = 1\)#
If:
Then the PSD exhibits a spectral null at:
This null occurs regardless of the shape of \( g(t) \), indicating that precoding can shape the spectrum independently of the pulse shape.
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
# Parameters
T = 1 # Symbol duration
Fs = 100 # Sampling frequency
Ts = 1 / Fs # Sampling period
N = 100 # Number of symbols
# Generate random binary sequence I_n
I_n = np.random.choice([-1, 1], size=N)
# Time vector
t = np.arange(-T/2, T/2, Ts)
# Define rectangular pulse g(t)
g_t = np.where((t >= -T/2) & (t < T/2), 1, 0)
# Generate modulated signal v(t)
time_axis = np.arange(0, N*T, Ts)
v_t = np.zeros_like(time_axis)
for k in range(N):
v_t[k * Fs: (k + 1) * Fs] += I_n[k] * g_t
# Compute PSD using Welch's method
f, Pxx = welch(v_t, fs=Fs, nperseg=512)
# Theoretical PSD S_v(f) = T sinc^2(Tf)
S_v_theoretical = T * (np.sinc(f * T))**2
# Plot modulated signal v(t)
plt.figure(figsize=(15, 4))
plt.plot(time_axis[:5*Fs], v_t[:5*Fs], label="v(t)")
plt.title("Binary PAM Modulated Signal v(t)")
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.legend()
plt.grid()
plt.show()
# Plot PSD comparison
plt.figure(figsize=(15, 4))
plt.semilogy(f, Pxx, label="Simulated PSD")
plt.semilogy(f, S_v_theoretical, '--', label="Theoretical PSD")
plt.title("Power Spectral Density of v(t)")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Power/Frequency (dB/Hz)")
plt.legend()
plt.grid()
plt.show()


# Increase FFT size for better resolution
fft_size = 8192 # Large FFT for high frequency resolution
# Compute PSD using direct FFT
V_f = np.fft.fftshift(np.fft.fft(v_t, n=fft_size)) # Compute FFT and shift zero freq to center
freqs = np.fft.fftshift(np.fft.fftfreq(fft_size, d=Ts)) # Compute frequency axis
# Compute magnitude squared (PSD estimate)
PSD_direct = np.abs(V_f) ** 2
# Create a new plot for better resolution
plt.figure(figsize=(15, 4))
plt.semilogy(freqs, PSD_direct, label="Simulated PSD with High FFT Resolution", linewidth=1)
plt.title("Power Spectral Density - High Resolution")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Power/Frequency (dB/Hz)")
plt.legend()
plt.grid()
plt.show()
