我想生成 2D 行進正弦波。為此,我設定了平面波的引數并在任何時刻生成波,如下所示:
import numpy as np
import random
import matplotlib.pyplot as plt
f = 10 # frequency
fs = 100 # sample frequency
Ts = 1/fs # sample period
t = np.arange(0,0.5, Ts) # time index
c = 50 # speed of wave
w = 2*np.pi *f # angular frequency
k = w/c # wave number
resolution = 0.02
x = np.arange(-5, 5, resolution)
y = np.arange(-5, 5, resolution)
dx = np.array(x); M = len(dx)
dy = np.array(y); N = len(dy)
[xx, yy] = np.meshgrid(x, y);
theta = np.pi / 4 # direction of propagation
kx = k* np.cos(theta)
ky = k * np.sin(theta)
所以,平面波將是
plane_wave = np.sin(kx * xx ky * yy - w * t[1])
plt.figure();
plt.imshow(plane_wave,cmap='seismic',origin='lower', aspect='auto')
這給出了一個平滑的平面波,如圖所示
。此外,正弦波隨plt.figure(); plt.plot(plane_wave[2,:])時間的變化在 中給出
。但是,當我想在不同的時刻附加平面波時,圖 03
和 04會出現一些不連續性
,我想擺脫這個問題。
我是 python 新手,任何幫助將不勝感激。提前致謝。
arr = []
for count in range(len(t)):
p = np.sin(kx * xx ky * yy - w * t[count]); # plane wave
arr.append(p)
arr = np.array(arr)
print(arr.shape)
pp,q,r = arr.shape
sig = np.reshape(arr, (-1, r))
print('The signal shape is :', sig.shape)
plt.figure(); plt.imshow(sig.transpose(),cmap='seismic',origin='lower', aspect='auto')
plt.xlabel('X'); plt.ylabel('Y')
plt.figure(); plt.plot(sig[2,:])
uj5u.com熱心網友回復:
這不是編程的問題。它與您以某種不尋常的方式使用物理量這一事實有關。你的情節絕對正確。
您似乎誤解了這樣一個事實,即您正在談論一個二維問題,并為時間添加了第三維。這絕不是錯誤的,但是如果您嘗試并排附加 2D 波的快照,您將(再次)使用 x 空間維度來表示時間變化。這導致該坐標軸的使用不一致。現在,為了使這更直觀,請分別考慮兩個時間實體。難道這一切不符合你的直覺嗎?2D 平面上的點必須具有不同的幅度(當然,除非時間經過了波周期的倍數)?確實如此。因此,當您嘗試附加兩個快照時,會出現不連續性。為了避免您必須使用等于一個周期的時間步長,我認為這沒有實際用途,或者使用恒定的時間步長,這將使當前影像左邊界上的波相位時間等于上一個時間步中影像右邊界上波的相位。然而,這將始終是一個恒定的時間步長,在兩個所述值之間交替相位(在影像的邊緣上)。
這同樣適用于一維情況,因為您使用兩個坐標軸來表示波(x 是 x 空間維度,y 用于表示幅度)。這就是在你的最后一個情節中可以看到的。
現在,您可能會問什么解決方案。通過簡單檢查波函式的數學公式即可提供解決方案。在 2D 中,它是三個變數的標量函式(即,輸入三個值并輸出一個),因此您至少需要四個維度來表示它。唉,我們無法感知第四個空間維度,但這在您的情況下不是問題,因為函式的輸出是用顏色表示的。然后可以使用三個維度來表示函式的時間演變。您所要做的就是創建一個 3D 陣列,其中第三個維度表示時間,所有 2D 快照都將存盤在前兩個維度中。
當涉及到結果的可視化表示時,您可以使用某種瀑布圖,其中 z 軸將代表時間,或者利用我們可以感知的第四維度,即時間來創建波浪演變的影片。
我對 Python 不是很熟悉,所以我只會提供一個通用的幼稚實作。我相信這里的很多人都可以對以下代碼段進行一些簡化和/或優化。我假設您的前兩個代碼塊中的所有內容都可用,因此只需在您呈現的最后一個塊中進行更改
arr = np.zeros(len(xx), len(yy), len(t)) # Initialise the array to hold the temporal evolution of the snapshots
for i in range(len(t)):
arr[:, :, i] = np.sin(kx * xx ky * yy - w * t[i])
# Below you can plot the figures with any function you prefer or make an animation out of it
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452767.html
標籤:python-3.x 麻木的 图像处理 时间序列 信号处理
