matlab如何将傅立叶级数拟合到8个以上?

时间:2015-03-24 12:14:35

标签: matlab fft curve-fitting

如何将傅立叶级数拟合到超过8个系列的部分?

我尝试这种程序化但我得到的系数值不一样且拟合不好

    %% Create a Fourier series

    AnCosWnx='A0';
    BnSinWnx='';
    lower=1;
    upper=1;
    startpoint=0;

  for n=1:9



   LCos=AnCosWnx;
   LSin=BnSinWnx;

   ACosWx=strcat('A',num2str(n),'*cos(w*',num2str(n),'*x)');
   AnCosWnx=strcat(LCos,'+',ACosWx);
   BSinWx=strcat('B',num2str(n),'*sin(w*',num2str(n),'*x)');
   BnSinWnx=strcat(LSin,'+',BSinWx);

   Fx=strcat(AnCosWnx,BnSinWnx);


  end

  %% build the fit  function 

   options = fitoptions(Fx);


   lower=zeros(1,2+n*2);
   upper=zeros(1,2+n*2);
   startpoint=zeros(1,2+n*2);

  lower(1:end)=-inf;
   upper(1:end)=inf;
  startpoint(end)=6.17*10^-3;

set(options,'Lower',lower,...
   'Upper',upper...
   ,'StartPoint',startpoint...
   ,'Algorithm','Trust-Region');

%%

 ft = fittype(Fx);


% Fit this model using new data
[fitobject ,gof,output] = fit(sat,dat,ft,options);

%%为字符串

创建拟合函数
    cvalues = coeffvalues(fitobject);
    cnames = coeffnames(fitobject);
    output = formula(fitobject);

  for ii=1:1:numel(cvalues)
      cname = cnames{ii};
      cvalue = num2str(cvalues(ii));
      output = strrep(output, cname , cvalue);
 end

%%将输出字符串转换为函数        Foutput = strcat('@(x)',输出);

  Fout=  regexprep(Foutput,'\r\n|\n|\r','')
   g=str2func(Fout);
   hold on 
   h_ = plot(sat,g(sat),'r')

1 个答案:

答案 0 :(得分:1)

根据我的经验,matlab(或任何)曲线拟合算法通常不会在某种复杂的函数之上工作。您可以使用分段样条,但似乎periodogram可能是最佳解决方案。这是一种将傅立叶级数拟合为非均匀数据的技术。 exchange上有一个matlab函数。