{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "4bcd49a4", "metadata": { "nbsphinx": "hidden" }, "outputs": [], "source": [ "# Install HermesPy and its dependencies in the current kernel\n", "# When running on Colabs, a restart of the runtime is required afterwards\n", "\n", "import sys\n", "!{sys.executable} -m pip install --quiet hermespy" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Implementing Channels\n", "=====================\n", "\n", "Wireless propagation channels are a core concept in the physical layer modeling of communication and sensing systems.\n", "In essence, they describe the behaviour of electromagnetic waves during their propagation between devices capable of transmitting electromagnetic radiation, receiving electromagnetic radation, or both.\n", "Within Hermes' API, channels are addressed by the [Channel Module](../api/channel.rst), with each implemented channel model inheriting from a common [Channel](../api/channel.channel.Channel.rst) base class.\n", "\n", "Adding a new channel model to the set of provided implementations is rather straightfoward.\n", "On the most fundamental level, each channel model class is expected to provide only a [realize](../api/channel.channel.Channel.rst#hermespy.channel.channel.Channel.realization) method generating a [realization](../api/channel.channel.ChannelRealization.rst#hermespy.channel.channel.ChannelRealization) of the channel's random variables and impulse response.\n", "To demonstrate the API workflow, we will implement a basic channel only introducing a random phase shift to the propagated waveform, no time of flight delays or multiple antenna scenarios are considered:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", "from typing import Any, Mapping, Type\n", "\n", "import numpy as np\n", "from h5py import Group\n", "\n", "from hermespy.core import ChannelStateInformation, ChannelStateFormat, Device, Signal\n", "from hermespy.channel import Channel, ChannelRealization, InterpolationMode\n", "\n", "\n", "class PhaseShiftChannelRealization(ChannelRealization):\n", "\n", " def __init__(\n", " self,\n", " alpha_device: Device,\n", " beta_device: Device,\n", " gain: float,\n", " phase_shift: float,\n", " ) -> None:\n", "\n", " ChannelRealization.__init__(self, alpha_device, beta_device, gain)\n", " self.__phase_shift = phase_shift\n", "\n", " def _propagate(\n", " self,\n", " signal: Signal,\n", " transmitter: Device,\n", " receiver: Device,\n", " interpolation: InterpolationMode,\n", " ) -> Signal:\n", "\n", " shifted_samples = signal.samples * np.exp(1j * self.__phase_shift)\n", " return Signal(shifted_samples, signal.sampling_rate, signal.carrier_frequency)\n", "\n", " def state(\n", " self,\n", " transmitter: Device,\n", " receiver: Device,\n", " delay: float,\n", " sampling_rate: float,\n", " num_samples: int,\n", " max_num_taps: int,\n", " ) -> ChannelStateInformation:\n", " \n", " state = np.sqrt(self.gain) * np.exp(1j * self.__phase_shift) * np.ones((receiver.antennas.num_receive_antennas, transmitter.antennas.num_transmit_antennas, num_samples, 1), dtype=complex)\n", " return ChannelStateInformation(ChannelStateFormat.IMPULSE_RESPONSE, state)\n", "\n", " def to_HDF(self, group: Group) -> None:\n", " \n", " ChannelRealization.to_HDF(self, group)\n", " group.attrs[\"phase_shift\"] = self.__phase_shift\n", " \n", " @classmethod\n", " def _parameters_from_HDF(cls: Type[PhaseShiftChannelRealization], group: Group) -> Mapping[str, Any]:\n", " \n", " parameters = ChannelRealization._parameters_from_HDF(group)\n", " parameters[\"phase_shift\"] = group.attrs[\"phase_shift\"]\n", "\n", "\n", "class PhaseShiftChannel(Channel[PhaseShiftChannelRealization]):\n", " \n", " def _realize(self) -> PhaseShiftChannelRealization:\n", " \n", " phase_shift = np.exp(2j * self._rng.normal(0, np.pi)) \n", " return PhaseShiftChannelRealization(self.alpha_device, self.beta_device, self.gain, phase_shift)\n", " \n", " def recall_realization(self, group: Group) -> PhaseShiftChannelRealization:\n", " \n", " return PhaseShiftChannelRealization.From_HDF(group, self.alpha_device, self.beta_device)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "During simulation runtime, the impulse response routine will be called for each channel propagation over a single link configured to the newly created *PhaseShiftChannel*.\n", "It is expected to return a four-dimensional numpy tensor modeling a channel impulse sampled *num_samples* times at frequency *sampling_rate*.\n", "The first tensor dimension denotes the number of time-domain impulse response samples, the second and third dimension the number of transmit and receive antennas, and the fourth dimension the impulse response of each sample instance, respectively.\n", "\n", "We can now plug the newly generated channel model into a simulation scenario evaluating an [OFDM waveform](../api/modem.waveform.ofdm.OFDMWaveform.rst) with access to ideal channel state information, equalizing the channel by [zero forcing](../api/modem.waveform.ofdm.OFDMZeroForcingChannelEqualization.rst):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "from hermespy.core import dB, ConsoleMode\n", "from hermespy.simulation import Simulation, OFDMIdealChannelEstimation\n", "from hermespy.modem import BitErrorEvaluator, DuplexModem, ElementType, FrameElement, FrameResource, FrameSymbolSection, OFDMWaveform, OFDMZeroForcingChannelEqualization\n", "\n", "\n", "# Create a new Monte Carlo simulation\n", "simulation = Simulation(console_mode=ConsoleMode.SILENT)\n", "\n", "# Add a single device, operated by a communication modem\n", "operator = DuplexModem()\n", "operator.device = simulation.new_device()\n", "operator.reference = operator.device\n", "\n", "# Configure an OFDM waveform with a frame consisting of a single symbol section\n", "operator.waveform = OFDMWaveform(resources=[FrameResource(elements=[FrameElement(ElementType.DATA, 1024)])],\n", " structure=[FrameSymbolSection(pattern=[0])])\n", "\n", "# Add channel estimation and equalization routines\n", "operator.waveform.channel_estimation = OFDMIdealChannelEstimation(operator.device, operator.device)\n", "operator.waveform.channel_equalization = OFDMZeroForcingChannelEqualization()\n", "\n", "# Configure our newly implemented channel model\n", "simulation.scenario.set_channel(operator.device, operator.device, PhaseShiftChannel())\n", "\n", "# Configure a parameter sweep over the receiver SNR, effectively simulating an AWGN channel\n", "simulation.new_dimension('snr', dB(0, 2, 4, 8, 16, 24))\n", "\n", "# Evaluate the BER\n", "simulation.add_evaluator(BitErrorEvaluator(operator, operator))\n", "\n", "# Configure the number of Monte Carlo samples per SNR point\n", "simulation.num_samples = 1000\n", "\n", "# Run the simulation and plot the results\n", "result = simulation.run()\n", "\n", "_ = result.plot()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We can highlight the channel effect by disabling the zero-forcing channel equalization routine for the configured OFDM waveform.\n", "\n", "In this case, the communication bit error rate should roughly approximate $\\tfrac{1}{2}$, indicating that no information is exchanged and the bits are esentially random at the receiver." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from hermespy.modem import OFDMChannelEqualization\n", "\n", "# Disable channel equalization by replacing the ZF routine with the default stub\n", "operator.waveform.channel_equalization = OFDMChannelEqualization()\n", "\n", "# Run the simulation and plot the results\n", "result = simulation.run()\n", "\n", "_ =result.plot()\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.13 ('hermes')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.1" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "15324ae639e283979e39f32b76ef84dde816ef5cb4e81fc04e688fd3d2128060" } } }, "nbformat": 4, "nbformat_minor": 2 }