# Secondary Sources¶

The Toolbox comes with a function which can generate different common shapes of loudspeaker arrays for you. At the moment linear, circular, box shaped and spherical arrays are supported.

Before showing the different geometries, we start with some common settings. First we get a configuration struct and set the array size/diameter to 3 m.

conf = SFS_config;
conf.secondary_sources.size = 3;


## Linear array¶

conf = SFS_config;
conf.secondary_sources.geometry = 'line'; % or 'linear'
conf.secondary_sources.number = 21;
x0 = secondary_source_positions(conf);
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2 1]);
%print_png('img/secondary_sources_linear.png');


Fig. 1 Linear loudspeaker array with a length of 3m consiting of 21 loudspeakers.

You can also create logarithmic spacing for a linear array setting conf.secondary_sources.logspread different from its default value of 1.0. For values smaller than 1 the secondary sources will be more dense at the edges of the array, whereas for larger values they will be more dense at the center.

conf = SFS_config;
conf.secondary_sources.geometry = 'line';
conf.secondary_sources.number = 21;
x0 = secondary_source_positions(conf);
figure;
figsize(504,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2 1]);
%print_png('img/secondary_sources_linear_log.png');


Fig. 2 Linear loudspeaker array with a length of 3m consiting of 21 logarithmically spaced loudspeakers.

## Circular array¶

conf = SFS_config;
conf.secondary_sources.geometry = 'circle'; % or 'circular'
conf.secondary_sources.number = 56;
x0 = secondary_source_positions(conf);
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2 2]);
%print_png('img/secondary_sources_circle.png');


Fig. 3 Circular loudspeaker array with a diameter of 3m consiting of 56 loudspeakers.

## Box shaped array¶

conf = SFS_config;
conf.secondary_sources.geometry = 'box';
conf.secondary_sources.number = 84;
x0 = secondary_source_positions(conf);
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2 2]);
%print_png('img/secondary_sources_box.png');


Fig. 4 Box shaped loudspeaker array with a diameter of 3m consisting of 84 loudspeakers.

## Box shaped array with rounded edges¶

conf.secondary_sources.edge_radius defines the bending radius of the corners. It can be chosen in a range between 0.0 and the half of conf.secondary_sources.size. While the prior represents a square box the latter yields a circle. Note that the square box behaves it little bit different than the Box Shaped Array since loudspeakers might also be place directly in the corners of the box.

conf = SFS_config;
conf.secondary_sources.geometry = 'rounded-box';
conf.secondary_sources.number = 84;
x0 = secondary_source_positions(conf);
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2 2]);
%print_png('img/secondary_sources_rounded-box.png');


Fig. 5 Box shaped loudspeaker array with rounded edges. It has again a diameter of 3m, consists of 84 loudspeakers and has a edge bending factor of 0.3.

## Spherical array¶

For a spherical array you need a grid to place the secondary sources on the sphere. At the moment we provide grids with the Toolbox, that can be found in the corresponding folder of the data repository. You have to specify your desired grid, for example conf.secondary_sources.grid = 'equally_spaced_points'. The secondary_source_positions() functions will then automatically download the desired grid from that web page and stores it under <\$SFS_MAIN_PATH>/data. If the download is not working (which can happen especially under Matlab and Windows) you can alternatively checkout or download the whole data repository to the data folder, or use the gauss grid which is calculated on the fly.

conf = SFS_config;
conf.secondary_sources.size = 3;
conf.secondary_sources.geometry = 'sphere'; % or 'spherical'
conf.secondary_sources.grid = 'equally_spaced_points';
conf.secondary_sources.number = 225;
x0 = secondary_source_positions(conf);
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2 2]);
%print_png('img/secondary_sources_sphere.png');


Fig. 6 Spherical loudspeaker array with a diameter of 3m consiting of 225 loudspeakers arranged on a grid with equally spaced points.

## Arbitrary shaped arrays¶

You can create arbitrarily shaped arrays by setting conf.secondary_sources.geometry to 'custom' and define the values of the single loudspeaker directly in the conf.secondary_sources.x0 matrix. The rows of the matrix contain the single loudspeakers and the six columns are [x y z nx ny nz w], the position and direction and weight of the single loudspeakers. The weight w is a factor the driving function of this particular loudspeaker is multiplied with in a function that calculates the sound field from the given driving signals and secondary sources. For WFS w could include the tapering window, a spherical grid weight, and the $$r^2 \cos(\theta)$$ weights for integration on a sphere.

conf = SFS_config;
% create a stadium like shape by combining two half circles with two linear
% arrays
% first getting a full circle with 56 loudspeakers
conf.secondary_sources.geometry = 'circle';
conf.secondary_sources.number = 56;
conf.secondary_sources.x0 = [];
x0 = secondary_source_positions(conf);
% store the first half cricle and move it up
x01 = x0(2:28,:);
x01(:,2) = x01(:,2) + ones(size(x01,1),1)*0.5;
% store the second half circle and move it down
x03 = x0(30:56,:);
x03(:,2) = x03(:,2) - ones(size(x03,1),1)*0.5;
% create a linear array
conf.secondary_sources.geometry = 'line';
conf.secondary_sources.number = 7;
conf.secondary_sources.size = 1;
x0 = secondary_source_positions(conf);
% rotate it and move it left
R = rotation_matrix(pi/2);
x02 = [(R*x0(:,1:3)')' (R*x0(:,4:6)')'];
x02(:,1) = x02(:,1) - ones(size(x0,1),1)*1.5;
x02(:,7) = x0(:,7);
% rotate it the other way around and move it right
R = rotation_matrix(-pi/2);
x04 = [(R*x0(:,1:3)')' (R*x0(:,4:6)')'];
x04(:,1) = x04(:,1) + ones(size(x0,1),1)*1.5;
x04(:,7) = x0(:,7);
% combine everything
conf.secondary_sources.geometry = 'custom';
conf.secondary_sources.x0 = [x01; x02; x03; x04];
% if we gave the conf.x0 to the secondary_source_positions function it will
% simply return the defined x0 matrix
x0 = secondary_source_positions(conf);
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2.5 2.5]);
%print_png('img/secondary_sources_arbitrary.png');


Fig. 7 Custom arena shaped loudspeaker array consiting of 70 loudspeakers.

## Plot loudspeaker symbols¶

For two dimensional setups you can plot the secondary sources with loudspeaker symbols, for example the following will replot the last array.

conf.plot.realloudspeakers = true;
figure;
figsize(540,404,'px');
draw_loudspeakers(x0,conf);
axis([-2 2 -2.5 2.5]);
%print_png('img/secondary_sources_arbitrary_realloudspeakers.png');


Fig. 8 Custom arena shaped loudspeaker array consiting of 70 loudspeakers, plotted using loudspeaker symbols instead of circles for the single loudspeakers.