Forum: Digitale Signalverarbeitung / DSP / Machine Learning sinc^k dezimierungsfilter


von Aa B. (tnightlife)


Lesenswert?

Hallo,

ich muss einen sinc^k dezimierungsfilter in vhdl schreiben. Ich versuche 
mich zu diesem Filter "einzulesen", leider finde ich keine ausreichenden 
Informationen zum Filter.

Kennt Ihr vielleicht eine Homepage oder ein Buch, wo das ganz gut 
erklärt ist.

Danke

: Bearbeitet durch User
von Aa B. (tnightlife)


Angehängte Dateien:

Lesenswert?

Hallo,

schade, dass sich bisher keiner gemeldet hat.. :d... also ich bin heute 
während meiner suche auf den aufbau eines sinc^3 fitlers gestoßen..

3 summierer, 1 down sampler (d-latch) und 3 differenzierer.

ich weiß leider nicht wie ich das in vhdl umsetzen kann, bin in vhdl nur 
soweit, dass ich einzelne latches, flipflops, de/encoder und multiplexer 
schreiben kann.

kann mir jemand eventuell bezüglich der umsetzung helfen, danke.

von Georg A. (georga)


Lesenswert?

Schreibs erstmal als Modell in einer beliebigen "normalen" Sprache (C, 
Perl, Matlab, ...). Brauchst du nachher ohnehin, um Testvektoren zu 
erzeugen ;)

von Marcus W. (marcusaw)


Lesenswert?

Das ist wirklich alles, was du nach einigen Recherchen gefunden hast? 
Also ich bin mir ziemlich sicher, dass du das auch durch ausprobieren 
herausgefunden hättest... Noch dazu, dass das Modell weder effizient 
rechnet, noch besonders komfortabel ist.

Schlimmer: Wenn du bei deinem geposteten Bild nicht weißt wieso das in 
etwa das tut, was es soll, solltest du lieber die Finger von FPGAs 
lassen...

: Bearbeitet durch User
von MJF (Gast)


Lesenswert?

Dieses Filter wird auch als CIC-Filter bezeichnet. Wenn Du in Wikipedia 
unter diesem Begriff suchst, findest Du eine Literaturstelle auf das 
Originalpaper von Hogenauer (Erfinder dieses Filters).

Auf der ersten Seite von Google habe ich folgenden Link gefunden:
http://www.embedded.com/design/configurable-systems/4006446/Understanding-cascaded-integrator-comb-filters

Beim CIC handelt des sich um mehrere hintereinander geschaltete Filter 
mit einer Rechteck-Impulsantwort. Die Länge der Impulsantwort in 
Abtastwerten entspricht dem Dezimationsfaktor des Filters. Zur 
Realisierung einer Rechteck-Impulsantwort kann ein Integration mit einer 
anschließenden Differenzwertbildung verwendet werden. Werden mehrere 
Stufen dieser Rechteckfilter hintereinander geschaltet, können wegen der 
LTI-Eigenschaft die Reihenfolge der einzelnen Blöcke vertauscht werden. 
So kommen alle Integrierer nach vorne und alle Differenzierer nach 
hinten.

Das in meinen Augen schwierigste beim CIC-Filter ist die Dimensionierung 
der Wortbreiten der einzelnen Stufen. Je nach Stufenanzahl und 
Dezimationsfaktor können hohe Wortbreiten auftauchen. Das ist ein 
komplexes Thema und je nach Anforderung (Eingangswortbreite, 
Stufenanzahl, Dezimationsfaktor, gewünschte Genauigkeit) kann es 
aufwendig werden.

Vielleicht hilft Dir ja ein IP-Block?

Markus

von Aa B. (tnightlife)


Lesenswert?

Hallo,

ich beschäftige mich derzeit mit diesem Thema und hatte vorher nichts 
mit FPGA´s zutun.

Habe nur einiges in VHDL geschrieben und auf Modelsim angesehen, ob es 
so reagiert, wie ich es mir vorgestellt habe.

Ich will nicht das "gesamte" Sprektrum anlernen, was man mit FPGA´s so 
anstellen kann.
Bei meiner Aufgabenstellung muss ich "nur" einen sinc^n Filter (in 
meinem Fall ein sinc^3) in VHDL realisieren.

Ob diese Schaltung super ist oder total schlecht (@marcusaw) ist so 
gesehen sch... egal.

@georga: ich weiß nicht was das mit den "testvektoren" sein soll.
@marcusaw: keine ahnung was ich dazu sagen soll..
@MJF (Gast): als "Gast" hast du mir bisher die informatifste Antwort 
gegeben, danke, ich lese mich da mal durch

-----

Ich war nun soweit, dass ich folgenden VHDL Code zu der bereits 
angegebenen Schaltung realisieren konnte. Ist das im Bezug auf die 
Schaltung ok?

danke


Dezimierungsrate 64.. 3. Ordnung
-----

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity sinc3 is
port(RESN, MDAT, MCLK, MCLKM : in std_logic;
CN5 : out std_logic_vector(19 downto 0));
end sinc3;

architecture behav of sinc3 is
signal DN0, DN1, DN3, DN5 : std_logic_vector(19 downto 0);
signal CN0, CN1, CN2, CN3, CN4 : std_logic_vector(19 downto 0);
begin

process(RESN, MCLK)
begin
if RESN = '0' then
CN0 <= (others => '0');
CN1 <= (others => '0');
CN2 <= (others => '0');
elsif MCLK'event and MCLK = '1' then
if MDAT = '1' then
CN0 <= CN0 + 1;
CN1 <= CN1 + CN0;
CN2 <= CN2 + CN1;
end if;
end if;
end process;

process(RESN, MCLKM)
begin
if RESN = '0' then
DN0 <= (others => '0');
DN1 <= (others => '0');
DN3 <= (others => '0');
DN5 <= (others => '0');
elsif MCLKM'event and MCLKM = '1' then
DN0 <= CN2;
DN1 <= DN0;
DN3 <= CN3;
DN5 <= CN4;
end if;
end process;

CN3 <= DN0 - DN1;
CN4 <= CN3 - DN3;
CN5 <= CN4 - DN5;
end behav;

: Bearbeitet durch User
von Georg A. (georga)


Lesenswert?

> ich weiß nicht was das mit den "testvektoren" sein soll.

Du willst/musst doch deinen Code irgendwie simulieren, um festzustellen, 
ob er auch das Richtige tut. Also musst du Eingangsdaten erzeugen und 
auch "korrekte" Ausgangsdaten zum Vergleich mit dem VHDL-Output. Zum 
besseren Verständnis des Algorithmus (und evtl. Anforderungen bzgl. 
Rechengenauigkeit) ist es meistens auch besser/schneller, das erstmal 
"normal" zu programmieren.

von Aa B. (tnightlife)


Lesenswert?

Hallo,

also testen tue ich das ganze immer mit Modelsim. Da kann man den 
Eingängen Werte zuordnen und sehen, was dann passiert.

Also ich mache das immer so und das geht dann auch ganz zügig mit dem 
VHDL Code.

Danke

von Georg A. (georga)


Lesenswert?

> also testen tue ich das ganze immer mit Modelsim. Da kann man den
> Eingängen Werte zuordnen und sehen, was dann passiert.

Klar musst du mit irgendwas simulieren. Modelsim, ghdl, etc. Aber 
WOHER kommen denn die Eingangswerte bei so DSP-Kram? Das ist ja dann 
schon etwas mehr als nur mal ein paar Statemachines triggern. 
Vergleichst du die potentiell Abermillionen von Ausgangswerten im 
Waveform-Viewer?

von tnightlife (Gast)


Lesenswert?

@georga: ja, du hast recht. scheint nur bei einfachen dingen zu 
funktionieren mit modelsim usw.

ich will meinen sinc filter in quartus auf einem fpga laden und über 
signaltap die sprungantwort sehen.

ich weiß leider nicht, wie man das in quartus anstellt.

gibt es da eventuell ein tutorial zu, wie man vhdl code einbindet..

danke

von Aa B. (tnightlife)


Angehängte Dateien:

Lesenswert?

Hallo,

also ich bin nun soweit angekommen, dass ich meine VHDL Datei in Quartus 
korrekt einbinden konnte.

Normalerweise müsste ich laut einem gefundenen Tutorial jetzt die 
Pinbelegung machen und mit einem Funktionsgenerator Signale an den 
Eingang legen und schauen was so am Ausgang passiert.

Ich möchte aber einen 8 Bit an den Eingang legen (00001111) und im 
Signal Tap sehen, was passiert, also ohne Pin Belegung und 
Funktionsgenerator.

Wie kann ich das realisieren? Also wie bringe ich das zustande, dass ich 
ein clk, clk/M (Dezimierungsrate), Mdat und resn an den Eingang lege und 
im Signal Tap das Ergebis sehe..?

Ich wäre sehr dankbar für eine hilfreiche Antwort.

: Bearbeitet durch User
von Aa B. (tnightlife)


Lesenswert?

Also den MCLK habe ich. Ich nehme einfach den clk von dem FPGA, also 
verbinde ich da einfach den Pin im Pin Planer.

Kann mir bitte jemand helfen, wie ich die anderen Inputs hinkriege und 
es dann im Signal Tap darstelle?? (MCLKM (MCLK / 64), MDAT (00001111), 
RESN)


Danke

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.