unit SPECTRUM;
interface
uses
//overlay,dos,crt,graph,printer,specover,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComCtrls, Menus, Math,
common,friend,grafiti0,grafiti1,fft,
disco,disco1,porto,gen,grafiti3,disco2,grafiti4,spectanalisier,grafik,edith,
commande;
procedure setDefaults;

function Customs:boolean;
procedure mainProgram;

Implementation
 uses unit1,visualization,welcome,Config_Dos,NewSpectrum;

procedure programInfor;
 begin
 (*
 // write(cons,
  ///'Od wartości czestotliwości Fmax będzie zależeć liczba próbek',
  //' zawartych w wyświetlanym odcinku oscylogramu. Przyjmuje się 4 punkty na',
  //' okres Fmax; podając dużą Fmax uzyskujemy więc większe rozciągnięcie',
  // ' oscylogramu. Parametr ten nie ma żadnego wpływu na analize FFT.');
   //writeln(cons);
  //write(cons,'Uwaga. Przy duzym sciesnieniu oscylogramy pokazuja wartosci uśredn',
  //'ione  próbek  wpadających pomiędzy każde dwa sąsiednie punkty w wymiarze z',
  //'miennej niezależ  nej ');
  //writeln(cons);   writeln(cons);
  //write(cons,'Prążki spectrum są przyporzadkowywane środkowi analizowanego',' odcinka sygnału.');
 // writeln(cons);
  //writeln(cons);
  write(cons,'W trakcie sesji mozemy przełączać tryby graficzne: rozdzielczość',
   ' i przedstawiane  wyniki na ekranie - nie ma to żadnego wpływu na ',
   'rezultaty kierowane na dysk.'); writeln(cons);
  write(cons,'Mozna tez zmienic ksztalt aktualnego okna i zamienic je na na polowkowe');
  write(cons,', przelaczac rodzaje wykonywanych analiz i kierowanie wynikow na',
        ' dysk, zmieniac odstep probkowania spectrum i liczbe punktow ',
        'transformaty FFT');
  write(cons,'Zadanie kierowania na dysk czy ekran  automatycznie wlacza zadana',
  ' analize. Wy-konywane sa tylko aktualnie niezbedne obliczenia');
  writeln(cons);
   write(cons,'Przelaczen dokonujemy naciskajac odpowiednia wyrozniona litere.');
 writeln(cons); write(cons,'Enter !'); writeln(cons);
 write(cons,'Po ustaleniu parametrow analiz mozemy rozpoczac je od',
    ' poczatku naciskajac ''!'''); writeln(cons);
  write(cons,'Skala spectrogramu (cepstro-) : skok pomiedzy poziomami=',
  'dynamika/12 (60db/12)'); writeln(cons);
  *)
 end;{programInfor}

var
                                                   plikz : typ_sklFile;
                                                    data : kod_opisu;
						  create : DirStr;
                                           source,format : char;
                                              datavector : dtvp;

                                      startPoint,lookFor : longint;

                     lba_plackow,freq,rez,lookfor1,sklSt : word;

trigger,mode,board_num,u,zmp1,zmp2,pixY1,pixY2,int_level,
                                         chanlo,base_adr : integer;

                                            spow,trigLev : byte;

   clock_freq,t4,interval,modyfPrmtr,modul,
                                                   czest : real;

                                              t1,t2,temp : extended;

 kontr_glob,squash,HeapFull,defaults,zmsk,logos,p1,znt,
                                        freezToDisk,jumper : boolean;

                                             oldExitProc : pointer;

procedure graphExit;
  begin
   exitProc:=oldExitProc;
   //closeGraph;
  end;{graphExit}

procedure MyExitProc;
 begin
//  nosound;
//  setFillStyle(1,blue); setColor(white);
//  bar3D(10,0,GetMaxX-24,32,0,true);
  //if znak='H' then
//   outTextXY(150,13, 'Przerwane na zyczenie OPERATORA ')
  //else
//  if (dosError=0) then outTextXY(100,13,'KONIEC ANALIZ !'+error_kom)
  //else
   begin
//    str(dosError,lancuch);
//    outTextXY(100,13,'program przerwany z powodu bledu WE/WY; DosError='+lancuch)
   end;
