MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Finding simplest Fourier series between two given Fourier series

  • To: mathgroup at smc.vnet.net
  • Subject: [mg105689] Re: Finding simplest Fourier series between two given Fourier series
  • From: dh <dh at metrohm.com>
  • Date: Tue, 15 Dec 2009 07:28:24 -0500 (EST)
  • References: <hg4h4h$gib$1@smc.vnet.net>


Hi Kely,

this is a tough question because your conditions are formulated in two 

different domains, let's call them time and frequency space.



Here is a simple approach that may not always give satisfactory results:



- calculate the mean of both functions: f3 = 0.5(f1+f2)

- Get the FFT of f3: fft[f_]

- truncate the highest order term of fft[] and check if the 

corresponding function in time space is still between f1 and f2

- keep on doing the above until the fft can no more be truncated due to 

condition: I



Here is a much more complicated and laborious approach:

- let ndat= 2 n+1 be the number of data points

- calculate the mean of both functions: f3 = 0.5(f1+f2)

- Get the FFT of f3: fft[f_]:= Sum[f3[i] Exp[-I 2 Pi f i/ndat],{i,0,ndat-1}]

- choose the max. number: 1+2 nmax of non zero fourier coef. of the 

searched function (may be changed later)

- consider a polynomial p[z_]:=Sum[a[i] z^i],{i,-nmax,nmax}] of a

    complex variable z.

    For points on the unit circle we may define:

    pu[f_]:=p[Exp[I 2Pi f]] for f==-1/2..1/2

   We may imagine this to be the fourier transform of the searched real 

function. Therefore a[i]== ComplexConjugate[a[-i]].

- We now choose a[i] so that pu[f] approximates fft[f]. Toward this aim 

we minimize some error criterion.   We may e.g. choose some points on 

the unit circle given by fi: Exp[I 2Pi fi], fi==-1/2..1/2  and evaluate 

err[fi_]:=p[fi]-fft[fi] at these points.

We may get different fits (e.g. least square or 1-norm) by choosing a 

corresponding norm of the error vector err[fi]= error evaluated at all 

chosen points on the unit circle:

Norm[err[fi]]

- to ensure that f1<f3<f2 we increase the above error by a huge penalty 

if the back transformed function is outside this band.

- having got the optimal function, reduce the number of non zero terms 

in the p[z] and repeat the above.



Daniel



Kelly Jones wrote:

> Given two Fourier series f1[x] and f2[x], where f1[x]<=f2[x] for all

> x, I want Mathematica to find the "simplest" Fourier series f3[x] that

> lies between them. More specifically:

> 

>  I. f1[x] <= f3[x] <= f2[x] for all x

> 

>  II. f3[x] has the fewest non-zero coefficients of all f3 meeting I.

> 

>  III. If multiple functions meet I and II, choose the one whose

>  highest term is smallest (ie, the "least wiggly" one).

> 

> If multiple Fourier series satisfy I, II, and III, I'll settle for any

> of them.

> 

> Motivation:

> 

>  % I'm Fourier-fitting continuous cyclic data that's measured to the

>  nearest integer. IE, a datum of 56 means the value I'm measuring is

>  between 55.5 and 56.5.

> 

>  % Using Fourier series, I can approximate the measured data to

>  arbitrary precision, but this feels silly when the terms are of order

>  0.1, 5 times smaller than the measurement precision.

> 

>  % I believe the data satisfies a fairly simple Fourier relation

>  that's being obscured by rounding/measurement precision.

> 

> "Extra credit": The data I'm measuring is cyclic, but I'm not

> necessarily feeding Mathematica an integral number or cycles. The list

> I give Mathematica may have 57.2 cycles instead of 57 or 58. The ideal

> solution would compensate for this, though I'd be happy w/ a solution

> that just works for an integral number of cycles.

> 




  • Prev by Date: Any way to make "iterb" in Mathematica 7.0 compatible with older
  • Next by Date: Re: question
  • Previous by thread: Re: Finding simplest Fourier series between two given Fourier series
  • Next by thread: question