source: Sophya/trunk/SophyaLib/NTools/FSAppIrrSmpl.h@ 2367

Last change on this file since 2367 was 2322, checked in by cmv, 23 years ago
  • passage xxstream.h en xxstream
  • compile avec gcc_3.2, gcc_2.96 et cxx En 3.2 le seek from ::end semble marcher (voir Eval/COS/pbseekios.cc)

rz+cmv 11/2/2003

File size: 5.0 KB
Line 
1#ifndef FSAPPIRRSMPL_SEEN
2#define FSAPPIRRSMPL_SEEN
3
4
5// approximation par serie de Fourier avec echantillonnage irregulier
6//------------------------------------------------------------------
7// ***** Guy Le Meur -- LAL-Orsay mars 2002 ****************
8//-------------------------------------------------------------------
9
10
11
12#include <math.h>
13#include <iostream>
14
15
16#include "machdefs.h" // Definitions specifiques SOPHYA
17#include "nbmath.h"
18#include "timing.h"
19#include "array.h"
20#include "fftservintf.h"
21#include "fftpserver.h"
22
23#include "toeplitzMatrix.h"
24
25
26////////////////////////////////////////////////////////////////////
27// Un signal donne , suppose a bande de frequences limitee, de longueur
28// finie est periodise. Ce signal periodise est suppose developpe
29// en serie de Fourier finie: l'approximation consiste a rechercher
30// les coefficients de cette serie de Fourier. Cela est fait en utilisant
31// le fait que la matrice du systeme a ecrire est Toeplitz. On utilise
32// une classe ToeplitzMatrix, qui utilise les FFT pour la resolution
33// L'utilisation standard comporte les etapes suivantes :
34//
35// constructeur --> definit l'echantillonnage et l'amplitude
36// des abscisses (pour periodisation)
37//
38// methode approximateSignal(nbFreq, signal) : definit la bande
39// de frequences et les valeurs du signal
40//
41// recuperation de valeurs approximees ou interpolees :
42// methodes: . restaureSignal() (signal "debruite" aux valeurs
43// d'echantionnage)
44// . restaureRegularlySampledSignal() (signal recalcule
45// sur un echantillonnage regulier quelconque)
46// . computeSignalOnASampling() (signal recalcule
47// sur un echantillonnage irregulier quelconque)
48//
49// on peut aussi recuperer les valeurs des coefficients du developpement
50// en serie de Fourier (methodes complexFourierCoef() et coeffCosSin()
51/////////////////////////////////////////////////////////////////////
52
53
54class FSApproximationIrregularSampling
55{
56
57private:
58 // verouiller le clonage
59FSApproximationIrregularSampling(const FSApproximationIrregularSampling&) {}
60FSApproximationIrregularSampling &operator = (const FSApproximationIrregularSampling&) {return *this;}
61
62
63public:
64FSApproximationIrregularSampling();
65
66FSApproximationIrregularSampling(TVector<double>& sampling, double offset, double range);
67
68~FSApproximationIrregularSampling();
69
70void approximateSignal(int M, const TVector<double>& signal);
71
72void restaureRegularlySampledSignal(int n, TVector<double>& solution) const;
73
74
75// le vecteur d'abscissses est suppose ordonne et appartenir a l'intervalle
76// de definition du signal
77 void computeSignalOnASampling(const TVector<double>& abscisses, TVector<double>& solution ) const;
78
79double estimationConditionnement() const;
80
81void samplingValues(TVector<double>& sv) const;
82
83void restaureSignal(TVector<double>& sol) const;
84
85
86inline void sampledSignal(TVector<double>& signal) const
87{
88 signal = signal_;
89 reshapeSignalInUsersFrame(samplingValues_, signal);
90}
91inline const TVector<double>& weights() const { return poids_;}
92
93// coefficients complexes ck, pour k=0,M
94inline void complexFourierCoef(TVector<complex<double> >& coef) const
95{
96 int n= coefFourier_.Size();
97 coef.ReSize(n);
98 coef = coefFourier_;
99 coef *= normeSignal_;
100}
101// terme constant, puis cos, sin, cos, sin......
102void coeffCosSin(TVector<double>& coef) const;
103
104private:
105
106inline void initFFT()
107{
108 fftIntfPtr_ =new FFTPackServer;
109 fftIntfPtr_->setNormalize(false);
110
111}
112inline double valeursSerie(double u) const
113{
114 complex<double> somme =complex<double>(0.,0.);
115 for (int j=1; j<=M_; j++)
116 {
117 double angle = 2.*M_PI*j*u;
118 complex<double> expon = complex<double>(cos(angle), sin(angle));
119 somme += coefFourier_(j)*expon;
120 }
121 return coefFourier_(0).real()+ 2*somme.real();
122}
123
124inline void calculeExponentiellesFourier()
125{
126 int j;
127 int n = samplingValues_.Size();
128 exponFourier_.ReSize(n);
129 for (j=0; j<n; j++)
130 {
131 double angle=-2.*M_PI*samplingValues_(j);
132 exponFourier_(j) = complex<double>(cos(angle),sin(angle));
133 }
134}
135
136void matchToSamplingReference(TVector<double>& sampling) const;
137void resizeSamplingIn_0_1(double offset, double range);
138
139void reshapeSignalInUsersFrame(const TVector<double>& abscisses, TVector<double>& resultat) const;
140void reshapeSignalInUsersFrame(TVector<double>& resultat) const;
141
142void makeToeplitzMatrix(int M);
143void makeRHS(TVector<complex<double> >& coefSolution);
144void makeSamplingVector(const TVector<double>& sampling, double offset, double range);
145void makeSignalVector(const TVector<double>& signal);
146void computeWeights();
147void NormSignal();
148
149
150FFTServerInterface* fftIntfPtr_;
151Toeplitz tptz_;
152TVector<double> samplingValues_;
153TVector<double> poids_;
154TVector<double> signal_;
155TVector<complex<double> > exponFourier_;
156TVector<complex<double> > coefFourier_;
157double samplingOffset_;
158double samplingRange_;
159double normeSignal_;
160double delta_;
161int nokdelta_;
162int M_;
163};
164
165
166#endif
Note: See TracBrowser for help on using the repository browser.