Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.

In letzter Zeit haben mich mehrere Kollegen unabhĂ€ngig voneinander gefragt, wie man alle Bluetooth-KanĂ€le gleichzeitig von einem SDR-EmpfĂ€nger erhalten kann. Der Frequenzbereich erlaubt dies, da es SDRs mit einer Bandbreite von 80 MHz und mehr gibt. Man könnte das natĂŒrlich auch auf FPGAs umsetzen, aber die Entwicklungszeit wĂ€re erheblich. Mir ist schon lange bekannt, dass die Umsetzung auf GPUs recht einfach ist, aber so einfach!

Der Bluetooth-Standard definiert die physikalische Schicht in zwei Versionen: Classic und Low Energy. Die Spezifikation ist vorhanden. hierDas Dokument ist furchtbar umfangreich, es ist gefĂ€hrlich fĂŒr das Gehirn, es vollstĂ€ndig zu lesen. GlĂŒcklicherweise verfĂŒgen große Unternehmen, die MessgerĂ€te herstellen, ĂŒber die Mittel, um anschauliche Dokumente zu diesem Thema zu erstellen. Tektronix und National Instruments, zum Beispiel. Ich habe absolut keine Chance, mit ihnen in Bezug auf die QualitĂ€t der MaterialprĂ€sentation zu konkurrieren. Interessierte bitte ich, die Links zu studieren.

Alles, was ich ĂŒber die physikalische Schicht wissen muss, um einen Multikanalfilter zu erstellen, sind die Frequenzrasterschritte und die Modulationsgeschwindigkeit. Diese sind in einer Tabelle in einem der genannten Dokumente zusammengestellt:

Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.

Daher mĂŒssen wir ein 80-MHz-Band in 79 Filter mit einem Abstimmungsabstand von 1 MHz und gleichzeitig in 40 Filter mit einem Abstimmungsabstand von 2 MHz aufteilen. Die Abtastfrequenzen an den AusgĂ€ngen der Filter sollten 1 MHz und 2 MHz betragen.

Somit benötigen wir zwei Filtergitter.

ZunĂ€chst wĂ€hlen wir die Parameter dieser Filter basierend auf den FrequenzbĂ€ndern von Bluetooth Classic und Bluetooth Low Energy. Wir benötigen deren Impulscharakteristika, um die Belastung auf das Rechenwerk des Filters zu berechnen. Hier sollte sofort erwĂ€hnt werden, dass wir die LĂ€ngen der Impulscharakteristika basierend auf den Anforderungen eines "schnellen" Filteralgorithms gewĂ€hlt haben. Die grundlegende Idee bleibt dabei unverĂ€ndert. Auch die Anzahl der Impuls-Filterkoeffizienten sollte nicht zu groß sein, damit der Filter auf vernĂŒnftiger Rechenhardware realisierbar ist.

FĂŒr Filter mit einem Schritt von 1 MHz wĂ€hlen wir eine Bandbreite des Tiefpassfilters (die HĂ€lfte der Bandbreite des Bandfilters) von 500 kHz und passen die Impulsantwort auf 480 Abtastwerte an. FĂŒr Filter mit einem Schritt von 2 MHz setzen wir diese Parameter auf 1 MHz und 240 Abtastwerte entsprechend. Fenster Typ wĂ€hlen wir Kaiser. Wir berechnen die Impulsantworten in filterDesigner und exportieren sie im Format C-Header:

Screenshots aus filterDesigner

Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.
Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.
Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.
Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.

Die Aufgabe kann direkt gelöst werden: ein entsprechendes Array DDC (Digital Down Converter). Dieser Ansatz ist gut fĂŒr FPGAs, wo durch Verringerung der Bitanzahl der ersten Berechnungsschritte Einsparungen möglich sind. Auch FPGAs sind die energieeffizienteste Implementierungsart. Jedoch sind die ArbeitsaufwĂ€nde bei dieser Methode am höchsten.

Bei der Verwendung von Filterbank-Crossovers auf heutzutage populĂ€ren GPUs eröffnet sich die Möglichkeit, einen ausgeklĂŒgelteren Algorithmus zu implementieren: die polyphase Filterbank auf Basis der FFT, die ĂŒber die CUDA-Bibliothek verfĂŒgbar ist. In der internationalen Literatur wird dieser Algorithmus als Polyphase oder WOLA (Weight, Overlap and Add) FFT Filterbank bezeichnet. Meine Unlust am Zeichnen hindert mich daran, eine anschauliche ErklĂ€rung selbst zu erstellen. Im Internet gibt es viele Materialien zu diesem Thema, insbesondere eine anschauliche Grafik, die auf Seite 11 zu finden ist (vielen Dank an die geschĂ€tzten Autoren). hier Hier ist sie:

Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.

Ich werde versuchen, das Verarbeitungsdiagramm in meinen eigenen Worten zu erlĂ€utern. Zartbesaitete GemĂŒter bitte ich, dies nicht zu lesen.

