matlab练习程序(二维图形的傅里叶级数)
要用傅里叶级数表示二维图形,首先要找到数学表达式,然后做傅里叶拟合即可。
我最初想的是$R= f(theta)$这样的式子,$R$是极径,$theta$是极角。
不过这样似乎处理不了$theta$一样的情况,比如图形有凹陷的情况。
后来看了一些文章说可以把$x$和$y$分开表示,即$x=f(t)$,$y=f(t)$,这样可以针对$x$和$y$分别做傅里叶拟合。
下面是一个简单的例子,用matlab自带函数做的优化,具体优化拟合方法可以参考之前的文章。
matlab代码如下:
clear all;close all;clc; p = load('pi.txt'); plot(p(:,1),p(:,2),'r-o'); X = p(:,1); Y = p(:,2); step = 1.0 / (length(X)-1); t = (0:step:1)'; n = 40; parx=rand(2*n+2,1); pary=rand(2*n+2,1); %%优化 options.Algorithm = 'levenberg-marquardt'; lb = [];ub = []; f = @(parx) lossfunc(parx,X,t,n); parx = lsqnonlin(f,parx,lb,ub,options); %执行优化 f = @(pary) lossfunc(pary,Y,t,n); pary = lsqnonlin(f,pary,lb,ub,options); %执行优化 tt= 0:0.001:1; xx = func(parx,tt,n); yy = func(pary,tt,n); hold on; plot(xx,yy,'g.'); function re = lossfunc(par,x,t,n) %损失函数 y =func(par,t,n); re = x-y; end function y=func(a,x,n) %傅里叶级数函数 y=a(1); for i=1:n y= y + a(i*2)*cos(i*x*a(end)) + a(i*2+1)*sin(i*x*a(end)); end end
结果如下:
参考:https://www.bilibili.com/video/av62763042/?vd_source=e250bd9bac73fc4298a2ab7ec09ab393