matlab练习程序(二维图形的傅里叶级数)

发布时间 2023-05-20 22:12:16作者: Dsp Tian

如何用傅里叶级数表示二维图形,首先要找到数学表达式,然后做傅里叶拟合即可。

我最初想的是$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

结果如下:

pi.txt在这里下载

参考:https://www.bilibili.com/video/av62763042/?vd_source=e250bd9bac73fc4298a2ab7ec09ab393