cs_mounjetado
Messages postés
66
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
4 août 2008
4 août 2008 à 16:03
oui certes...
donc:
les types déclarés dans une unité commune
type
TFilter = (fiBessel=0, fiButterworth=1, fiChebyshev=2, fiCriticalAbsorption=3);
TFilterOperation = (foSmoothDown=0, foFilter=1);
MatrixD = Array[1..255,0..17] of Double;
std_re = Record {variables d'exploitation des données significatives}
etal_std : Array[0..17] of Double; {valeurs d'étalonnage significatives uniformisées}
mes_std : MatrixD; {valeurs de mesures significatives uniformisées}
end;
TSglValSerie = Array[0..gen] of Single;
PDblValSerie = ^TDblValSerie;
TDblValSerie = Array[0..gen] of Double;
la fct dans la dll:
{---------------------------------------------------------------------------}
{ Filtre de 10ème ordre : }
{ les coefficients sont fixés pour -3dB; }
{ co_fcut permet de renforcer le filtrage. }
{---------------------------------------------------------------------------}
function Filtre_10( const debut, fin : Integer;
const PosCapt : Integer;
const Select : TFilter;
const co_Fcut : Double;
const but_op : TFilterOperation;
var Sujet : MatrixD
) : MatrixD; pascal;
var Miroir : TDblValSerie; //TSglValSerie; //^TSglValSerie;
Coeff : Array[1..2,1..5] of Double;
Vec : Array[1..3] of Double;
n,p : Integer;
d,f : Integer;
dPh,Iter : Integer;
Ecart : Double;
Minima : Double;
Sujet2 : MatrixD;
EnSo : TDblValSerie; //TDblValSerie; //TSglValSerie;
begin
d := 0; f := 0;
{------- Tableau: Tietze/Schenk,pages 391-393 -------}
case Ord(Select) of
0 : begin
Coeff[1,1] := 1.0215; Coeff[2,1] := 0.2650;
Coeff[1,2] := 0.9393; Coeff[2,2] := 0.2549;
Coeff[1,3] := 0.7815; Coeff[2,3] := 0.2351;
Coeff[1,4] := 0.5604; Coeff[2,4] := 0.2059;
Coeff[1,5] := 0.2883; Coeff[2,5] := 0.1665;
end;
1 : begin
Coeff[1,1] := 1.9754; Coeff[2,1] := 1.0;
Coeff[1,2] := 1.7820; Coeff[2,2] := 1.0;
Coeff[1,3] := 1.4142; Coeff[2,3] := 1.0;
Coeff[1,4] := 0.9080; Coeff[2,4] := 1.0;
Coeff[1,5] := 0.3129; Coeff[2,5] := 1.0;
end;
2 : for n := 1 to 5 do
begin
Coeff[1,n] := 0.5358;
Coeff[2,n] := 0.0718;
end;
end;
d := debut;
f := fin;
for p := 0 to PosCapt do {filtrage des 18 séries de mesures}
begin
Minima := 0.0;
// New(Miroir);
// for n := 1 to gen do
// Miroir^[n] := 0.0;
// for n := 1 to fin do
// Miroir^[n] := Sujet[n,p];
for n := 1 to f do
Miroir[n] := Sujet[n,p];
// EnSo[n+10] := Miroir^[n];
for n:=1 to f-10 do
EnSo[n+10] := Miroir[n];
for n := 10 downto 1 do EnSo[n] := EnSo[n+1] - (EnSo[n+2] - EnSo[n+1]);
for n := (f+11) to (f+30) do {prolongation artificielle pour tenir compte de dPh}
EnSo[n] := EnSo[n-1] + (EnSo[n-1] - EnSo[n-2]);
for n := f+31 to gen do EnSo[n] := 0.0;
for Iter := 1 to 5 do
begin
Coeff[1,Iter] := co_fcut * Coeff[1,Iter]; {fcut --> fcut(-3dB)/co_fcut}
Coeff[2,Iter] := co_fcut * co_fcut * Coeff[2,Iter]; {voir:Tietze/Schenk,page 385}
vec[1] := 1 + coeff[1,Iter] + Coeff[2,Iter];
vec[2] := (Coeff[1,Iter] + 2*Coeff[2,Iter]) / vec[1];
vec[3] := -Coeff[2,Iter] / vec[1];
for n := (d+2) to (f+20) do
EnSo[n] := EnSo[n]/vec[1] + EnSo[n-1]*vec[2] + EnSo[n-2]*vec[3];
end;
Iter := 0;
repeat
Ecart := 0.0;
for n := d to f do
// Ecart := Ecart + Abs(EnSo[n+Iter] - Miroir^[n]);
Ecart := Ecart + Abs(EnSo[n+Iter] - Miroir[n]);
case Iter of
0 : begin
Minima := Ecart;
Inc(Iter);
end;
1..20 : begin
if Ecart < iMin then Minima := Ecart;
Inc(Iter);
end;
end;
until ((Iter = 20) or (Ecart > Minima));
Dec(Iter);
f := f - 10;
if but_op = foSmoothDown then dPh:=Iter
else dPh:=0;
for n := d to f do Sujet2[n,p]:=EnSo[n+dPh];
{ else if poscapt>32 then Sujet[inst,n-32]:=round(EnSo[n+dPh]);}
end;
Result := Sujet2;
// Dispose(Miroir);
end;
le code appelant:
const
nb_capt = 17;
var // globale d'unité
real_data : std_re;
ext_data : std_re;
var // locale de méthode ButtonClick
cutfrqcoeff : Double;
d,f : Integer;
(...)
cutfrqcoeff := 1;
with std_data
do begin d :Integer(Low(mes_std)); // d'où d 1 f :Integer(High(mes_std)); // d'où d 255
for j:=d to f
do for i:=Low(mes_std[j]) to High(mes_std[j])
do real_data.mes_std[j,i] := mes_std[j,i] - etal_std[i];
end;
ext_data.mes_std := Filtre_10(d,f,nb_capt,fiBessel,cutfrqcoeff,foSmoothDown,real_data.mes_std); {filtrage des données brutes à 25 Hz au 10ème ordre}
ce que j'ai mis en commentaire, c'est le code originel et les différents essais en changeant les types ou en se passant de pointeurs.
tout est fait pour Win32.
j'appelle le fonction avec les paramètres suivants:
debut 1; fin 255; nb_capt = 17 ; Select = fiBessel; cutfrqcoeff = 1; but_op = foSmoothDown; Sujet = real_data
en mode pas à pas, une fois rentré dedans, je lis les paramètres de la fonction:
debut 1242648; fin 4215628; PosCapt = 1243472; Select = fiBessel; co_Fcut = 1; but_op = foSmoothDown; Sujet = real_data
merci pour votre aide
<hr />
si Delphi m'était conté...