codexhot-wire-spatial-transfer.py
hot-wire-spatial-transfer.py
"""Uniform hot-wire line-average power transfer.
Tested with Python 3.14, NumPy 2.3.5 and Matplotlib 3.10.7.
The horizontal coordinate is length / spatial wavelength along the wire, not
frequency / sample rate. Run via Make in the mirrored media working directory.
"""
from pathlib import Path
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
def power_transfer(length_over_wavelength):
"""Squared transfer of a uniform line average; np.sinc(x)=sin(pi*x)/(pi*x)."""
return np.sinc(np.asarray(length_over_wavelength))**2
def main():
x = np.linspace(0, 2.5, 2001)
fig, ax = plt.subplots(figsize=(8, 4.6), facecolor='white')
ax.set_facecolor('white')
ax.plot(x, power_transfer(x), color='#165f87', linewidth=2.4)
points = [(.25, r'$\lambda_s=4\ell$', (.52, .91)),
(.50, r'$\lambda_s=2\ell$', (.82, .53)),
(1., r'$\lambda_s=\ell$', (1.35, .19))]
for xx, label, text in points:
yy = float(power_transfer(xx))
ax.plot(xx, yy, 'o', color='#a74716', markersize=6)
ax.annotate(f'{label}\nPower fraction {yy:.3f}', xy=(xx, yy), xytext=text,
fontsize=10, ha='left', arrowprops={'arrowstyle':'-', 'color':'#666666'})
ax.set(xlim=(0, 2.5), ylim=(-.025, 1.04),
xlabel=r'Wire length / spatial wavelength, $\ell/\lambda_s$',
ylabel=r'Power transfer $|H|^2$',
title='Spatial averaging by an ideal finite-length hot wire')
ax.set_xticks([0, .25, .5, 1, 1.5, 2, 2.5])
ax.grid(alpha=.20)
ax.spines[['top', 'right']].set_visible(False)
fig.text(.5, .025, 'Uniform linear averaging model; electronics are assumed ideal.',
ha='center', fontsize=10)
fig.subplots_adjust(left=.11, right=.98, bottom=.19, top=.88)
fig.savefig(Path.cwd()/'hot-wire-spatial-transfer.png', dpi=110, facecolor='white')
plt.close(fig)
if __name__ == '__main__':
main()