//  puc;repeat until KeyPressed;puc;
  exitProc:=@graphExit;
   if ostat=false then
       StatFinish(corr_spectr_nb,ph_corr_nb,sort,fall,stat);
  retriever(opis);
  closeRealTypeFiles(resND,stat);
//  close(lst);
  if tspo then buzz_hiss_files_close;
 end;{myExitProc}

 procedure paragraf;          {wywolywana w zwiazku ze zmiana rozdzielczosci}
  begin
   win_init(11);
   with grstat do                            {odniesienie dla ruchomego okna}
    begin
     topY:=ypmin; bottomY:=ypmax-1; leftB:=xpmin; rightB:=xpmax;
    end;{with}
   // returnTextMode;
 //Window(1,1,80,25);
  end;{paragraf}

 function new_par_fiz(edit:Tedit):extended;
  {
Odczyt wartości rzeczywistej z okna edycyjnego
  }
 begin
  if not trystrToFloat(edit.text,result) then
  begin
  showMessage('Wpis '+'"'+edit.text+'"'+' nie ma postaci liczby!'#13#10+
  'Jeśli dotyczy to znaku ułamka decymalnego, to może to mieć związek z nastawami regionalnymi.'#13#10+
  'Jeśli tak, to program będzie wymagał kompilacji w środowisku, w którym aktualnie pracuje');
  result:=0;
  Edit.Text:=floatTostrF(result,ffFixed,1,0);
  application.processMessages;
  end;
 end;{new_par_fiz}

 procedure setDefaults;

 Begin
 Tfilerec(plikz).mode:=fmClosed;
 nowy_start:=false;
 lookFor:=0;
 p1:=false;
 temp:=0;
 t1:=0;
 t2:=0;
 t4:=0;
 t5:=0;
 patternPath:='';
 dy:=0;
 Smin:=1e38;
 Smax:=-1e38;
 ret_res_int:=false;
 count_cp_bool:=false;
 jumper:=false;
 freezToDisk:=false;
 zm_1:=0;
 phase_corr:=false;
 config_show:=true;
 res_to_scr:=true;
 ret_to_scr:=false;
 only:=false;
 filtrFreqChange:=false;
 less_jump:=false;
 prtScr:=false;
 test:=false;
 config:=1;
 helpUp:=true;
 arrow:=#31;
 arrow2:=#31;
 invUp:=false;
 inv:=2;
 quiet:=true;
   {----------------------------------------------------------default settings}
 HeapFull:=false;
 sing:=false;
 retriev:=false;
 rate:=7000;
 freez:=false;
 count:=256;   sqrCount:=count*count;
 f0max:=600;
 poz:=2;
 winNbr:=0;
 rectWinFill:=100;
 cpstr:=false;
 filtrOn:=false;
 fft_rev:=false;
 spnd:=false;
 cpnd:=false;
 cpfnd:=false;
 revND:=false;
 retND:=false;
 spectr:=true;
 half_win:=false;
 synchro:=true;
 interp:=false;
 resol:=2;
 lock:=false;
 fullStop:=false;
 grafika:=true;
 krok:=false;
 moovie:=true;
 minlevel:=60;
 source:='d';
 fcpstr:=200;
 HiFiltr:=true;
 osc_to_scr:=true;
 spectr_anal:=true;
 spectr_to_scr:=true;
 ins:=false;
 cpstr_to_scr:=false;
 filtr_to_scr:=false;
 rev_to_scr:=false;
 insPunct:=count div 4;
 cpstrPoint:=15;
 form1.Edit12.Text:=intTostr(cpstrPoint);
 { -------------------------------------------------end of default settings}
 with form1 do
  begin
   Edit11.Text:=floatTostrF(f0max,ffFixed,6,1);
   Edit10.Text:=floatTostrF(jump,ffFixed,6,1);
   Edit2.Text:=intToStr(jumpNbrSamples);
   RadioGroup6.ItemIndex:=poz-1;
   if poz=2 then poziomice:=false else poziomice:=true;
   //RadioGroup7.ItemIndex:=winNbr; zablokowano 08032014 bo wchodzi w radioChange, gdzie jest wołana proc. WindowsWeights, gdzie się zawiesza
   edit15.Text:=floatToStrF(rectWinFill,ffFixed,6,3);//par_fiz('Okno prostokatne; podac % wypelnienia ');
   edit16.Text:='1.00';                       //par_fiz('Okno Gaussa; podac krotnosc odchylenia standardowego ');

   checkBox14.Checked:=spectr_anal;     //co analizować
   checkBox15.Checked:=cpstr;
   checkBox16.Checked:=filtrOn;
   checkBox24.Checked:=half_win;        //no_co('Okno polowkowe?','Nastawy analiz i wyników',half_win);
   checkBox25.Checked:=synchro;       //no_co('Wykres spectrum w trybie synchronicznym?','Nastawy analiz i wyników',synchro);
   checkBox26.Checked:=interp;
   edit3.text:='phon';
   edit4.text:='person';
   edit6.text:='gender';
   edit7.text:='age';
   edit13.Text:=intToStr(resol);                   //'Rozdzielczosc <0, 2>, (r) ')
   edit14.Text:=floatToStrF(minlevel,ffFixed,6,3); //'Rozpiętość zapisu na spectrogramie (60 dB)');
  end;{with form1}
 squash:=true;
 cp:=count div 2;
 logic_poz:=true;
 hires:=true;
 rek:=true;
 rekl:=false;                  {otw. zb. dysk}
 if not(spectr_anal or cpstr or filtrOn or fft_rev or retriev) then rekl:=true;
 if not(spND or cpND or cpFND or revND or retND) then rekl:=true;
 ospnD:=true;ocpNd:=true;ocpfnd:=true;orevNd:=true; FileOpen:=false;
 resNd:=false;
 oRetNaDysk:=true;
 oStat:=true;
 bit:=2; bit:=bit shl (lbaBit-1);         {12-to bitowy sygnal typu word}
 heightLightBuff:=10626;                  {bufor do podswietlenia grafiki}
 End;{setDefaults}

