k-Wave Toolbox |

## Diffraction Through A Slit Example

On this page…
Overview Defining the medium properties Running the simulation Diffraction through a double slit

### Overview

This example illustrates the diffraction of a plane acoustic wave through a slit. It builds on the Monopole Point Source In A Homogeneous Propagation Medium and Simulating Transducer Field Patterns examples.

- open the file in the MATLAB Editor
- run the file in MATLAB

Back to Top

### Defining the medium properties

The current version of k-Wave cannot explicitly enforce impedance boundary conditions. However, rigid boundaries can still be modelled by assigning a boundary with a large sound speed and density compared to the rest of the propagation medium. As this impedance difference is increased, the behaviour of the interface will approach that of a rigid boundary. Note, increasing the sound speed of the boundary will similarly increase the computational requirements (the time step required for a stable simulation is dependent on the maximum sound speed within the medium).

Here, a diffraction slit is created by defining a thin layer with a significantly different sound speed and density to the background medium such that most of the incident wave is reflected. (Note, using `barrier_scale = 20`, some of the incident wave will still be transmitted through the barrier causing additional interference fringes. These can be reduced by increasing the barrier scale.)

    % define the ratio between the barrier and background sound speed and density
    barrier_scale = 20;

    % create the time array using the barrier sound speed
    t_end = 40e-6;                % [s]
    CFL = 0.5;                    % Courant–Friedrichs–Lewy number
    kgrid.t_array = makeTime(kgrid, c0*barrier_scale, CFL, t_end);

    % create a mask of a barrier with a slit
    slit_thickness = 2;                     % [grid points]
    slit_width = 10;                        % [grid points]
    slit_x_pos = Nx - Nx/4;                 % [grid points]
    slit_offset = Ny/2 - slit_width/2 - 1;  % [grid points]
    slit_mask = zeros(Nx, Ny);
    slit_mask(slit_x_pos:slit_x_pos + slit_thickness, 1:1 + slit_offset) = 1;
    slit_mask(slit_x_pos:slit_x_pos + slit_thickness, end - slit_offset:end) = 1;

    % assign the slit to the properties of the propagation medium
    medium.sound_speed = c0*ones(Nx, Ny);
    medium.density = rho0*ones(Nx, Ny);
    medium.sound_speed(slit_mask == 1) = barrier_scale*c0;
    medium.density(slit_mask == 1) = barrier_scale*rho0;

Back to Top

### Running the simulation

In the first example (set `example_number = 1` within the example m-file), a sinusoidal plane wave source is created with a wavelength equal to the slit width. A visualisation of the barrier is also produced by assigning the `slit_mask` created above to the optional input parameter `'DisplayMask'`. The size and location of the perfectly matched layer are explicitly defined (see Controlling The Absorbing Boundary Layer Example), the simulation is run in `single` precision to reduce the computation time (see Optimising k-Wave Performance Example), and the final pressure and velocity fields are returned by `sensor.record` to `{'p_final', 'u_final'}` (see Recording The Particle Velocity Example).

    % set the input options
    input_args = {'PMLInside', false, 'PMLSize', PML_size, 'PlotPML', false, ...
        'DisplayMask', slit_mask, 'DataCast', 'single'};

    % run the simulation
    sensor_data = kspaceFirstOrder2D(kgrid, medium, source, sensor, input_args{:});

A visualisation of the pressure field is given below. The wave field on the far side of the slit appears reasonably omni-directional.

In the second example (set `example_number = 2` within the example m-file), the slit size is increased and the wavelength is reduced to be a quarter of the slit width. A visualisation of the pressure field is given below. In this case, the directionality of the wavefield is increased, and interference fringes are visible.

Back to Top

### Diffraction through a double slit

In the third example (set `example_number = 3` within the example m-file), a double slit is used and the wavelength set equal to the slit width. The final velocity fields are also displayed.

Note, the pictures shown here were computed using `barrier_scale = 50` and `scale = 2` within the example m-file.

Back to Top

© 2009-2014 Bradley Treeby and Ben Cox.