How to Use Spatial Filters and Absorbing Boundaries
|Top Previous Next|
In the wave optics modeling paradigm, on which LightLike is based, optical wavefronts are modeled using two-dimensional complex grids, and modeling optical propagation involves performing Fast Fourier transforms (FFTs) and applying quadratic phase factors to those meshes. This gives rise to a number of requirements related to the properties of the FFT, proper sampling of both the wavefront and the quadratic phase factors, most of which are discussed in how to choose parameter settings for modeling optical propagation. One of the most basic requirements relates to the fact that the meshes are necessarily very limited in extent, and while some of the light sources we wish to model are collimated, such as lasers, others are not, such as point sources, and the reflected return from an optically rough surface. These cases require special modeling techniques, and some of these techniques involve the use of spatial filters and/or absorbing boundaries; the purpose of this section is to explain how this can be done in LightLike. However the default techniques used by LightLike (see how point sources are modeled and how speckle is modeled) do not require the use of spatial filters or absorbing boundaries, so if you intend to use the default techniques you can skip this section.
The main reason you might wish to use spatial filters and/or absorbing boundaries is that under some circumstances it may allow you to use a smaller propagation mesh than would otherwise be required, and this can translate into a very substantial reduction in execution time. A spatial filter is a multiplicative weighting function applied in the spatial frequency domain; an absorbing boundary is a multiplicative weighting function applied in the spatial frequency domain. Applying spatial filter limits the angular spread of the light from all points on the mesh; applying an absorbing boundary removes light that approaches the boundary of the mesh. In each case the point is to ensure that no light reaches the edge of the mesh, because if it did, it would then reappear on the other side of the mesh, because of the periodicity of the FFT, leading to erroneous results. However you must take care to ensure that the use of filters and absorbing boundaries does not itself introduce errors, and in that we can offer little guidance, except to compare your results with those obtained without using either, but using a more conservative mesh. That said, some of the most experienced and respected experts in wave optics find spatial filters and absorbing boundaries to be invaluable tools.
LightLike allows you to specify one set of spatial filters and absorbing boundaries to be used for modeling the light from every light source in your system model, or to specify different filters and boundaries for specific sources. In both cases this is done using one or more Propagation Controllers, as described in how to choose parameter settings for modeling optical propagation. Three parameters of PropagationController are used:
oneTimeSpatialFilter (specifies a spatial filter to be applied on the first propagation step)
spatialFilter (specifies a spatial filter to be applied on each propagation step)
absorbingBoundary (specifies an absorbing boundary to be applied on each propagation step)
Note that each of these parameters has the same default value, "NullFilter()"; this means that by default no spatial filter or absorbing boundary will be applied.
Note also that each of these parameters are of the same data type, "const Filter&". That syntax will probably look a bit odd to those not familiar to C++, but it serves a useful purpose: it makes it very easy to add new types of filters, in case those we already support do not meet your requirements. At present, LightLike supports three types of Filters:
Note that both of the non-null filters are defined relative to the size of the propagation mesh. In the case of an absorbing boundary this is just the spatial extent of the mesh in meters, equal to the product of the mesh spacing and the mesh dimension. Thus applying an absorbing boundary defined by the expression "LinkRaisedCosineFilter(0.9)" to a 256x256 mesh with a 2cm spacing, a total of 5.12m across, would result in a 4.096 m central region with unity transmission, surrounded on all sides by a 0.256 boundary where transmission falls from unity to zero, then another 0.256 boundary with zero transmission, extending to the edge of the mesh. Spatial filters, on the other hand, are applied in the spatial frequency domain, after a Fast Fourier Transform (FFT) has been applied to the propagation mesh. In the spatial frequency domin, each point on the mesh corresponds to a different propagation direction, where the largest spatial frequencies correspond to the widest propagation angles. The extreme propagation angles are given by +/- .5l/dxy, where l is the wavelength of the light and dxy is the mesh spacing. Thus applying a spatial filter defined by the same expression as above and to the same mesh as before, but in the spatial frequency domain, would result in unity transmission over an angular region bounded by +/- 4l/dxy, surrounded on all sides by a 0.05l/dxy region where transmission drops gradually to zero, and another 0.05l/dxy region with zero transmission.
At one point we anchored LightLike to ACS, another wave optics modeling code, for a case that involved the use of both spatial filters and absorbing boundaries, as specified by Don Link, the author of the other code. The scenario parameters were as follows:
In the initial propagation, from the beacon to the first phase screen, a frequency domain filter was applied to limit the angular spread of the field. The exact form of the filter was a "raised cosine", unity in the center, zero at the edges, with a half cosine wave as transition. The full width of the nonzero region, expressed as an angle, was 1.5*nxy*dxy / z, while the width of the cosine transition regions on either side were 0.05*nx*dq, where dq = l / (nxy*dxy). After completing the propagation, a spatial domain filter, also a raised cosine, was applied. In this case, the full width of the nonzero region was 0.9*nxy*dxy, while the transition regions were .05*nxy*dxy. On the second and subsequent propagations a different frequency domain filter was used, where the width of the transition regions was unchanged, while the width of the nonzero region was 0.95*nx*dq. The same spatial domain filter was used in each propagation.
To implement this in LightLike, we used a PropagationController with the parameters spatialFilter and absorbingBoundary set to "LinkRaisedCosineFilter(0.9)" and "LinkRaisedCosineFilter(0.95)", respectively, and setting oneTimeSpatialFilter to "LinkRaisedCosineFilter(0.6844)". The last setting was obtained by dividing the width of the desired nonzero region by the size of the angular region corresponding to the FFT of the propagation mesh, taking into account the fact that each spatial frequency is related to a specific propagation angle by the wavelength: ratio_nonzero = (1.5*nxy*dxy / z) / (l/dxy) = 0.6844. Also, we used non-default techniques for modeling both point sources and speckle, designated by "MESH_POINT_PSM" and "DELTA_CORRELATED_SM", respectively, as described in how point sources are modeled and how speckle is modeled; both these techniques are designed to be used in combination with spatial filters and absorbing boundaries. Neither technique makes use of the parameters superApDiameter or edgeSigma, so we can set both to zero.
For the particular case we used in anchoring, the above choice of filters and absorbing boundaries seemed to work well, and allowed us to use a smaller propagation mesh than otherwise would have been necessary. Unfortunately, we cannot at this time offer general recommendations about what types of filters and absorbing boundaries will work for different propagation scenarios, and how that would affect the choice of other propagation parameters, such as the mesh size and spacing.