# How to inject a 2D plane sine wave to the array of seismic sensors?

I've several sensors positioned at various points in the $$X$$,$$Y$$-Cartesian coordinate system, and I've experienced a problem to inject a planar Sine wave to the spatially positioned sensors, the sensor position has known to me and I provide the sensor position as follows:

x = [2.1, 2.1, -0.7, -2.1, -2.1, -0.7, -0.7, 0.6, -5.7, -8.5, -11.4, -7.7, -6.3, -3.5, -2.1, -3.4, 5.4, -5.2, -8.9, -10,
-10, 5.4, 5.4, -0.8, -3.6, -6.2, -6.8, -12.2, -17.1, -19, -18.6, -13.5, 14.8, 14.8]
y = [6.65, 4.15, 3.65, 5.05, 7.25, 8.95, 11.85, 8.95, -2, -0.6, -0.9, 1.25, 2.9, 0.9, -0.1, -1.4, 9.2, 5.2, 4.8, 6.1,
8.9, 13.3, 17.1, 17.9, 13.8, -9.3, -5.2, -3.6, -3.6, -0.9, 3.7, 3.7, -1.8, 5.7]


The sensor's position is at irregular intervals and spatial resolution has not been maintained here. What would be the possible approach to inject a plane wave to these sensors structure?

The equation for the 2D Sine wave is, $$Z = A \sin(k_x X + k_y Y - \omega t)$$, Wavenumber,$$K = 2 \pi f/c$$, for example, the temporal frequency, $$f = 10$$ Hz or $$50$$ Hz, and speed of the wave vector,$$c = 50$$ m/s, now if I draw the 2D K-space plot with the following script

f = 10;         # frequency
fs = 100;       # sample frequency
Ts = 1/ fs;  # sample period
t = np.arange(0, 25, Ts);  # time index
lamda = 12  # Meters
c = f * lamda  # 40; # speed of wave
w = 2 * np.pi * f;  # angular frequency
k = w / c  # 2*np.pi/lamda        # wave number
amp = 1
x = [2.1, 2.1, -0.7, -2.1, -2.1, -0.7, -0.7, 0.6, -5.7, -8.5, -11.4, -7.7, -6.3, -3.5, -2.1, -3.4, 5.4, -5.2, -8.9, -10,
-10, 5.4, 5.4, -0.8, -3.6, -6.2, -6.8, -12.2, -17.1, -19, -18.6, -13.5, 14.8, 14.8]
y = [6.65, 4.15, 3.65, 5.05, 7.25, 8.95, 11.85, 8.95, -2, -0.6, -0.9, 1.25, 2.9, 0.9, -0.1, -1.4, 9.2, 5.2, 4.8, 6.1,
8.9, 13.3, 17.1, 17.9, 13.8, -9.3, -5.2, -3.6, -3.6, -0.9, 3.7, 3.7, -1.8, 5.7]

dx = np.array(x);
M = len(dx)
dy = np.array(y);
N = len(dy)
[xx, yy] = np.meshgrid(x, y);
theta = 60;  # in degrees:::  direction of propagation
kxx = k * np.around(np.cos(math.radians(theta)), decimals=3)  # use this method to find exact Zero
kyy = k * np.around(np.sin(math.radians(theta)), decimals=3)
# Single 2D sine wave data
t = 0.5
sig = np.sin(kxx * xx + kyy * yy - w * t);  # plane wave
plt.figure()
c = plt.imshow(sig, cmap='seismic', vmin=sig.min(), vmax=sig.max(),
extent=[min(x), max(x), min(y), max(y)],
interpolation='nearest', origin='lower')  #
plt.colorbar(c)
plt.rcParams.update({'font.size': 18})
plt.xlabel("Distance, $$X$$-axis [Meter]", fontsize=18)
plt.ylabel("Distance,$$Y$$-axis [Meter]", fontsize=18)
plt.title(f'injected Wave_angle={theta}_degree', weight="bold")  # 'Channel %d' %i
figure = plt.gcf()
figure.set_size_inches(13, 8)


When the angle of propagation= 0 degree then the injected plane wave looks as and when the angle of propagation= 60 degree then the injected plane wave looks as .

Is that the right process to inject the array of sensors? In which process the noise/non-periodicity can be removed from the figures? Thanks in advance.

I am not sure what exactly you mean by "inject a plane wave to the sensors". I will assume that you just want to find the signals captured by the sensors positioned at the specified positions in 2D Cartesian plane when the sound field is a plane monochromatic wave.

The equation providing the wavefield for such a case is

$$p(x, y, t) = A e^{-j \left( k_{x} \cos \left(\theta\right) x + k_{y} \sin \left(\theta\right) y \right)} e^{-j \omega t}$$

with $$A$$ being the amplitude of the wave, $$x$$ the $$x$$ coordinate of the domain, $$y$$ the $$y$$ coordinate of the domain, $$t$$ the time, $$\theta$$ the angle of propagation/incidence of the wave, $$k_{x}$$ and $$k_{y}$$ the $$x$$ and $$y$$ wavenumber components respectively.

It is as simple as using the known values for $$x$$, $$y$$, $$\theta$$ and $$t$$ to solve for the wavefield at the locations of the sensors given by the $$x$$ and $$y$$ coordinate of each sensor, at time $$t$$ for a monochromatic wave impinging from direction with angle $$\theta$$. Finally, keep in mind that you have to take only the real part that represents the real quantity of the wave.

I haven't checked thoroughly but I believe that your plots must be correct (don't take my word on it though). For a wave traveling in the $$\theta = 0^{o}$$ direction it is normal to have variations only on the $$x$$ coordinate. Since you assume plane wave propagation, there must be no variation in the $$y$$ direction in this case, as it is shown in your first plot. For the $$\theta = 60^{o}$$ case it is not so easy to say because you sample the domain irregularly, so it is not clear (at least to me) whether the plot is correct or not. Judging from the code you provided, it seems that this plot should be correct too, but I haven't tested the code myself to be able to say for sure.

You should definitely check for $$\theta = 90^{o}$$ to see if you get variations only in the $$y$$ coordinate which should be the case for such a wave. Moreover, I am not sure your plots are really helpful because they actually fill the gaps between the sensor positions with color, which may be misleading to think that the color shown is indeed the value of the wavefield at these positions, where this is definitely not the case for locations in between your sensors. It would be way better if you were to plot the pressure you have calculated at the exact sensor locations and try to deduce the amplitude in between either visually or use an interpolation function to approximate it. Additionally, you could try to use some regularly spaced sensors to see if you get more meaningful plots that resemble the sinewave you expect to see.