问题描述
这是我的第一篇文章,对于任何与格式相关的问题,我们深表歉意。
所以我有一个从原子显微镜获得的数据集。数据看起来像一个 1024x1024 的矩阵,它由以米为单位从样本中获取的不同测量值组成,例如。
data = [[1e-07 ... 4e-08][ ... ... ... ][3e-09 ... 12e-06]]
np.size(data) == (1024,1024)
从这些数据中,我希望 1) 得出一些关于真实数据的统计数据;和 2) 使用功率谱密度 (PSD) 分布,希望创建一个新的数据集,该数据集与原始数据的特征不同,但在统计上相似。我的计划是 2a) 取 2d fft 的数据,计算功率谱密度 2b) 某种方法?,2c) 取修改后的信号的 2d ifft 将其转换回具有相同功率谱密度的新样本和原版一样。
此外,关于第 2b) 部分 this was the closest link I could find regarding a time series based solution; 然而,到目前为止我还没有完全理解如何实现这一点,因为我不确定 fft 数据的相位、频率和幅度在这个 2d 中代表什么情况,而且由于我们现在谈论的是 2d ifft,我不确定如何在结合随机数生成和幅度/相移的同时构造这个复杂矩阵,以将其转化为有意义的东西。>
所以基本上,我的直觉有些问题。对于这个问题,我们正在使用没有时间分量的空间数据的 2d 傅立叶变换,所以我相信应用于时间序列数据的方法也可以在这里应用。由于原始数据的 fft 是“空间域中的频率”,PSD 的 x 轴应该是像素或米,那么 y 轴中的“功率”是什么?我希望有人能帮我解决这个问题。
我的代码如下,希望有人能帮我解决我的问题。如果有人能帮助我理解这个偏移的频率与幅度图在说什么,那就再好不过了:
这是带有 fft、移位 fft 和 freq 的图像。与振幅图。
幸运的是功率谱密度函数更容易理解
感谢大家的时间。
data = np.genfromtxt('asample3.0_00001-filter.txt')
x = np.arange(0,int(np.size(data,0)),1)
y = np.arange(0,1)),1)
z = data
npix = data.shape[0]
#taking the fourier transform
fourier_image = np.fft.fft2(data)
#Get power spectral density
fourier_amplitudes = np.abs(fourier_image)**2
#calculate sampling frequency fs (physical distance between pixels)
fs = 92e-07/npix
freq_shifted = fs/2 * np.linspace(-1,1,npix)
freq = fs/2 * np.linspace(0,int(npix/2))
print("Plotting 2d Fourier Transform ...")
fig,axs = plt.subplots(2,2,figsize=(15,15))
axs[0,0].imshow(10*np.log10(np.abs(fourier_image)))
axs[0,0].set_title('fft')
axs[0,1].imshow(10*np.log10(np.abs(np.fft.fftshift(fourier_image))))
axs[0,1].set_title('shifted fft')
axs[1,0].plot(freq,10*np.log10(np.abs(fourier_amplitudes[:npix//2])))
axs[1,0].set_title('freq vs amplitude')
for ii in list(range(npix//2)):
axs[1,1].plot(freq_shifted,10*np.log10(np.fft.fftshift(np.abs(fourier_amplitudes[ii]))))
axs[1,1].set_title('shifted freq vs amplitude')
#constructing a wave vector array
## Get frequencies corresponding to signal PSD
kfreq = np.fft.fftfreq(npix) * npix
kfreq2D = np.meshgrid(kfreq,kfreq)
knrm = np.sqrt(kfreq2D[0]**2 + kfreq2D[1]**2)
knrm = knrm.flatten()
fourier_amplitudes = fourier_amplitudes.flatten()
#creating the power spectrum
kbins = np.arange(0.5,npix//2+1,1.)
kvals = 0.5 * (kbins[1:] + kbins[:-1])
Abins,_,_ = stats.binned_statistic(knrm,fourier_amplitudes,statistic = "mean",bins = kbins)
Abins *= np.pi * (kbins[1:]**2 - kbins[:-1]**2)
print("Plotting power spectrum of surface ...")
fig = plt.figure(figsize=(10,10))
plt.loglog(fs/kvals,Abins)
plt.xlabel("Spatial Frequency $k$ [meters]")
plt.ylabel("Power per Spatial Frequency $P(k)$")
plt.tight_layout()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)