function Customs:boolean;
{
wprowadza nastawy użytkownika
}
var i:integer;
 Begin
  result:=true;
  if (count=2) or (count=4) or (count=8) or (count=16) or (count=32) or
      (count=64) or (count=128) or (count=256) or (count=512) or (count=1024)
  then
  else
   begin
    form1.Edit9.Text :=inputBox('Poprawka szerokości okna','wprowadź wartość<=1024; obecnie jest',intToStr(count));
    count:=strToInt(form1.edit9.Text);
    RamAllocate;
    application.processMessages;
   end;
  cp:=count div 2;
  form1.PageControl3.ActivePageIndex:=0;
  f0max:=new_par_fiz(form1.edit11);//('Podac max czestotliwosc podstawowa F0max ');
  jump:= new_par_fiz(form1.edit10);//('co ile ms wykonywac analize? ');

  poz:=form1.RadioGroup6.ItemIndex+1;
  if poz=2 then poziomice:=false else poziomice:=true;

  winNbr:=form1.RadioGroup7.ItemIndex;
  form1.PageControl3.ActivePageIndex:=3;
  case winNbr of
   0 : rectWinFill:=new_par_fiz(form1.edit15);//par_fiz('Okno prostokatne; podac % wypelnienia ');
   1 : rectWinFill:=new_par_fiz(form1.edit16);//par_fiz('Okno Gaussa; podac krotnosc odchylenia standardowego ');
  end;{case}

  with form1 do
   begin
    spectr_anal:=checkBox14.Checked;
    cpstr:=checkBox15.Checked;            cpstr_to_scr:=false;//checkBox2.Checked; 010513
    filtrOn:=checkBox16.Checked;
    fft_rev:=false;//010513 checkBox17.Checked;
    retriev:=false;//010513 checkBox18.Checked
   end;
  rekl:=not(spectr_anal and cpstr and filtrOn and fft_rev and retriev);
  form1.PageControl3.ActivePageIndex:=1;
  if filtrOn then fcpstr:=New_par_fiz(form1.edit12);//'Filtrowanie, czestotliwość graniczna');

  with form1 do
   begin
    spND:=false; //;010513 checkBox19.Checked
    cpND:=false; //;010513  checkBox20.Checked;
   cpFND:=false; //;010513 checkBox21.Checked;
   revND:=false; //;010513 checkBox22.Checked;
   retND:=false; //;010513 checkBox23.Checked
   end;
  rekl:=not(spND and cpND and cpFND and revND and retND);

  half_win:=form1.checkBox24.Checked;//no_co('Okno polowkowe?','Nastawy analiz i wyników',half_win);

  synchro:=form1.checkBox25.Checked;//no_co('Wykres spectrum w trybie synchronicznym?','Nastawy analiz i wyników',synchro);

  interp:=form1.checkBox26.Checked;
  form1.PageControl3.ActivePageIndex:=2;
  resol:=round(new_par_fiz(form1.edit13));//'Rozdzielczosc <0, 2>, (r) ')
  while not((resol>=0) and (resol<=2)) do
  begin
    form1.Edit13.Text:=inputBox('Poprawić rozdzielczość','wprowadź wartość ,0, 2>; obecnie jest ',intToStr(resol));
    tryStrToInt(form1.Edit13.Text,i);
    resol:=i;
    form1.Edit13.Text:=intToStr(resol);
    application.processMessages;
   end;
  form1.PageControl3.ActivePageIndex:=2;
  minlevel:=new_par_fiz(form1.edit14);//'Rozpiętość zapisu na spectrogramie (60 dB)');
  while minlevel<=0 do
   begin
    form1.Edit14.Text:=inputBox('Poprawić dynamikę','wprowadź wartość >0; obecnie jest ',floatToStrF(minlevel, ffFixed,6,3));
    minlevel:=new_par_fiz(form1.edit14)
   end;
 End;{Customs}

 procedure moovieTrigeringLogic;
  Begin   {-----------------------------------LOGIKA przelaczania ruchomych obrazkow}
  if sing then      {w sing pozostawic tylko 1, ostatnia analize}
   begin
    if ret_to_scr then
     begin
      rev_to_scr:=false;
      cpstr_to_scr:=false;
      spectr_to_scr:=false;
      osc_to_scr:=false;
     end
    else
    if rev_to_scr then
     begin
      cpstr_to_scr:=false;
      spectr_to_scr:=false;
      osc_to_scr:=false;
     end
    else
     if cpstr_to_scr then
     begin
      spectr_to_scr:=false;
      osc_to_scr:=false;
     end
    else
     if spectr_to_scr then osc_to_scr:=false;
   end;{sing and freez}

  if not (ret_to_scr or retND) then                {wylaczyc zbedne analizy}
   begin
    retriev:=false;
    if not(rev_to_scr or revND) then
     begin
      fft_rev:=false;
      if not(filtr_to_scr or cpfND) then
       begin
        filtrOn:=false;
        if not(cpstr_to_scr or cpND or not spectr) then
         begin
          cpstr:=false;
          if not(spectr_to_scr or spND or spectr) then spectr_anal:=false;
         end;
       end;
     end;
   end;
                                         {nie kasowac okna we freez jesli}
                                         {na ekranie jest tylko 1-na analiza}
  if  osc_to_scr and not(spectr_to_scr or cpstr_to_scr or rev_to_scr or
                        ret_to_scr)    or
   spectr_to_scr and not(osc_to_scr    or cpstr_to_scr or rev_to_scr    or
                         ret_to_scr)   or
    cpstr_to_scr and not(osc_to_scr    or spectr_to_scr or rev_to_scr   or
                         ret_to_scr)   or
      rev_to_scr and not(osc_to_scr    or spectr_to_scr or cpstr_to_scr or
                         ret_to_scr)   or
      ret_to_scr and not(osc_to_scr    or spectr_to_scr or cpstr_to_scr or
                         rev_to_scr )
   then only:=true                {na ekran posylana jest tylko 1 analiza}
  else only:=false;               {a wiec wlaczyc nakladanie sie we freez}
  timeDomain:=osc_to_scr or cpstr_to_scr or ret_to_scr or   {wylaczyc marker}
              rev_to_scr and not cpstr;               {czasowy jesli markery}
  freqDomain:= spectr_to_scr or rev_to_scr and cpstr;        {nakladaja sie }
  marker:=not(timeDomain and freqDomain and freez and filtrOn
          and not (krok or only));
  if not freez or esc or krok or freez and
     not (only or not esc or sing or filtrOn) then
   begin                                     {kasowac poprzednie ruch okno}
    newCoord:=true; zms:=true; overlap:=false; esc:=false; clr:=true;
   end;
  End; {moovieTrigeringLogic}