Ich werde versuchen, das Verarbeitungsmuster in meinen eigenen Worten innerhalb meiner methodischen Möglichkeiten zu erklĂ€ren. Die schnelle Fourier-Transformation (FFT) ist eine Faltung des Eingangssignals mit dem gesamten Spektrum komplexer orthogonaler Harmoniken, die im Intervall der Impulsantwort angeordnet sind. Die Impulsantwort des Filters, mit der das Signal vor dem Eingang der FFT multipliziert wird, wird durch dieses Spektrum der Harmoniken moduliert. Mit anderen Worten, die HĂŒllkurve der Impulsantworten der resultierenden Comb-Filter wird ausgeklammert. Dann wird das Spektrum der Harmoniken in ein gewisses Maß reduziert, da die Bandbreite des Filters im Vergleich zu einem Filter mit rechteckigem Fenster erweitert wird. In der Abbildung sehen wir eine Reduzierung um das Vierfache. Mit anderen Worten, nach der Erweiterung der Bandbreite mit einem Kaiser-Fenster (bei gleichzeitiger Erhöhung der DĂ€mpfung im Stoppband) benötigen wir nicht mehr alle Filter, sondern nur ein Viertel davon. Die anderen sind ĂŒberflĂŒssig, ihre Frequenzeigenschaften ĂŒberlappen sich. Von vier aufeinanderfolgenden FFT-Punkten wĂ€hlen wir nur den Nullpunkt, wobei die Berechnung die Summe der vier Eingangspunkte ist.
die in einem Zeitintervall, das einem Viertel der Dauer der ursprĂŒnglichen FFT entspricht, erfasst wurden.

Wir wĂ€hlen die Hardware aus, die uns zur VerfĂŒgung steht. Es handelt sich um die Eingangsplatine der Firma "Instrumentensysteme" FMC126P. DarĂŒber habe ich bereits in einem frĂŒheren Beitrag geschrieben. ArtikelIn den FMC-Slot der Platine wurde ein Submodul derselben Firma mit dem Transceiver AD9371 mit einer Bandbreite von 100 MHz eingesteckt. Der gesamte Datenstrom vom Transceiver kann kontinuierlich an den Computer zur Verarbeitung ĂŒbertragen werden.

Wir wĂ€hlen eine Grafikkarte mit dem GPU GTX 1050. (Ich habe gelogen, sie hat uns gewĂ€hlt: Das war alles, was zur VerfĂŒgung stand; sie wurde aus dem Rechner fĂŒr die Berechnung der Antennen herausgerissen, aber umso erstaunlicher war es, eine funktionierende Kombination zu sehen). Lassen Sie uns zum Software-Teil ĂŒbergehen.

Leider können wir aufgrund von Lizenzen den vollstÀndigen Code nicht veröffentlichen. Wir können nur die GPU-Kerne zeigen. Der restliche Code ist jedoch nicht besonders interessant.

Hier ist der Kern, der das Signal mit einem Fenster multipliziert und addiert, sowie die HĂŒlle fĂŒr seinen Aufruf:

__global__ void cuComplexMultiplyWindowKernel(const cuComplex *data, const float *window, size_t windowSize, cuComplex *result) {
    __shared__ cuComplex multiplicationResult[480];
    multiplicationResult[threadIdx.x] = cuComplexMultiplyFloat(data[threadIdx.x + windowSize / 4 * blockIdx.x], window[threadIdx.x]);
    __syncthreads();
    cuComplex sum;
    sum.x = sum.y = 0;
    if (threadIdx.x < windowSize / 4) {
        for(int i = 0; i < 4; i++) {
            sum = cuComplexAdd(sum, multiplicationResult[threadIdx.x + i * windowSize / 4]);
        }
        result[threadIdx.x + windowSize / 4 * blockIdx.x] = sum;
    }
}

cudaError_t cuComplexMultiplyWindow(const cuComplex *data, const float *window, size_t windowSize, cuComplex *result, size_t dataSize, cudaStream_t stream) {
    size_t windowStep = windowSize / 4;
    cuComplexMultiplyWindowKernel<<>>(data, window, windowSize, result);
    return cudaGetLastError();
}

Der Code zur Signalverarbeitung, der diesen Kernel aufruft, spiegelt exakt das Schema des oben abgebildeten Algorithmus wider, daher sehe ich keinen Sinn darin, ihn hier wiederzugeben.

Die FrequenzgĂ€nge wurden im Ausgangsspektrum der KanĂ€le in Echtzeit ĂŒberprĂŒft. Ein 2450 MHz Signal vom Signal-Generator wurde dem AD9371 zugefĂŒhrt und die Filterselektion entsprach den Berechnungen.

Bereitstellung aller Bluetooth-KanÀle gleichzeitig auf SDR mit CUDA? Kein Problem.

Geplant: Anpassung der Software auf die XRTX-Platine und Implementierung der Paketverfolgung, falls dies jemand benötigt oder die Zeit es zulÀsst.

Die gesamte Softwarearbeit wurde geleistet von gaudima, Ehre ihm!

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster