首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中二维矩阵的傅里叶变换

Python中二维矩阵的傅里叶变换
EN

Stack Overflow用户
提问于 2020-02-14 20:27:12
回答 1查看 1.5K关注 0票数 1

所以,我有一个有72x72个值的矩阵,每个值对应于一个有72x72个点的三角形晶格上的一些能量。我试图对这些值进行傅里叶变换,但我不知道如何使用np.fft.fftn来实现。

为了说明我的问题,我编写了以下包含一些随机值的基本代码。三角形给出了晶格的x,y坐标。

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt

    def triangular(nsize):
        x=0
        y=0
        X=np.zeros((nsize,nsize))
        Y=np.zeros((nsize,nsize))
        for i in range(nsize):
            for j in range(nsize):
                X[i,j]+=1/2*j+i
                Y[i,j]+=np.sqrt(3)/2*j
        return(X,Y)

xx = triangular(72)[0]
yy = triangular(72)[1]


plt.figure()
plt.pcolormesh(xx, yy, np.reshape(np.random.rand(72**2),(72,72)))

我没有使用随机数据,但我不想让示例变得太复杂。事实上,当我现在使用下面的FFT时,我每次都看到相同的图:

代码语言:javascript
运行
复制
matrix = []

matrix.append(triangular(72)[0])

matrix.append(triangular(72)[1])

matrix.append(np.reshape(np.random.rand(72**2),(72,72)))

spectrum_3d = np.fft.fftn(matrix)                # Fourrier transform along x, y, energy  

kx = np.linspace(-4*np.pi/3,4*np.pi/3,72)      #this is the range I want to plot

ky = np.linspace(-2*np.pi/np.sqrt(3),2*np.pi/np.sqrt(3),72)



Ky, Kx = np.meshgrid(ky, kx, indexing='ij')       #making a grid 



plt.figure(figsize=(11,9))
psd = plt.pcolormesh(Kx, Ky, abs(spectrum_3d[2])**2)
cbar = plt.colorbar(psd)
plt.xlabel('kx')
plt.ylabel('ky')

我的结果看起来总是一样的,我不知道哪里出了问题。另外,对于我的相关值,它具有很大的对称性,曲线图看起来是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-15 03:18:40

由于DC的优势,你不能“看到”频谱。

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as p
%matplotlib inline

n=72
x=np.arange(n)
y=np.arange(n)
X,Y= np.meshgrid(x,y)

data=np.reshape(np.random.rand(n**2),(n,n))

data_wo_DC= data- np.mean(data)

spectrum = np.fft.fftshift(np.fft.fft2(data)) 
spectrum_wo_DC = np.fft.fftshift(np.fft.fft2(data_wo_DC)) 

freqx=np.fft.fftshift(np.fft.fftfreq(72,1))   #q(n, d=1.0)
freqy=np.fft.fftshift(np.fft.fftfreq(72,1))   
fX,fY= np.meshgrid(freqx,freqy)


p.figure(figsize=(20,6))
p.subplot(131)
p.pcolormesh(X,Y, data)  
p.colorbar()

p.subplot(132)
p.pcolormesh(fX,fY,np.abs(spectrum)) 
p.colorbar()
p.title('most data is in the DC')

p.subplot(133)
p.pcolormesh(fX,fY,np.abs(spectrum_wo_DC)) 
p.colorbar()
p.title('wo DC we can see the structure');

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60226373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档