procedure mainProgram;
{
 --------------------SEGMENT STERUJACY---------------------------
}
var i:longint;
label start;
BEGIN
 error_kom:=' popelnilem BLAD !';           
 new(datavector);
 prmtr_change:=true;
 oldExitProc:=exitProc; ExitProc:=@myExitProc;
// form3.Canvas.TextHeight(60);

 programInfor;                   //ogólne informacje o programie; aktualnie kierowane do pliku cons
 Customs;                        //nastawy użytkownika: określanie i odczyt checkBoxów, radiobuttonów i wyprowadzanie wartości do okien edycyjnych odpowiednio do nastaw (domyślnych)
// graphicsInit(markSize);       //DOS, ustalenie ścieżki do sterownika grafiki, inicjacja, inicjacja kursora pionowego
                                  {czytanie danych, wartosci graniczne parametrow oscylogramow---}

 paragraf;                       //grafika DOS, rozmiary okien (wywoływana w związku ze zmianą rozdzielczości). Określa topY:=ypmin; bottomY:=ypmax-1; leftB:=xpmin; rightB:=xpmax;

 Heap(tref,lba_plackow);                                                              //zorganizowanie stosu tabel wskaźnikowych

 data_info(path,pathspectr,source,rate,format,gain,data,lba_danych,plikz,        //źródło i rodzaj danych: dysk/wave/word|gen|port
  startPoint,lookFor1,czest,freq,modul,dataVector,clock_freq,f0max,spow,
  p1,kontr_glob,board_num,trigger,mode,chanlo,int_level,error_code,
  sklSt,base_adr,triglev,opis,create);

 data_input(source,lookFor,startPoint,lba_danych,format,lba_plackow,tref,bufor,plikz,  //wczytać dane ze źródła j.w., pokazać pełny oscylogram (na życzenie)
  HeapFull,rez,lookfor1,storedDataNb,czest,modul,freq,chanlo,mode,trigger,
  clock_freq,rate,base_adr,datavector,error_code,p1,trigLev,sklSt,lbaBit,
  create);

 resFileNbControl;                                                                     //określa ostatni znak rozszerzenia dla automatycznego oznaczania kolejnych wersji wyników (zestaw uzyskany w danej sesji będzie mial tę samą literę)  begin
 if not (source in ['t','d']) then                                                     //zapis na dysk danych z portu lub generatora wewnętrznego
  dataPut(pathCpstr,lba_plackow,plik,rate,gain,rez,bufor,path,opis,spow,pathspectr);
 nowy_start:=false; Lock:=false;
 grafika:=true;  logik:=true; fullStop:=false;
