2.3. Multiplex
Multiplexing can be used to reduce the number of frames T.
This accelerates the recording time
at the cost of increased measurement uncertainty.
2.3.1. Spatial Division Multiplexing
In spatial division multiplexing (SDM) [Par08], the fringes for each direction are additively superimposed,
which results in crossed fringe patterns, cf. Fig. 2.3.
The amplitude B is halved,
i.e. for each direction only have the signal strength is available.
The number of frames T is halved.
1"""Spatial Division Multiplexing.
2
3https://doi.org/10.1117/12.816472
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.v = 10, 13
11f.D = 2
12f.SDM = True
13
14I = f.encode()
15
16# show fringe patterns
17import matplotlib.animation as animation
18from matplotlib import pyplot as plt
19
20fig, ax = plt.subplots()
21ims = [[ax.imshow(frame, cmap="gray", animated=True)] for frame in I]
22ani = animation.ArtistAnimation(fig, ims, interval=250, repeat_delay=1000, repeat=True, blit=True)
23plt.show()
Fig. 2.3 Spatial division multiplexing (SDM).
In the decoding stage, the recorded fringe pattern sequence \(I^*\) is Fourier-transformed and the directions are separated in frequency space. Because this is done within the camera frame of reference, the demultiplexed directions only correspond to the encoded ones when the camera and screen are well aligned, i.e. they must face each other directly. Otherwise, the decoded coordinate directions can not be assigned to the screen axes correctly.
2.3.2. Wavelength Division Multiplexing
In wavelength division multiplexing (WDM) [Hua99],
the shifts are multiplexed into the color channel,
resulting in an RGB fringe pattern, cf. Fig. 2.4.
Therefore it is required that all shifts N \(= 3\).
The number of frames T is cut into thirds.
This works best when an RGB-prism-based camera is used, because its spectral bands don’t overlap and hence the RGB-channels can be separated sharply. Additionally, a white balance has to be executed to ensure equal irradiance readings in all color channels.
Also, the effect of color absorption by the surface material cannot be neglected. This means that the test object itself must not have any color.
Overall, less light is available per pixel because it is divided into the three color channels. Therefore, it requires about 3 times the exposure time compared to grayscale patterns.
1"""Wavelength Division Multiplexing.
2
3https://doi.org/10.1117/1.602151
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.N = 3
11f.WDM = True
12
13I = f.encode()
14
15# show fringe patterns
16import matplotlib.animation as animation
17from matplotlib import pyplot as plt
18
19fig, ax = plt.subplots()
20ims = [[ax.imshow(frame, animated=True)] for frame in I]
21ani = animation.ArtistAnimation(fig, ims, interval=250, repeat_delay=1000, repeat=True, blit=True)
22plt.show()
Fig. 2.4 Wavelength division multiplexing (WDM).
Spatial and wavelength division multiplexing can be used together [Tru16].
If only one set K \(= 1\) per direction is used,
only one frame T \(= 1\) is necessary, cf. Fig. 2.5.
This allows single shot applications to be implemented.
1"""Spatial and Wavelength Division Multiplexing.
2
3https://doi.org/10.1364/OE.24.027993
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.v = 10
11f.D = 2
12f.K = 1
13f.SDM = True
14f.N = 3
15f.WDM = True
16print(f.T) # it consists of one frame only -> single shot application
17
18I = f.encode()
19
20# show fringe patterns
21from matplotlib import pyplot as plt
22
23plt.figure()
24plt.imshow(I[0]) # first frame is only frame
25plt.show()
Fig. 2.5 Spatial and wavelength division multiplexing combined.
2.3.3. Frequency Division Multiplexing
In frequency division multiplexing (FDM) [Liu14b], [Liu10],
the directions D
and the sets K are additively superimposed.
Hence, the amplitude B is reduced
by a factor of D \(*\) K.
This results in crossed fringe patterns if we have D \(= 2\) directions,
cf. Fig. 2.6 and Fig. 2.8.
Each set \(k\) per direction \(d\) receives an individual temporal frequency \(f_{d,k}\), which is used in temporal demodulation to distinguish the individual sets. A minimal number of shifts \(N_{min} \ge \lceil 2 * f_{max} \rceil + 1\) is required to satisfy the sampling theorem.
1"""Frequency Division Multiplexing (2 directions, 1 set).
2
3https://doi.org/10.1515/aot-2014-0032
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.v = 10
11f.f = [[1], [2]]
12f.D = 2
13f.K = 1
14f.N = 5 # 2 * max(f.f) + 1
15f.FDM = True
16
17I = f.encode()
18
19# show fringe patterns
20import matplotlib.animation as animation
21from matplotlib import pyplot as plt
22
23fig, ax = plt.subplots()
24ims = [[ax.imshow(frame, cmap="gray", animated=True)] for frame in I]
25ani = animation.ArtistAnimation(fig, ims, interval=250, repeat_delay=1000, repeat=True, blit=True)
26plt.show()
Fig. 2.6 Frequency division multiplexing (FDM). Two directions are superimposed.
1"""Frequency Division Multiplexing (1 direction, 2 sets).
2
3https://doi.org/10.1364/OE.18.005229
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.v = 10, 13
11f.f = 1, 2
12f.D = 1
13f.K = 2
14f.N = 5 # 2 * max(f.f) + 1
15f.FDM = True
16
17I = f.encode()
18
19# show fringe patterns
20import matplotlib.animation as animation
21from matplotlib import pyplot as plt
22
23fig, ax = plt.subplots()
24ims = [[ax.imshow(frame, cmap="gray", animated=True)] for frame in I]
25ani = animation.ArtistAnimation(fig, ims, interval=250, repeat_delay=1000, repeat=True, blit=True)
26plt.show()
Fig. 2.7 Frequency division multiplexing (FDM). Two sets are superimposed.
1"""Frequency Division Multiplexing (2 directions, 2 sets).
2
3https://publikationen.bibliothek.kit.edu/1000088264
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.v = [[10, 13], [10, 13]]
11f.f = [[1, 2], [3, 4]]
12f.D = 2
13f.K = 2
14f.N = 9 # 2 * max(f.f) + 1
15f.FDM = True
16
17I = f.encode()
18
19# show fringe patterns
20import matplotlib.animation as animation
21from matplotlib import pyplot as plt
22
23fig, ax = plt.subplots()
24ims = [[ax.imshow(frame, cmap="gray", animated=True)] for frame in I]
25ani = animation.ArtistAnimation(fig, ims, interval=250, repeat_delay=1000, repeat=True, blit=True)
26plt.show()
Fig. 2.8 Frequency division multiplexing (FDM). Two directions and two sets are superimposed.
If one wants a static pattern, i.e. one that remains congruent when phase shifted,
the spatial frequencies must be integers:
v \(\in \mathbb{N}\),
must not share any common divisor except one:
\(gcd(\) v \()= 1\),
and the temporal frequencies must equal the spatial ones:
v \(=\) f.
With static/congruent patterns, one can realize phase shifting by moving printed patterns [Klu18].
1"""Frequency Division Multiplexing (2 directions, 2 sets, static pattern).
2
3https://publikationen.bibliothek.kit.edu/1000088264
4"""
5
6from fringes import Fringes
7
8f = Fringes()
9f.X = f.Y = 1024
10f.v = [[5, 13], [7, 11]]
11f.f = f.v
12f.D = 2
13f.K = 2
14f.N = 27 # 2 * max(f.f) + 1
15f.FDM = True
16f.static = True
17
18I = f.encode()
19
20# show fringe patterns
21import matplotlib.animation as animation
22from matplotlib import pyplot as plt
23
24fig, ax = plt.subplots()
25ims = [[ax.imshow(frame, cmap="gray", animated=True)] for frame in I]
26ani = animation.ArtistAnimation(fig, ims, interval=250, repeat_delay=1000, repeat=True, blit=True)
27plt.show()
Fig. 2.9 Frequency division multiplexing (FDM). Two directions and two sets are superimposed. This is a static pattern which remains congruent when phase shifted.