Forum: FPGA, VHDL & Co. FPGA und ADC


von Julio (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich bin verzweifelt nach der Suche nach einer Lösung für meinen Problem.

Es soll für meinen Uni-Projekt Echosignale aufgenommen und zum PC 
gesendet werden. Dafür soll einen Xylo-L Board , FX2 mit 48Mhz und einen 
ADC (Flashy) mit 125 MHz verwendet werden.

Meinen Ansatz lautet, die Daten in einer RAM-Speicher füttern bis die 
RAM voll ist, dann Aufnahme Stoppen und Daten via USB zum PC senden.

Aber, ich könnte die Daten nur bis 15 MHz ohne Probleme senden. Ab 
dieser Frequenz werden die Daten nicht richtig gezeigt!! Ein 
Sinus-Signal ist kein Sinus mehr!!

Anbei sind 2 Messungen mit 18 MHz und 30Mhz.

Gruß
Julio

von Harald (Gast)


Lesenswert?

Sorry, aber was erwartest Du denn wenn du ein Sinussignal mit einer 
Frequenz vom 30 MHz mit einem  Takt von 125 MHz samplest? Vier 
Abtastungen pro Vollwelle! Soll da etwas herauskommen, das ohne 
aufwändige Interpolation (unter Berücksichtigung der Grenzfrequenz) 
schön aussieht?

von Olaf (Gast)


Lesenswert?

Wie ist deine Abtastrate?

Wie sieht deine Schaltung aus? Besonders der Teil vor dem AD-Wandler.

Olaf

von Michael (Gast)


Lesenswert?

Wie schon gesagt wurde, die Abtastrate ist des Rätsels Lösung. 30 
MHz-Signal mit 125 MHz abtasten bedeutet dass man ca. 4 Abtastpunkte pro 
Periode hat. Um hier schon sicher sagen zu können, wie das Signal 
wirklich ausschaut muss man zumindest die Signalform kennen. Wenn selbst 
die unbekannt ist ist es einfach unmöglich das Signal korrekt 
darzustellen. Ich glaub als Regel galt bei unbekannter Signalform mit 
mindestens 10-facher Frequenz abzutasten, d.h. nur Signalformen mit bis 
zu 12.5 MHz kannst du vernüftig darstellen.

Wenn es sich um ein Sinus-förmiges Signal handelt empfiehlt sich hier 
das Nyquistkriterium zu erfüllen womit du also bis 62.5 MHz Signale 
korrekt erfassen könntest...natürlich nicht ohne ein wenig mathematisch 
zu werden, du musst also aus den Abtastpunkten das Signal errechnen, 
liniear zu interpolieren hilft da nicht was du bei den Bildern nur 
gemacht hast.

von Michael (Gast)


Lesenswert?

PS: Meine Zahlen beruhen darauf, dass die Taktrate des ADC auch der 
Abtastrate entspricht, was ja nicht unbedingt sein muss. Das Datenblatt 
des ADCs hilft hier weiter. ;)

von Julio (Gast)


Lesenswert?

Danke für die Antworten ^^

Michael schrieb:
> Wenn es sich um ein Sinus-förmiges Signal handelt empfiehlt sich hier
> das Nyquistkriterium zu erfüllen womit du also bis 62.5 MHz Signale
> korrekt erfassen könntest...natürlich nicht ohne ein wenig mathematisch
> zu werden, du musst also aus den Abtastpunkten das Signal errechnen,

Ich werde diesen Ansatz weiter verfolgen

Gruß

von Christian R. (supachris)


Lesenswert?

Naja, das Nyquistkriterium ist doch eine rein theoretische Sache aus der 
Systemtheorie. In der Realität kann man das nicht so machen. Die 
Abtastzeitpunkte kommen ja nicht synchron zum Signal. Du kannst nur bis 
etwa 10MHz sinnvoll messen, vor allem bei unbekannten Signalen. Bekannte 
Signale müsste man ja auch nicht zu messen :)
Du siehst ja schon am 18MHz Signal, dass es kein sauberer Sinus mehr 
ist. Selbst bei einem 10Mhz Signal hätte ein Sinus nur noch 12 Punkte 
pro Periode als Stützsetllen...

von Michael (Gast)


Lesenswert?

Christian R. schrieb:
> Naja, das Nyquistkriterium ist doch eine rein theoretische Sache aus der
> Systemtheorie. In der Realität kann man das nicht so machen. Die
> Abtastzeitpunkte kommen ja nicht synchron zum Signal

Muss man beim Nyquistkriterium ja auch nicht. Es muss nur die Signalform 
bekannt sein, dann kann man aus den Abtastwerten das Signal wieder 
errechnen.

von Julio (Gast)


Lesenswert?

dann bellasse ich es bei 10MHz ^^
Danke für die Wertvollen Infos

von Oli (Gast)


Lesenswert?

Du kannst bist etwa ein Drittel der Frequenz sehr gut messen, was auf 
etwa 40 MHz hinausläuft, wenn Du einen sehr steilen Filter einsetzt, der 
bei 50MHz einsetzt und dann rasch abfällt.

Die Samples sind dann sehr exakt auf der Sinuswelle, die ja die maximale 
Frequenz darstellt, die Du sehen kannst. Damit die Signale aber stimmen, 
musst Du im FPGA ein digitales Filter mitlaufen lassen, daß ebenfalls 
mit höchstens 50MHz Grenzfrequenz läuft und die Werte interpoliert. Dann 
hast du einen sauberen Zeitverlauf.

Das Interplationsfilter muss aber oversampeln, was bei 125MHz 
Grundfrequenz wenig Spielraum lässt. Für eine entsprechende Genauigkeit 
von 1% braucht man mindestens 256fach oversampling, für Deine Zwecke 
reichen sicher 5% der Oberwelle = Faktor 40!  -> 400 MHz im FPGA-> 10 
MHz perfekte Oberwelle.

von Julio (Gast)


Lesenswert?

Ich habe das mit dem Filter getestet und hat gut geklappt. Vielen dank 
Oli ^^

Ich habe noch eine andere Frage und zwar:
Momentan sende ich mit dem BulkOut verfahren die Daten an Matlab. Gibt 
es eine andere Möglichkeit die Daten irgendwie als live stream zu 
senden?

Das ist Hier mein C++ Code für einen 65535 großen Paket:
1
void mexFunction(int nlhs, mxArray *phls[], int nrhs, const mxArray *prhs[])
2
{
3
CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL, GUID_KNJN_FX2);
4
    mxArray *xData;
5
    double *xValues;
6
  double *dataOut;
7
    
8
  xData = (mxArray*)prhs[0];
9
  xValues = mxGetPr(xData);
10
        Long len = 65535;
11
  unsigned int i=0;
12
  double max=65535;;
13
  unsigned char bufin[65535]; 
14
  
15
  
16
  phls[0] = mxCreateDoubleMatrix(1, max, mxREAL);// Hier erstelle ich einen Array für die Ausgabe der Daten
17
  dataOut = mxGetPr(phls[0]);
18
  
19
    for(i=0;i<max;i++)
20
  {  
21
    if(j==0)BulkInPipe4->XferData(bufin, len);
22
    dataOut[i]= bufin[i];
23
    
24
  }
25
delete USBDevice;
26
}
Gruß

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.