簡體   English   中英

從離散點雲數據對二維曲面進行正弦和余弦的傅立葉變換或擬合

[英]Fourier transform or fit of sines and cosines to a 2D surface from discrete point cloud data

我有x,y,z數據定義了一個曲面(x和y位置,z高度)。 數據是不完美的,因為它包含一些噪聲,即,並不是每個點都精確地位於我要建模的平面上,而是非常接近它。 我只有三角形區域內的數據,而不是整個x,y平面內的數據。 這是一個用顏色表示z的示例:

數據

在此示例中,數據已在像這樣的網格上的三角形中心采樣(每個藍點是一個樣本):

嚙合

如果有必要,可以將樣本均勻地排列在x,y網格上,盡管最好不要使用這種解決方案。

我想將此數據表示為正弦和余弦之和,以便進行數學處理。 理想情況下,使用盡可能少的項以使擬合誤差保持在可接受的較低水平。

如果這是一個正方形區域,我將進行2D傅里葉變換,並丟棄更高頻率的項。

但是,我認為這種情況有兩個主要差異,使這種方法不可行:

  1. 理想情況下,我想在上方網格中藍點指示的點上使用樣本。 如果沒有其他選擇,我可以改用常規的x,y網格,但這不是理想的解決方案

  2. 我沒有整個x,y平面的數據。 上方第一張圖片中的白色區域不包含適合擬合的數據。

因此總而言之,我的問題是:

是否有一種方法可以使用正弦和余弦的線性組合來提取最適合此數據的系數? 理想情況下使用python。

我很抱歉,如果這更多是一個數學問題,並且堆棧溢出不是發布此內容的正確位置!

編輯:這是python樣式[x,y,z]格式的示例數據集-抱歉,它很大,但顯然我不能使用pastebin ?:

