2016-12-07 3 views
0

Ich habe Probleme, einen benutzerdefinierten Block mit hoher Frequenz zu betreiben.GNURadio Probleme mit Timing

Der Block, den ich verwenden möchte, wird Daten von einem externen Radio aufnehmen.

Ich verwende einen Ettus USRP-Block, um Daten von diesem Radio zu streamen, und ich kann dies auf dem QT Scope anzeigen. Ich kann die Abtastrate dieses Blocks auf 15 MHz einstellen, und mit dem Oszilloskop scheint das in Ordnung zu sein.

Problem:

habe ich versucht, einen einfachen Block mit dem gnuradio gr_modtool machen, die in 2 Schwimmern als Eingabe nimmt und 0 Ausgänge. Der Block hat private Mitglieder "timer", ein time_t und "counter", ein int. In der „Arbeit“ Funktion, mein Code einfach tut dies im Moment:

const float *in_i = (const float *) input_items[0]; 
const float *in_q = (const float *) input_items[1]; 

if (count == 0){ 
    if (*in_i > 0.5){ 
     timer = clock(); 
     count = 30000; 
    } 
}else{ 
    count --; 
    if(count == 0){ 
     timer = clock()-timer; 
     printf("Count took %d clicks, or %f seconds\n",timer,(float)timer/CLOCKS_PER_SEC); 
    } 
} 
    // Tell runtime system how many output items we produced. 
    return 0; 

Allerdings, wenn ich diesen Code ausführen, dauert es länger als die erwartete Zeit. Für 30000 Zyklen dauert es statt der gewünschten 0,002 Sekunden 0,872970, um abzuschließen. Da der Standard-Gnuradio-Block, der mit gr_modtool erzeugt wurde, ein Sync-Block ist und der Eingangsstrom zum Block vom 15-MHz-USRP kommt, hätte ich erwartet, dass dieser Block mit derselben Frequenz läuft. Dies ist derzeit nicht der Fall.

Schließlich ist mein Ziel in der Lage zu speichern Daten über einen längeren Zeitraum, und schreiben Sie es in Datei mit bestimmten Formatierungen (Ein Block existiert bereits dafür, aber es gibt eine Art von Bug, der das verhindert blockieren und der USRP-Block von der Arbeit gleichzeitig, so versuche ich, mein eigenes zu schreiben.). Wenn ich jedoch nicht mit der Abtastrate von 15 MHz mithalten kann, werde ich Daten verlieren. Da dieser Block ziemlich einfach ist, hätte ich gehofft, dass er schnell genug laufen könnte, um mitzuhalten. Der Eingangsstromblock ist jedoch in der Lage, Daten von dem Radio zu ziehen und bei 15 MHz auszugeben, so dass ich weiß, dass mein Computer dazu in der Lage ist.

Wie kann ich den benutzerdefinierte Block machen arbeitet schneller, und mit der 15-MHz-Frequenz halten? (Oder, wie kann ich diesen Sync-Block mache am Eingangsstrom Frequenz arbeiten, da es funktioniert noch nicht)

Antwort

0

Ihr Block verbraucht keine Proben. Ich nehme an, Sie schreiben eine sync_block (work Funktion, nicht general_work), so dass Ihre Nummer produziert Artikel ist identisch mit der Anzahl der verbraucht Artikel. Aber als Quellcode sagt:

// Tell runtime system how many output items we produced. 
return 0; 

Mit anderen Worten: Ihr Block GNU Radio erzählt, dass es nicht der Eingangs GNU Radio verwendet haben angeboten, und erzeugt keine Ausgabe. Das bedeutet, GNU Radio kann nichts tun. Sie müssen die Anzahl der von Ihnen produzierten Elemente zurückgeben, und bei Synchronisierungsblöcken ist dies die Anzahl der Elemente, die Sie verbraucht haben - selbst wenn Sie eine Senke sind und keine Ausgabeströme haben!

+0

Nun, ich schreibe eigentlich einen Sink-Block, aber wenn Sie gr_modtool verwenden, um eine Senke zu machen, erbt es vom "Sync" -Block. Der einzige Unterschied ist, dass die io_signature für die Ausgabe 0 für die minimale und maximale Anzahl hat. Ich gebe also keine Gegenstände zurück, aber ich verzehre immer noch. Da der Standardwert für die Rückgabe noutput_items ist, gebe ich 0 ein, weil ich keinen Stream ausgabe. – Zephyr

+0

Wie gesagt, eine Senke sollte eine sync_blcok sein und ** muss ** die Anzahl der Elemente zurückgeben, die Sie verbraucht haben. –

+0

Um das zu wiederholen: Damit eine Spüle verbraucht wird, muss man "produzieren". –