start:
 paragraf;                                                                             {grafika DOS, wywolywana w zwiazku ze zmiana rozdzielczosci. Określa topY:=ypmin; bottomY:=ypmax-1; leftB:=xpmin; rightB:=xpmax; }
 closeRealTypeFiles(resND,stat);                                                       {zamyka otwarte pliki - tu tylko na wszelki wypadek (?), bo resNd=false...}
 SminRF:=1e38; SmaxRF:=-1e38; SsRF:=0; SsqRF:=0; Sdata_nb:=0;
 VminRF:=1e38; VmaxRF:=-1e38; VsRF:=0; VsqRF:=0; Vdata_nb:=0;
 CminRF:=1e38; CmaxRF:=-1e38; CsRF:=0; CsqRF:=0; Cdata_nb:=0;
 ph_corr_nb:=0;                   {liczba korekt fazy}
 corr_spectr_nb:=0;               {liczba korygowanych wektorow}
 with restat do                   {wartosci poczatkowe zbioru statystycznego}
  begin                           {dla oceny skutecznosci korekty fazy}
     zm_0:=0;
  delta_0:=0;
    s_d_0:=0;
  k_s_d_0:=0;
      s_d:=0;
    k_s_d:=0;
 abss_d_0:=0;
   abss_d:=0;
  end;
 st_par_osc;                  // stale parametry wykresu oscylogramu: lba_probek_na_osc, _na_skok, lba_pktów na skok, ik, ip {na dysk; ip, ik - pierwsza i ostatnia}