[[1.7500000000000001e-08, 1.0103629710818452e-08, 14939.866751020554],
 [1.7500000000000001e-08, 2.0207259421636904e-08, 3563.2218207404617],
 [8.7500000000000006e-09, 5.0518148554092277e-09, 24529.964593228644],
 [2.625e-08, 5.0518148554092261e-09, 24529.961688158553],
 [1.7500000000000001e-08, 5.0518148554092261e-09, 21956.74682671843],
 [2.1874999999999999e-08, 1.2629537138523066e-08, 10818.190869824304],
 [1.3125000000000003e-08, 1.2629537138523066e-08, 10818.186813746233],
 [1.7500000000000001e-08, 2.5259074277046132e-08, 3008.9480862705223],
 [1.3125e-08, 1.7681351993932294e-08, 5630.9978116591838],
 [2.1874999999999999e-08, 1.768135199393229e-08, 5630.9969846863969],
 [8.7500000000000006e-09, 1.0103629710818454e-08, 13498.380006002562],
 [4.3750000000000003e-09, 2.5259074277046151e-09, 40376.866196753763],
 [1.3125e-08, 2.5259074277046143e-09, 26503.432370909999],
 [2.625e-08, 1.0103629710818452e-08, 13498.379635232159],
 [2.1874999999999999e-08, 2.5259074277046139e-09, 26503.430698738041],
 [3.0625000000000005e-08, 2.525907427704613e-09, 40376.867011915041],
 [8.7500000000000006e-09, 1.2629537138523066e-08, 11900.832515759088],
 [6.5625e-09, 8.8406759969661469e-09, 17422.002946526718],
 [1.09375e-08, 8.8406759969661469e-09, 17275.788904632376],
 [4.3750000000000003e-09, 5.0518148554092285e-09, 30222.756636780832],
 [2.1875000000000001e-09, 1.2629537138523088e-09, 64247.241146490327],
 [6.5625e-09, 1.2629537138523084e-09, 35176.652106572205],
 [1.3125e-08, 5.0518148554092277e-09, 22623.574247287044],
 [1.09375e-08, 1.2629537138523082e-09, 27617.700396641056],
 [1.5312500000000002e-08, 1.2629537138523078e-09, 25316.907231576402],
 [2.625e-08, 1.2629537138523066e-08, 11900.834523905782],
 [2.4062500000000001e-08, 8.8406759969661469e-09, 17275.796410700641],
 [2.8437500000000002e-08, 8.8406759969661452e-09, 17422.004617294893],
 [2.1874999999999999e-08, 5.0518148554092269e-09, 22623.570035270699],
 [1.96875e-08, 1.2629537138523076e-09, 25316.9042194055],
 [2.4062500000000001e-08, 1.2629537138523071e-09, 27617.700160860692],
 [3.0625000000000005e-08, 5.0518148554092261e-09, 30222.765972585737],
 [2.8437500000000002e-08, 1.2629537138523069e-09, 35176.65151453446],
 [3.2812500000000003e-08, 1.2629537138523065e-09, 64247.246775422129],
 [2.1875000000000001e-09, 2.5259074277046151e-09, 46711.23463223876],
 [1.0937500000000001e-09, 6.3147685692615553e-10, 101789.89315354674],
 [3.28125e-09, 6.3147685692615543e-10, 52869.788364220134],
 [3.2812500000000003e-08, 2.525907427704613e-09, 46711.229428833962],
 [3.1718750000000001e-08, 6.3147685692615347e-10, 52869.79233902022],
 [3.3906250000000006e-08, 6.3147685692615326e-10, 101789.92509671643],
 [1.0937500000000001e-09, 1.2629537138523088e-09, 82527.848790063814],
 [5.4687500000000004e-10, 3.1573842846307901e-10, 137060.87432327325],
 [1.640625e-09, 3.157384284630789e-10, 71884.380087542726],
 [3.3906250000000006e-08, 1.2629537138523065e-09, 82527.861035177877],
 [3.3359375000000005e-08, 3.1573842846307673e-10, 71884.398689011548],
 [3.4453125000000001e-08, 3.1573842846307663e-10, 137060.96214950032],
 [4.3750000000000003e-09, 6.3147685692615347e-09, 18611.868317256733],
 [3.28125e-09, 4.4203379984830751e-09, 27005.961455364879],
 [5.4687499999999998e-09, 4.4203379984830751e-09, 28655.126635802204],
 [3.0625000000000005e-08, 6.314768569261533e-09, 18611.869287539808],
 [2.9531250000000002e-08, 4.4203379984830734e-09, 28655.119850641502],
 [3.1718750000000001e-08, 4.4203379984830726e-09, 27005.959731047784]]

沒有什么可以阻止您以自己喜歡的任何基礎進行線性最小二乘法。 (如mikuszefski所說,您必須計算出想要的周期性。)三角形外部缺少樣本自然會使該方法無法了解函數的行為。 您可能希望根據其網格單元的面積對樣品進行加權,以避免過度擬合拐角。

這里有一些代碼可能有助於解決周期性峰值。 這也顯示了基數x, x/2+ sqrt(3)/2 * y的用法。 然后可以通過低階傅立葉處理平面部分。 我希望能提出一個想法。 (順便說一句,我同意戴維斯·赫林的觀點,面積加權是一個好主意)。 我想,為了適合自己,良好的初步猜測至關重要。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

def gauss(x,s):
    return np.exp(-x**2/(2.*s**2))

fig = plt.figure()
ax = fig.gca(projection='3d')

X = np.arange(-5, 5, 0.15)
Y = np.arange(-5, 5, 0.15)
X, Y = np.meshgrid(X, Y)
kX=np.sin(X)
kY=np.sin(0.5*X+0.5*np.sqrt(3.)*Y)
R = np.sqrt(kX**2 + kY**2)
Z = gauss(R,.4)

#~ surf = ax.plot_wireframe(X, Y, Z, linewidth=1)
surf= ax.plot_surface(X, Y, Z, rstride=1, cstride=1,linewidth=0, antialiased=False)

plt.show()

輸出: 周期性的峰值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM