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;
|