// Filterkoeffizienten nach sin(x)/x * Blackmann erzeugen procedure TFiForm.DoGenerate(Cutoff : double); var D : double; P, Q, R : double; i : integer; M : integer; M2: integer; begin D:= Cutoff; M:= FilterTapnum; M2:= M div 2; for i:= 0 to M do begin if i = M2 then P:= D else P:= (sin(D * (i - M2))) / (i - M2); // Blackman-Fenster Q:= 0.42 - 0.5 * cos((2 * PI * i)/M) + 0.08 * cos((4 * PI * i)/M); R:= P * Q; FilterTaps[i]:= R; end; end; // einen Bandpass oder Bandsperre generieren procedure TFiForm.BAPAGenButtonClick(Sender: TObject); var S : String; D1, D2, Q : double; i : integer; begin S:= BandEdit.Text; if not ErsterWert(S,D1) then exit; if not ZweiterWert(S,D2) then exit; if D1 >= D2 then exit; D1:= D1 * 1000; // kHz --> Hz D1:= 2 * PI * (D1 / SampleFrequenz); D2:= D2 * 1000; // kHz --> Hz D2:= 2 * PI * (D2 / SampleFrequenz); // einen Tiefpaß für die niedrigere Frequenz generieren und normalisieren DoGenerate(D1); // Tiefpass normalisieren und in Filtertaps2 merken Q:= 0; for i:= 0 to FilterTapNum do Q:= Q + FilterTaps[i]; for i:= 0 to FilterTapNum do FilterTaps2[i]:= FilterTaps[i] / Q; // einen zweiten Tiefpaß generieren, auch normalisieren DoGenerate(D2); Q:= 0; for i:= 0 to FilterTapNum do Q:= Q + FilterTaps[i]; for i:= 0 to FilterTapNum do FilterTaps[i]:= FilterTaps[i] / Q; // zweiten Tiefpass per Spektralinversion zum Hochpaß machen for i:= 0 to FilterTapNum do FilterTaps[i]:= -FilterTaps[i]; i:= FilterTapNum div 2; FilterTaps[i]:= FilterTaps[i] + 1.0; // beide Pässe addieren, daraus wird eine Bandsperre for i:= 0 to FilterTapNum do FilterTaps[i]:= FilterTaps[i] + FilterTaps2[i]; if RBpass.Checked then begin // und per Spektralinversion zum Bandpaß machen for i:= 0 to FilterTapNum do FilterTaps[i]:= -FilterTaps[i]; i:= FilterTapNum div 2; FilterTaps[i]:= FilterTaps[i] + 1.0; end; SetzeTapListbox; DrawFilterkernel; end;