Hallo
ich versuche ein CIC Decimation Filter in VHDL zu implementieren, leider
scheitere ich schon bei der Simulation mit SCILAB. Laut Dokument vom
Xilinx
http://www.xilinx.com/bvdocs/ipcenter/data_sheet/cic_compiler_ds613.pdf
wird im vorderen Teil des CIC über mehrere Stufen integriert. Wenn ich
das SCILAB Simuliere, wird es aber irgendwann einen Überlauf geben
(siehe Bild). Was läuft hier falsch?
function [y] = cic_int(x)
l=length(x);
y(1)=x(1);
for i=2:l,
y(i)=y(i-1)+x(i);
end;
endfunction;
x=linspace(0,10*%pi,1000);
y=sin(x);
subplot(3,1,1); // Sinus
plot2d(y);
subplot(3,1,2);
plot2d(cic_int(y)); // Sinus integriert
subplot(3,1,3);
plot2d(cic_int(cic_int(y))); // Sinus 2 * integriert
Gruss sam
>>Was läuft hier falsch?
Nichts, offsetbehaftete Signale machen am CIC natürlich overflow. Das
spielt aber keine Rolle, die Differenzierer 'bügeln das wieder aus',
wenn man gewisse Bedingungen bzgl. der Bitbreiten einhält.
Google 'CIC Overflow' liefert z.B. das:
http://www.informit.com/articles/article.aspx?p=361985&seqNum=2&rl=1
Im Orginalpapier von Hogenauer, das mir im Moment nicht vorliegt, wird
meiner Erinnerung nach auch erheblich auf die overflow issues
eingegangen.
Cheers
Detlef
Danke für deine Hilfe, das CIC funktioniert tatsächlich auch wenn es zu
einem Überlauf kommt. Hätte ich nicht gedacht.
Eine Frage hätte ich noch. Z.B. bei einem CIC Decimation Filter mit
einer Reduktion von 10 (siehe Bild) wird die Datenrate um den Faktor 10
Dezimiert. Kommt es dadurch nicht zu einer Spiegelung der Frequenzen von
0.05 bis 0.10 wegen dem Aliasing? Das Signal bei 0.05 wird ja nur um ca.
15dB gedämpft.
Ja, kommt es. Die einfache Berechnung hat auch ihren Preis. Als Abhilfe
könntest du weniger stark dezimieren und den Rest mit einem normalen
FIR-Filter machen (der kann dann ggf. auch gleich den krummen
Frequenzgang im Durchlassbereich korrigieren).
Kann man sich das so vorstellen (siehe Bild)? Die rote Linie sind die
gespiegelten Frequenzen und die grüne der "Frequenzgang" des FIR
Filters. Somit hätte das Filter ca. 45dB Dämpfung.
Ja, das Bild sollte so stimmen, aber daran denken dass auch noch die
anderen Nebenpeaks mit in dein "Nutzband" hineingeschoben werden.
Allerdings passt das nicht mehr ganz du deiner Beschreibung, du hast ja
schon mit dem CIC um Faktor 10 dezimiert und dann mit dem grünen Filter
nochmal um einen Faktor 2. Um insgesamt 10 zu erreichen musst du das
CIC-Filter auf einen Faktor 5 auslegen und dann das "grüne" FIR-Filter
anwenden.
Danke für die Bestätigung. Die Nebenpeaks sollten eigentlich keine
Probleme machen, da diese auch von FIR abgeschnitten werden. Mit der
falschen Reduktion hast du recht, aber die 10 diente nur als Beispiel.
Inzwischen ist des Filter (CIC + FIR) im FPGA und reduziert die
Samplerate von 50MHz auf 20kHz mit einer Dämpfung von ca. -55dB.
Leider ist es mir noch nicht gelungen mit dem FIR Filter den
Frequenzgang des CIC zu kompensieren. Der gewünschte Frequenzgang sollte
(x/sin(x))^N sein. Ich versuche schon seit Stunden die Koeffizienten des
FIR Filters mit Hilfe der inversen Fouriertransformation zu berechnen,
aber es funktioniert nicht. Ist das eigentlich mit diesen Ansatz
möglich, oder wie berechnet man die Koeffizienten eines solchen
Frequenzganges?
Bevor noch jemand auf meine Frage antwortet, ich habe eine Lösung für
die Berechnung der Koeffizienten für das FIR Filters gefunden. Den
Versuch (wie oben geschildert), den Frequenzgang des CIC direkt in das
Fourier Integral einzusetzen hat nicht funktioniert, es war mir nicht
möglich das Integral aufzulösen. Aber mit der Frequenzabtastungs Methode
lassen sich die Koeffizienten nun berechnen.
Gruss sam
Hallo,
ich stehe gerade vor dem gleichen Problem, ich weiß nicht wie das FIR
Kompensationsfilter auszusehen hat.
Das das Filter einen Frequenzgang von (x/sin(x))^N haben sollte, ist mir
klar, aber nicht wie ich auf die Koeffizienten komme.
Was genau ist denn die Frequenzabtastungs Methode?
Oder gibt es noch andere Arten die Filterkoeffizienten zu finden?
Gruß, Tom