Forum: FPGA, VHDL & Co. Digitaler Tiefpass VHDL


von Tobias (Gast)


Lesenswert?

Für ein Projekt benötige ich einen einfachen digitalen Tiefpassfilter 
z.B. 1. Ordnung. Hierfür bin ich im Netz auf folgenden Code gestoßen den 
ich nicht ganz verstehe! Ich weis das es sich um ein TP 1. Ordnung 
handelt, sehe allerdings nicht wo ich die Werte für die Grenzfrequenz 
einstellen kann/ bzw. wie der Zusammenhang mit der Übertragungsfunktion 
des äuivalenten analogen Filters aussieht!?
Wer kann mir weiterhelfen?
1
  LPF: process (Clk, Rst)
2
    variable sumI, sumQ: signed(baseband_bits-1 downto 0);
3
    
4
    function "sra"(x: signed; n: natural) return signed is
5
      variable xx: signed(x'length-1 downto 0) := x;
6
    begin
7
      for i in 1 to n loop
8
        xx := xx(xx'left) & xx(xx'left downto 1);
9
      end loop;
10
      return xx;
11
    end;
12
13
  begin
14
15
    if Rst = '1' then
16
      filterI <= (others => '0');
17
      filterq <= (others => '0');
18
      sumI    := (others => '0');
19
      sumQ    := (others => '0');
20
    idumpI  <= (others => '0');
21
    idumpQ  <= (others => '0');
22
    elsif rising_edge(Clk) then
23
      if dump = '1' then -- Dump integrator, generate output
24
        -- Output lowpass
25
        filterI <= resize(
26
                     filterI  + ((signed'((sumI - filterI) * filter_rate)) sra filter_shift),
27
                     filterI'length);
28
        filterQ <= resize(
29
                     filterQ  + ((signed'((sumQ - filterQ) * filter_rate)) sra filter_shift),
30
                     filterQ'length);
31
        -- dump the integrator
32
        sumI := (others => '0');
33
        sumQ := (others => '0');
34
      end if;
35
      -- Integrate (or initialise, if it's the dump cycle)
36
      sumI := sumI + prodI;
37
      sumQ := sumQ + prodQ;
38
      idumpI <= sumI;
39
      idumpQ <= sumQ;
40
    end if;
41
42
  end process;
43
44
45
  -- Produce the output
46
  --
47
  I <= filterI;
48
  Q <= filterQ;
49
50
end;

von Armin (Gast)


Lesenswert?

Du suchst nach der Tustin-Transformation
http://de.wikipedia.org/wiki/Bilineare_Transformation_(Signalverarbeitung)


damit kannst du eine bekannte Übertragungsfunktion G(s), z.B. für 
besagten Tiefpass, in eine zeitdiskrete z-Übertragungsfunktion G(z) 
transformieren (Näherung).
Das Ergebnis lässt sich dann direkt mit "Zeitverzögerungen"=Register in 
PLD implementieren.

Was ich aber so bisher gelesen habe, macht man das heutzutage nicht mehr 
per Hand. Dafür gibt's in vielen Toolchains spezielle Filterrechner.

von Tobias (Gast)


Lesenswert?

Ahh ok..  danke für die schnelle Antwort
Kannst du mir da einen speziellen Filterrechner empfehlen?
(Im Falle das du schon mal mit einem gearbeitet hast)

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.