{ "cells": [ { "cell_type": "markdown", "id": "fa4ee7d6-e7f7-423c-a40f-c267697a5acf", "metadata": {}, "source": [ "# Single-mode fiber coupling\n", "\n", "In this notebook, we calculate the coupling efficiency of a beam with a single-mode optical fiber assuming no internal losses.\n", "\n", "Then, we see how to choose the focal length that maximizes the coupling efficiency." ] }, { "cell_type": "code", "execution_count": 1, "id": "e6aee73d-a332-4a95-ae66-a00f9812faa6", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "e5e9b7a2-9e22-4cfc-bf5d-649325c85600", "metadata": {}, "source": [ "Here, we define some functions to model the beam and the fiber mode." ] }, { "cell_type": "code", "execution_count": 2, "id": "7740f482-7b19-4c67-8168-df6931473d79", "metadata": {}, "outputs": [], "source": [ "def multivar_gaussian(X, Y, M1, M2):\n", "\n", " S = np.asarray([X, Y])\n", " S = np.moveaxis(S, 0, 2) - M1\n", "\n", " A = np.linalg.inv(M2)\n", "\n", " B = np.einsum('ij, lmj -> ilm', A, S)\n", " C = np.einsum('ijk, kij -> ij', S, B)\n", "\n", " g = np.exp(- 0.5 * C)\n", "\n", " return g\n", "\n", "\n", "def elliptical_beam(fov, n_pixels, waist, wavelength = 640e-9, focal_length = None):\n", "\n", " sigma = np.asarray(waist) / 4\n", " var = 2 * sigma**2\n", " \n", " if focal_length is not None:\n", " var = wavelength**2 * focal_length **2 / ( 4* np.pi**2 * var )\n", " \n", " var_matrix = np.matrix([[var[0], 0], [0, var[1]]])\n", "\n", " x = np.linspace(-0.5*fov, 0.5*fov, num = n_pixels)\n", " xx, yy = np.meshgrid(x, x)\n", " \n", " g = multivar_gaussian(xx, yy, [0, 0], var_matrix)\n", "\n", " return g / g.max()\n", "\n", "\n", "def fiber_mode(fov, n_pixels, mfd):\n", " \n", " sigma = mfd / 4\n", " var = 2 * sigma**2\n", " var_matrix = np.matrix([[var, 0], [0, var]])\n", "\n", " x = np.linspace(-0.5*fov, 0.5*fov, num = n_pixels)\n", " xx, yy = np.meshgrid(x, x)\n", "\n", " g = multivar_gaussian(xx, yy, [0, 0], var_matrix)\n", "\n", " return g / g.max()\n", "\n", "\n", "def overlap_integral(e1, e2):\n", "\n", " overlap = np.abs( np.sum( e1.conj() * e2 ) )**2\n", " i1 = np.sum(np.abs(e1)**2)\n", " i2 = np.sum(np.abs(e2)**2)\n", "\n", " return overlap / i1 / i2" ] }, { "cell_type": "markdown", "id": "16b67b25-f582-42cf-9758-cec1de91a479", "metadata": {}, "source": [ "In this example, we consider an elliptical Gaussian beam. However, the method exposed in this notebook is general and can be used for any beam shape." ] }, { "cell_type": "code", "execution_count": 3, "id": "c2beafb4-a668-419d-9a98-2c1ea659adb3", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "mfd = 2e-6 # mode field diameter, meters\n", "waist = np.asarray([1.5, 3.5]) * 1e-3 # beam size defined as 1/e^2 or 4sigma, meters\n", "wavelength = 640e-9 # meters" ] }, { "cell_type": "markdown", "id": "2adaf3e8-d9ab-47b1-9e25-f3767a2f89a4", "metadata": {}, "source": [ "We choose a focal length and define the field of view for the simulation" ] }, { "cell_type": "code", "execution_count": 4, "id": "415d4d84-d19c-41ba-97ad-acb607e9ef48", "metadata": {}, "outputs": [], "source": [ "focal_length = 10e-3 # meters\n", "fov = 4*mfd # meters\n", "n_pixels = 1000" ] }, { "cell_type": "code", "execution_count": 5, "id": "6962f3b3-9be0-4d92-bf29-c8b443a4f813", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "g = elliptical_beam(fov, n_pixels, waist, wavelength = wavelength, focal_length = focal_length)\n", "\n", "m = fiber_mode(fov, n_pixels, mfd)\n", "\n", "extent = (-0.5*fov*1e6, 0.5*1e6*fov, -0.5*1e6*fov, 0.5*1e6*fov)\n", "\n", "plt.figure(figsize = (8, 8))\n", "l1 = plt.contour(g, [g.max()/np.exp(2)], cmap = 'autumn', extent = extent)\n", "l2 = plt.contour(m, [m.max()/np.exp(2)], cmap = 'cool', extent = extent)\n", "plt.gca().set_aspect('equal')\n", "plt.xlabel(r'x ($\\mu m)$')\n", "plt.ylabel(r'y ($\\mu m)$')\n", "plt.title('Fiber core plane')\n", "\n", "plt.gca().clabel(l1, l1.levels, fmt = 'Beam', inline=True, fontsize=10)\n", "plt.gca().clabel(l2, l2.levels, fmt = 'Fiber', inline=True, fontsize=10)" ] }, { "cell_type": "markdown", "id": "cf180647-53fd-4a39-814a-9c8b1ca9e5e6", "metadata": {}, "source": [ "The coupling efficiency is given by the normalized overlap integral\n", "$$\\eta = \\frac{{{{\\left| {\\int {E_1^*{E_2}\\;{\\rm{d}^2}x} } \\right|}^2}}}{{\\int {{{\\left| {{E_1}} \\right|}^2}{\\rm{d}^2}x\\;\\int {{{\\left| {{E_2}} \\right|}^2}{\\rm{d}^2}x} } }} $$\n", "where $E_1$ is the electric field of the incident beam and $E_2$ is the mode supported by the single-mode optical fiber." ] }, { "cell_type": "code", "execution_count": 6, "id": "22e7e29f-54cd-4a55-97c2-f4cc882a69bb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coupling efficiency = 0.643\n" ] } ], "source": [ "coupling_efficiency = overlap_integral(g, m)\n", "print(f'Coupling efficiency = {coupling_efficiency:.3f}')" ] }, { "cell_type": "markdown", "id": "31364c8b-8499-40d8-8cf7-f8433168faf2", "metadata": {}, "source": [ "Now, we define a function that looks for the focal lenght that maximizes the efficiency." ] }, { "cell_type": "code", "execution_count": 7, "id": "bc3eb52f-dd18-4143-ab58-808c844d89fb", "metadata": {}, "outputs": [], "source": [ "from scipy.optimize import minimize\n", "\n", "def loss_function(focal_length, fov, n_pixels, mfd, waist, wavelength):\n", "\n", " g = elliptical_beam(fov, n_pixels, waist, wavelength, focal_length)\n", " m = fiber_mode(fov, n_pixels, mfd)\n", "\n", " efficiency = overlap_integral(g, m)\n", " loss = np.abs(1 - efficiency)\n", "\n", " return loss\n", "\n", "\n", "def find_focal_length(f0, mfd, waist, wavelength):\n", "\n", " fov = 4*mfd\n", " n_pixels = 501\n", " \n", " result = minimize(loss_function, x0=f0, args = (fov, n_pixels, mfd, waist, wavelength))\n", "\n", " return result" ] }, { "cell_type": "markdown", "id": "4e27adac-f84b-45d7-b594-c5c0ed6badd3", "metadata": {}, "source": [ "Using a single-valued starting point, the algorithm looks for a single focal length, assumed to be identical on both axes." ] }, { "cell_type": "code", "execution_count": 8, "id": "a1aefed6-e88e-4773-b981-b8b2d30a1d37", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " message: Optimization terminated successfully.\n", " success: True\n", " status: 0\n", " fun: 0.15999987071906707\n", " x: [ 5.624e-03]\n", " nit: 7\n", " jac: [ 4.053e-06]\n", " hess_inv: [[ 2.244e-05]]\n", " nfev: 28\n", " njev: 14\n" ] } ], "source": [ "f0 = 1e-2 #starting point, meters \n", "#f0 = np.asarray([1e-2, 1e-2]) # if initialized with 2-elements array, it returns two focal lenghts\n", "\n", "result = find_focal_length(f0, mfd, waist, wavelength)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 9, "id": "24ca0e9e-8580-4d6c-a80b-dd0561d5e666", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal focal length = [5.62] mm\n" ] } ], "source": [ "foc = np.asarray(result.x)\n", "print('Optimal focal length = ' + np.array2string(1e3*foc, precision=2, separator = ', ') + ' mm')" ] }, { "cell_type": "markdown", "id": "f742dda3-b730-4df3-bf0b-a925bbcc101a", "metadata": {}, "source": [ "We plot the overlap of the beam and the fiber mode with the optimal focal length" ] }, { "cell_type": "code", "execution_count": 10, "id": "8126f56a-d2fd-44c7-8284-0fe036da9206", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "g = elliptical_beam(fov, n_pixels, waist, wavelength = wavelength, focal_length = foc)\n", "m = fiber_mode(fov, n_pixels, mfd)\n", "\n", "plt.figure(figsize = (8, 8))\n", "l1 = plt.contour(g, [g.max()/np.exp(2)], cmap = 'autumn', extent = extent)\n", "l2 = plt.contour(m, [m.max()/np.exp(2)], cmap = 'cool', extent = extent)\n", "plt.gca().set_aspect('equal')\n", "plt.xlabel(r'x ($\\mu m)$')\n", "plt.ylabel(r'y ($\\mu m)$')\n", "plt.title('Fiber core plane')\n", "\n", "plt.gca().clabel(l1, l1.levels, fmt = 'Beam', inline=True, fontsize=10)\n", "plt.gca().clabel(l2, l2.levels, fmt = 'Fiber', inline=True, fontsize=10)" ] }, { "cell_type": "markdown", "id": "e74d6eaa-e7f1-4a77-8f18-91b8f7e9eb6f", "metadata": {}, "source": [ "The best coupling efficiency is" ] }, { "cell_type": "code", "execution_count": 11, "id": "a96e6b0d-2e79-4e92-a187-03cc964ab78e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal coupling efficiency = 0.840\n" ] } ], "source": [ "coupling_efficiency = overlap_integral(g, m)\n", "print(f'Optimal coupling efficiency = {coupling_efficiency:.3f}')" ] }, { "cell_type": "markdown", "id": "a725c79b-6957-478d-9d9f-d61c944926d4", "metadata": {}, "source": [ "Using a starting point with two values, the algorithm looks for a different focal length for each axis." ] }, { "cell_type": "code", "execution_count": 12, "id": "a4494282-d370-45ec-b9b6-a2f8417566e0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " message: Optimization terminated successfully.\n", " success: True\n", " status: 0\n", " fun: 2.360334150353083e-12\n", " x: [ 3.682e-03 8.590e-03]\n", " nit: 8\n", " jac: [ 7.607e-06 9.462e-07]\n", " hess_inv: [[ 1.382e-05 1.823e-07]\n", " [ 1.823e-07 7.392e-05]]\n", " nfev: 51\n", " njev: 17\n" ] } ], "source": [ "f0 = np.asarray([1e-2, 1e-2]) \n", "\n", "result = find_focal_length(f0, mfd, waist, wavelength)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 13, "id": "0ffd6a28-09bf-490b-86a4-ea6f67460301", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal focal lengths = [3.68, 8.59] mm\n" ] } ], "source": [ "foc = np.asarray(result.x)\n", "print('Optimal focal lengths = ' + np.array2string(1e3*foc, precision=2, separator = ', ') + ' mm')" ] }, { "cell_type": "code", "execution_count": 14, "id": "9998e235-4850-488a-917a-1e16d3d40e4b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "g = elliptical_beam(fov, n_pixels, waist, wavelength = wavelength, focal_length = foc)\n", "m = fiber_mode(fov, n_pixels, mfd)\n", "\n", "plt.figure(figsize = (8, 8))\n", "l1 = plt.contour(g, [g.max()/np.exp(2)], cmap = 'autumn', extent = extent)\n", "l2 = plt.contour(m, [m.max()/np.exp(2)], cmap = 'cool', extent = extent)\n", "plt.gca().set_aspect('equal')\n", "plt.xlabel(r'x ($\\mu m)$')\n", "plt.ylabel(r'y ($\\mu m)$')\n", "plt.title('Fiber core plane')\n", "\n", "plt.gca().clabel(l1, l1.levels, fmt = 'Beam', inline=True, fontsize=10)\n", "plt.gca().clabel(l2, l2.levels, fmt = 'Fiber', inline=True, fontsize=10)" ] }, { "cell_type": "code", "execution_count": 15, "id": "14debbd5-7b24-419e-88df-0ec1707cb51a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal coupling efficiency = 1.000\n" ] } ], "source": [ "coupling_efficiency = overlap_integral(g, m)\n", "print(f'Optimal coupling efficiency = {coupling_efficiency:.3f}')" ] }, { "cell_type": "markdown", "id": "9aa94d40-0fc1-4baa-9136-320dc1a2ab90", "metadata": {}, "source": [ "In the case of Gaussian beam, the optimal focal length can be calculated analytically without the need for a numerical minimizer.\n", "\n", "The focal length that maximizes the coupling efficiency is\n", "\n", "$$ f = \\frac{\\pi w \\mu }{4\\lambda}$$\n", "\n", "where $\\lambda$ is the wavelength of the beam, $\\mu$ is the mode field diameter (MFD) of the optical fiber, and $w$ is the beam waist (4$\\sigma$) measured at the aperture plane of the lens.\n", "\n", "If the beam is elliptical, the effective waist is calculated as the geometrical mean of the waist on the two axes.\n", "\n", "$$w = \\sqrt{ w_x \\cdot w_y }$$" ] }, { "cell_type": "code", "execution_count": 16, "id": "5b4e1812-92aa-4360-8fa6-73055db5ff68", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal focal length = 5.62 mm\n" ] } ], "source": [ "# analytic solution\n", "\n", "waist_eff = np.sqrt( np.prod( waist ) ) # geometric mean of the waist on the 2 axes\n", "\n", "optimal_focal_length = np.pi*waist_eff*mfd/wavelength/4 # meters\n", "\n", "print('Optimal focal length = ' + np.array2string(1e3*optimal_focal_length, precision=2, separator = ', ') + ' mm')" ] }, { "cell_type": "code", "execution_count": 17, "id": "59911b68-1fdf-44e4-83f1-8c0fb7c83729", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal focal lengths = [3.68, 8.59] mm\n" ] } ], "source": [ "optimal_focal_length = np.pi*waist*mfd/wavelength/4 # meters\n", "\n", "print('Optimal focal lengths = ' + np.array2string(1e3*optimal_focal_length, precision=2, separator = ', ') + ' mm')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.2" } }, "nbformat": 4, "nbformat_minor": 5 }