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
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?
Wie ist deine Abtastrate? Wie sieht deine Schaltung aus? Besonders der Teil vor dem AD-Wandler. Olaf
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.
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. ;)
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ß
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...
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.