Python numpy:在二维速度场上执行截止频谱滤波器,想要反转到更粗糙的网格

Python numpy:在二维速度场上执行截止频谱滤波器,想要反转到更粗糙的网格,python,numpy,fft,Python,Numpy,Fft,我试图获取一个速度场,应用一个光谱截止滤波器,然后将结果绘制在一个网格上,匹配滤波器的粗糙度。这就是我所处的位置: nx = 200 dx = 10.0 filterx = 100.0 px = np.arange(0,nx*dx,dx) ratio = dx / filterx nnx = int(nx*ratio) raw = np.zeros((nx,nx)) raw2 = np.zeros((nx,nx)) for i in range(np.shape(raw)[0]):

我试图获取一个速度场,应用一个光谱截止滤波器,然后将结果绘制在一个网格上,匹配滤波器的粗糙度。这就是我所处的位置:

nx = 200
dx = 10.0
filterx = 100.0
px = np.arange(0,nx*dx,dx)

ratio = dx / filterx
nnx = int(nx*ratio)

raw = np.zeros((nx,nx))
raw2 = np.zeros((nx,nx))
for i in range(np.shape(raw)[0]):
    for j in range(np.shape(raw)[1]):
        raw[i,j] += 1.0*np.cos(i/dx/2.0*3.14) + 1.0*np.cos(j/dx/2.0*3.14)
        raw[i,j] += 2.0*np.cos(i*dx*50.0*3.14) + 2.0*np.cos(j*dx*50.0*3.14)
        raw2[i,j] = 1.0*np.cos(i/dx/2.0*3.14) + 1.0*np.cos(j/dx/2.0*3.14)

plt.figure(figsize=(10,8))

plt.subplot(331)
plt.pcolor(px/dx,px/dx,raw)
plt.title("raw signal")
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()

plt.subplot(332)
plt.pcolor(px/dx,px/dx,raw2)
plt.title("raw coarse signal")
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()

trn = (np.fft.fft2(raw))
k = (np.fft.fftfreq(nx,dx)) * dx*nx

for i in range(nx):
    for j in range(nx):
        if abs(nx*dx/np.float64(k[i])) < 2.0*filterx or abs(nx*dx/np.float64(k[j])) < 2.0*filterx:
            trn[i,j] = 0

itrn = np.fft.ifft2(trn)

plt.subplot(333)
plt.pcolor(px/dx,px/dx,itrn)
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
plt.title("fine")

plt.subplot(334)
plt.pcolor(px[::int(1.0/ratio)]/dx,px[::int(1.0/ratio)]/dx,itrn[::int(1.0/ratio),::int(1.0/ratio)])
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
plt.title("fine sampled")

itrns = np.fft.ifft2(trn,s=(nnx,nnx))

plt.subplot(335)
plt.pcolor(px[::int(1.0/ratio)]/dx,px[::int(1.0/ratio)]/dx,itrns)
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
plt.title("itrns")
nx=200
dx=10.0
过滤器x=100.0
px=np.arange(0,nx*dx,dx)
比率=dx/filterx
nnx=int(nx*比率)
原始=np.零((nx,nx))
raw2=np.零((nx,nx))
对于范围内的i(np.形状(原始)[0]):
对于范围内的j(np.形状(原始)[1]):
原始[i,j]+=1.0*np.cos(i/dx/2.0*3.14)+1.0*np.cos(j/dx/2.0*3.14)
原始[i,j]+=2.0*np.cos(i*dx*50.0*3.14)+2.0*np.cos(j*dx*50.0*3.14)
raw2[i,j]=1.0*np.cos(i/dx/2.0*3.14)+1.0*np.cos(j/dx/2.0*3.14)
plt.图(figsize=(10,8))
小地块(331)
plt.pcolor(px/dx,px/dx,原始)
产品名称(“原始信号”)
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
plt.子地块(332)
plt.pcolor(px/dx、px/dx、raw2)
plt.title(“原始粗信号”)
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
trn=(np.fft.fft2(原始))
k=(np.fft.fftfreq(nx,dx))*dx*nx
对于范围内的i(nx):
对于范围内的j(nx):
如果abs(nx*dx/np.float64(k[i])小于2.0*filterx或abs(nx*dx/np.float64(k[j])小于2.0*filterx:
trn[i,j]=0
itrn=np.fft.ifft2(trn)
小地块(333)
plt.pcolor(px/dx,px/dx,itrn)
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
项目名称(“罚款”)
plt.子地块(334)
plt.pcolor(px[::int(1.0/比率)]/dx,px[::int(1.0/比率)]/dx,itrn[::int(1.0/比率),::int(1.0/比率)])
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
产品名称(“精样”)
itrns=np.fft.ifft2(trn,s=(nnx,nnx))
小地块(335)
plt.pcolor(px[::int(1.0/比率)]/dx,px[::int(1.0/比率)]/dx,itrns)
plt.xlabel('x')
plt.ylabel('x')
plt.colorbar()
产品名称(“itrns”)
这就产生了。让我在这里停下来,明确地说,我一点也不担心我的过滤器粗糙

过滤器工作得很好,我可以将字段绘制回其原始网格,没有问题(“很好”)。我可以对“精细”字段进行采样,并将其绘制在粗糙的网格上(“精细采样”),但这是欺骗。我想以某种方式告诉逆变换,我想去掉小尺度。
ifft2()
函数似乎有这个选项,它几乎可以正常工作(“itrns”;很抱歉上面的名字),但大小相差太远了

关闭的程度会根据过滤器的大小而急剧变化。我是否可以使用一些缩放来解决这个问题