// set_scr_res(resol);
  win_init(13);               //parametry okien grafiki zależnie od karty
 st_par_fft;                  //Stale parametry przetwarzania rFFT: y0, df, dOm, sin, cos, wagi okien pot2, firstIn, fidIx, cIdx, fcpstr
 tecza(barwy);                //ustawia 16 kolorów w kolejności "mapowej" - od niebieskiego do brązowego

 {-------------------PETLA GLOWNA---------------------------}
 xr:=yZero;  esc:=false; newCoord:=true;overlap:=false;zms:=true;
 nr_serii:=1; nr_osc:=0;scr_nr:=0; pix1Y:=0; pixY:=0; osc:=0;
 spktr_as:=0; scr_nr_as:=0; moovie:=true; krok:=false;
 nr_konc:=0; pulLight:=1; ToDiskCounter:=0; freezToDisk:=false;
 dy:=round((-1+scr_nr)*lba_pktow_na_jump-grstat.winymin+TopY)+5;{ruch synchr}
 checkBreak:=false; zmsk:=True; clr:=false; zm_1:=0; time_change:=0;
 if spectr then begin minlev:=-minlevel; maxlev:=0 end
  else begin minlev:=0; maxlev:=minlevel end;
 for i:=0 to count-1 do old_obs[i]:=minlev;                 {w interpolacji}
 pixY1:=TopY; pixY2:=pixY1; F0idx:=count div 4; F0idx1:=F0idx;

 REPEAT
  if not (spND or cpND or cpfND or revND or retND) then resND:=false;
  if not resNd then ToDiskCounter:=0;     {zmiana punktu czasu mozliwa tylko}
                                          {jesli wyniki nie ida na dysk}
