Digitaler Tiefpass VHDL

Gast #1727988
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;
Gast #1728098
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren