高斯插值 matlab,一维高斯插值到二维高斯

博客讨论了在使用样条曲线进行1D函数插值时遇到的超调问题,由于函数定义域超出数据范围导致。解决方案是通过扩展函数定义域并应用低通滤波。文章提供了两种方法,一种是简单的修复,另一种是更精确的扩展方法,以避免在空间域中出现涟漪。
摘要由CSDN通过智能技术生成

编辑:根据你的澄清,很清楚发生了什么。您正在尝试对超出可用数据范围的函数进行插值,即从插值到外推。样条曲线会导致你观察到的超调。解决方法很简单,就是确保1d函数的值在区间[min(r),max(r)]内。注意,在原始数据中,max(r)约为424,而您正在插值的函数是在范围[-300299]上定义的。

% Simulated overshoot, see left figure:

x1d = [-300:299];

[x,y]=meshgrid(x1d,x1d);

r = sqrt(x.^2+y.^2);

gsn1d = exp(-x1d.^2/500);

lowpass = @(x)(x1d > -x & x1d < x);

gsn1dcutoff = ifft(fftshift(lowpass(10).*fftshift(fft(gsn1d))));

plot(gsn1dcutoff)

OTF2d = reshape(interp1(x1d,gsn1dcutoff,r(:),'spline'),[length(x1d),length(x1d)]);

mesh(OTF2d)

% Quick and dirty fix, see right figure:

x1dExtended = linspace(min(x1d*sqrt(2)),max(x1d*sqrt(2)),ceil(length(x1d)*sqrt(2)));

gsn1dE = exp(-x1dExtended.^2/500);

% ^^^ note that this has 600*sqrt(2) points and is defined on the diagonal of your square. Now we can low-pass filter in the freq. domain to add ripple in space domain:

lowpass = @(x)(x1dExtended > -x & x1dExtended < x);

gsn1dcutoff = -real(ifft(fftshift(lowpass(10).*fftshift(fft(gsn1dE)))));

plot(gsn1dcutoff)

OTF2d = reshape(interp1(x1dExtended,gsn1dcutoff,r(:),'spline'),[length(x1d),length(x1d)]);

mesh(OTF2d)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值