mikrocontroller.net

Forum: FPGA, VHDL & Co. Digitaler Tiefpass VHDL


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
  LPF: process (Clk, Rst)
    variable sumI, sumQ: signed(baseband_bits-1 downto 0);
    
    function "sra"(x: signed; n: natural) return signed is
      variable xx: signed(x'length-1 downto 0) := x;
    begin
      for i in 1 to n loop
        xx := xx(xx'left) & xx(xx'left downto 1);
      end loop;
      return xx;
    end;

  begin

    if Rst = '1' then
      filterI <= (others => '0');
      filterq <= (others => '0');
      sumI    := (others => '0');
      sumQ    := (others => '0');
    idumpI  <= (others => '0');
    idumpQ  <= (others => '0');
    elsif rising_edge(Clk) then
      if dump = '1' then -- Dump integrator, generate output
        -- Output lowpass
        filterI <= resize(
                     filterI  + ((signed'((sumI - filterI) * filter_rate)) sra filter_shift),
                     filterI'length);
        filterQ <= resize(
                     filterQ  + ((signed'((sumQ - filterQ) * filter_rate)) sra filter_shift),
                     filterQ'length);
        -- dump the integrator
        sumI := (others => '0');
        sumQ := (others => '0');
      end if;
      -- Integrate (or initialise, if it's the dump cycle)
      sumI := sumI + prodI;
      sumQ := sumQ + prodQ;
      idumpI <= sumI;
      idumpQ <= sumQ;
    end if;

  end process;


  -- Produce the output
  --
  I <= filterI;
  Q <= filterQ;

end;

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du suchst nach der Tustin-Transformation
http://de.wikipedia.org/wiki/Bilineare_Transformat...)


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.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/Digitalfil...
Filterberechnung mit Scilab und Octave

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.