moovieTrigeringLogic;
if not freez or clr or filtrFreqChange  then   {#9, TAB - freez - przełącza automatyczny ruch okna}
 BEGIN
  if (ToDiskCounter<>0) and resNd then
   begin
    if freez then
     begin
      if (ToDiskCounter<0) then
       begin
//        Informator('Naprzod dla zapewnienia ciaglosci analiz',8,GetMaxY-24,0,0);
        nap
       end
      else if(toDiskCounter>1) then
       begin
//        Informator('Powrot dla zapewnienia ciaglosci analiz',8,GetMaxY-24,0,0);
        cof;
        esc:=true; config_show:=true;
       end
     end
    else
     begin
//      Informator('Powrot dla zapewnienia ciaglosci analiz',8,GetMaxY-24,0,0);
      if (ToDiskCounter>0) then cof
      else nap;
     end{else freez}
   end;{toDiskCounter<>0}
  if not freez and (not((toDiskCounter=0) or resNd) or (toDiskCounter=0)) then
   begin
    inc(nr_konc);    {nr_konc okresla liczbe danych juz pobranych do analizy}
    biez_koniec:=nr_konc*jumpNbrSamples;
    if (biez_koniec>count+1) then
     begin                       {zamrozic w 0 HeapPosPointer i pocz. podsw.}
      inc(pulLight); inc(nr_serii)
     end;
    inc(scr_nr);                                 {przesuwa duze okno ruchome}
   end;{not freez}
  kontr_otw_zb(resFileNb,phase_corr,resNd);
  with grstat do
  if spktr_as>(bottomY-TopY) then
   begin
    if fullStop and grafika and not synchro then     {stop jesli pelny ekran}
     begin
      //write(cons,#7); znak:='@';
      grColor:=14{yellow};lancuch:='    Nacisnij spacje aby kotynuowac    ';
      with grstat do
       win_x_y_title(lancuch,'x',winYmin+18-ypmax-65,0,5{magenta},true);
//      repeat while KeyPressed do znak:=ReadKey until znak=' ';
     end;
    spktr_as:=1;                                     {zaczac od pocz. ekranu}
    inc(scr_nr_as)
   end
  else inc(spktr_as);
  if biez_koniec>count then biez_koniec:=count;
  HeapPosPointer:=(nr_serii-1)*jumpNbrSamples;
  if prtScr and spectr_anal and osc_to_scr then
   begin
    xr:=cosar; yi:=sinar;
    druk('Dane do spectrum tablice cos i sin (w X i Y odpowiednio)'#10#13+
          'virt_vect zawiera przypadkowe wartosci');
   end;
  if test then
   begin
{    i:=2; i:=i shl (lbaBit-1); t:=i/count;
    for i:=0 to count-1 do xr^[i]:=(i+1)*t;
}
    i:=2; i:=i shl (lbaBit-1); temp:=i;
    for i:=0 to count-1 do xr[i]:=exp(-8*i/count)*temp;

   end
  else
  fromHeap(HeapPosPointer,tref,xr,bufor,biez_koniec,lba_danych,sklSt,error_code);
  if biez_koniec<count then      {przesunac niepelna porcje do konca wektora}
   for i:=count-1 downto 0 do
    begin
     jot:=biez_koniec+i-count;
     if jot>=0 then xr[i]:=xr[jot] else xr[i]:=sklSt
    end;{for i}
  if HeapPosPointer+biez_koniec+1>storedDataNb then                          {uzupelnic koncowke zerami}
   for i:=storedDataNb-HeapPosPointer to count-1 do xr[i]:=sklSt;
  if prtScr and osc_to_scr then druk('Dane do spectrum (sygnal wejsciowy)'+
     #10#13'Y i Virt_Vect zawieraja przypadkowe wartosci');
 END;{if not freez or clr or filtrFreqChange}
{
 2. -------------------  WYKRESY I OBLICZENIA   ---------

 2.1.1 ----------- Sygnal - amplituda;  a) - wczytanie danych ------------
}
  u:=0;
  if config_show or not freez or clr or filtrFreqChange  then
  begin
   if not freez or clr or filtrFreqChange  then
    begin
     if freez and (toDiskCounter>0) then freezToDisk:=true  {w zamroz. nie przesylac wyn. na dysk}
     else freezToDisk:=false;
     ToDiskAvail:=not freez and (ToDiskCounter=0)
                  or freez and (ToDiskCounter=1) and freezToDisk;

//     if dosError<>0 then halt;
    end;
   if config_show  then
    with grstat do
    begin
     grafik1;                                              //przywraca i precyzuje tryb graficzny
     commandInfo(help_nr);                                 //wydruki info o funkcji spelnianej przez nacisniety klawisz klawisze o kodach specjalnych maja znak ujemny; help_nr pochodzi z COMMANDE
     if not prmtr_change then
      begin
       prmtr_change:=true;
       win_init(11);  grColor:=0{black}; lancuch[0]:=#80;
       win_x_y_title(lancuch,'x',winYmin+18-ypmax-20,-48,0{black},true);
       lancuch[0]:=#80;
       win_x_y_title(lancuch,'x',winYmin+18-ypmax-30,-48,0{black},true);
      end;
     case config of
      1 : konfiguracja11;
      2 : konfiguracja21;
      3 : konfiguracja31;
      4 : konfiguracja41;
      5 : konfiguracja51;
      6 : konfiguracja61;
      7 : konfiguracja71;
     end;
     config_show:=false;
     if helpShow then helper;
//     setFillStyle(1,lightRed);
    end;
//   getFillSettings(flst);
   if toDiskAvail and (ToDiskCounter=1) then
    begin toDiskCounter:=0; config_Show:=true end;
   if not freez or clr or filtrFreqChange  then
    begin
     filtrFreqChange:=false;
     If grafika then
      begin
       grafik1;    {sprawdzic otwarcie trybu graficzn., wyczyscic ruchome okno}
       paragraf;     {aktualizacja parametrow na wypadek zmiany rozdzielczosci}
       if rekl then begin GrColor:=15{white};
//       getFillSettings(flst);
       with grstat do
        win_x_y_title(auth,'x',winYmin+18-ypmax-25,-40,0{black},true);
//       getFillSettings(flst);
       rekl:=false end;
       if krok then i:=count-biez_koniec;
       if not pSlide then
        if (not freez or clr or pgUp or pgDn)  then
         begin
          oscylogram(w_p_s);
          //getFillSettings(flst);
          podswietlenie;
          //getFillSettings(flst);
          wykres_Wag_Okna;
          //getFillSettings(flst);
         end
        else
       else inc(nr_osc);
//       getFillSettings(flst);
       grcolor:=10{lightGreen};
       if moovie and osc_to_scr then
        begin
         if only then overlap:=false;
         //getFillSettings(flst);
         maly_oscylogram;
         //getFillSettings(flst);
        end
       else if not (res_to_scr) then clean(0,overlap);
      end;{grafika}
//      getFillSettings(flst);
      with grstat do     {bar wskazujacy % do konca sygnalu}
       begin
        i:=round(winMap[13,3]+HeapPosPointer*wsp_pix);
//        bar(getMaxX-2,i,getMaxX,round(winMap[13,3]+(HeapPosPointer+jumpNbrSamples)*wsp_pix));
       end;
   {2.2.1---------------------------------------rFFT obliczanie  spectrum ----}

     if spectr_anal then spectr_moment;
     if spNd and ToDiskAvail then
     // RealFileDisk(Spktrplik,cp,nr_konc,SminRF,SmaxRF,SsRF,SsqRF,Sdata_nb,virt_vect); 19052013 zablokowano z powodu niezgodności typu
     if grafika and moovie and spectr_to_scr then
      if not Change_insert then
       wykres_spectrum_mom(freq_interval,cpstr,fft_rev,retriev,fIdx)
      else if not (res_to_scr) then clean(0,overlap);
     if grafika and spectr_anal and spectr and
        not (filtrOn and fft_rev and cpstr) then
      begin
       if not (spectr_to_scr or osc_to_scr) then clean(0,overlap);
       minlev:=-minLevel; maxLev:=0;
       kolor_spectr(scr_nr_as,freq_interval,pixY,pix1Y,pix_as,pix_as1,delta,
        interp,poz,cp,minlev,maxlev);
      end;
//     getFillSettings(flst);
     if cpstr then
     begin
      cepstrum;
//      if not quiet then sound(round(F0));
      if  grafika then
       begin
        if not spectr then
         begin
          minLev:=0; maxlev:=minlevel;
          kolor_spectr(scr_nr_as,freq_interval,pixY,pix1Y,pix_as,pix_as1,
          delta,interp,poz,count,minlev,maxlev);
         end
        else
         if auto_freq and filtrOn and (time_change <>nr_konc) then
         with grstat do
          begin {wykres F0}
           zmp1:=round(xpmin+count/F0idx1*(xpmax-xpmin)/cp);
           zmp2:=round(xpmin+count/F0idx*(xpmax-xpmin)/cp);
           if synchro then
            pixY2:=round(((pulLight-1)*lba_pktow_na_jump+lba_pktow/2))+topY
           else begin pixY1:=spktr_as+topY; pixY2:=pixY1 end;
//          setColor(white);
//          line(zmp1,pixY1,zmp2,pixY2);
          pixY1:=pixY2;
         end;
       end;
      if cpNd and ToDiskAvail then
      // RealFileDisk(CpstrPlik,cp,nr_konc,CminRF,CmaxRF,CsRF,CsqRF,Cdata_nb,virt_vect); 19052013 zablokowano z powodu niezgodności typu
     end;
     if filtrOn and not cpstr then
      begin
       filtr(xr,yi,count,fcpstr,fIdx,barL,barM);
       barJ:=fIdx;
      end;
     if fft_rev then
     begin
      tran_rev(stat);
      logos:=retND and ToDiskAvail;
      if logos or phase_corr then
       begin                                      {sygnal po filtracji cepst}
        if moovie and grafika and (ret_to_scr or not cpstr and rev_to_scr)
        then with grstat do
         begin                      {pokazac na ekranie odcinek przekazywany}
          t1:=(xpmax-xpmin)/count;  {na dysk; ip, ik - pierwsza i ostatnia}
//          if logos then setColor(lightRed) {probka przeka zywana na dysk}
//          else setColor(lightcyan);
//          rectangle(round(xpmin+ip*t1),ypmin,round(xpmin+ik*t1),ypmax);
         end;
        if logos then
         begin
          retr_res_to_v_disk(Smin,Smax,ram_disk);
          ret_res_int:=true;
         end;
       end;{retND}
     end;
     if freez and not (esc or krok) and (only or sing) and (zmsDone or osc_to_scr)
     then
      begin                       {wlaczyc nakladanie sie obra-}
       newCoord:=false;           {zow ruchomego okna we freez }
       zms:=false; overlap:=true; {w only i w singlu}
      end;
     zmsDone:=false;
    end;{not freez or clr or filtrFreqChange}
  end;{configShow or not freez or clr or filtrFreqChange}
  time_change:=nr_konc;
  commander;
  if rekl then rek:=false;
  if nowy_start then begin nowy_start:=false; goto start end;
 UNTIL fin;
 END; {mainProgram}

 Initialization
 error_kom:=' - Data set exosted; no errors'#13#10' - wyczerpany zbiór danych; żadnych błędów!';
 sklSt:=maxWord;
 END.

