Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti

Hiljuti hakkasid kolleegid poes minult ĂŒksteisest sĂ”ltumatult kĂŒsima: kuidas saada kĂ”ik Bluetoothi ​​kanalid korraga ĂŒhest SDR-vastuvĂ”tjast? Ribalaius seda vĂ”imaldab, on SDR-e, mille vĂ€ljundribalaius on 80 MHz vĂ”i rohkem. Muidugi saate seda teha FPGA-ga, kuid selline arendusaeg on ĂŒsna pikk. Olen juba pikka aega teadnud, et seda GPU-ga teha on ĂŒsna lihtne, aga teha seda nii!

Bluetoothi ​​standard mÀÀratleb fĂŒĂŒsilise kihi kahes versioonis: Classic ja Low Energy. Spetsifikatsioon saadaval siin. Dokument on kohutavalt suur, selle tervikuna lugemine on ajule ohtlik. Õnneks on suurtel mÔÔtetehnoloogiaettevĂ”tetel vahendid mingi teema kohta visuaalsete dokumentide loomiseks. Tektronix Đž Riiklikud instrumendid, NĂ€iteks. Materjali esitamise kvaliteedi osas pole mul absoluutselt mingit vĂ”imalust nendega konkureerida. Huvi korral jĂ€rgige linke.

KĂ”ik, mida ma pean fĂŒĂŒsilise kihi kohta mitme kanaliga filtri loomiseks teadma, on sagedusvĂ”rgu vahekaugus ja modulatsioonikiirus. Need on tabelina ĂŒhes jĂ€rgmistest dokumentidest:

Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti

Seega peame 80 MHz riba lÔikama 79 filtriks hÀÀlestusastmega 1 MHz ja samal ajal 40 filtriks hÀÀlestusastmega 2 MHz. Filtri vÀljundi diskreetimissagedused peaksid olema vastavalt 1 MHz ja 2 MHz.

Seega vajame kahte filtripanka.

Esmalt valime nende filtrite parameetrid Bluetooth Classic ja Bluetooth Low Energy signaaliribade pĂ”hjal. Filtri arvutusseadme koormuse arvutamiseks vajame nende impulssreaktsioone. Siinkohal tasub kohe mainida, et impulssreaktsiooni pikkused valisime “kiire” filtreerimisalgoritmi nĂ”uete alusel. Sisu sellest ei muutu. Ja impulssreaktsiooni koefitsientide arv ei tohiks olla liiga suur, et filtrit saaks rakendada mĂ”istlikel arvutusseadmetel.

1 MHz sammuga filtrite jaoks valime madalpÀÀsfiltri ribalaiuseks (pool ribapÀÀsfiltri ribalaiusest) 500 kHz ja reguleerime impulssreaktsiooni pikkuseks 480 puudutust. 2 MHz sammuga filtrite puhul valime need parameetrid vastavalt 1 MHz ja 240 kraani. Valime Kaiseri aknatĂŒĂŒbi. Arvutame filterDesigneris impulssvastused ja laadime need ĂŒles C-pĂ€ise vormingus:

FiltriDesigneri ekraanipildid

Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti
Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti
Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti
Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti

Saate probleemi lahendada jÔhkra jÔuga: koostage filtrite arvule vastav DDC massiiv (Digital Down Converter). Selline lÀhenemine on hea FPGA-de puhul, kus esimese astme arvutite bitimahtu vÀhendades on vÔimalik sÀÀsta. Samuti on FPGA kÔige energiasÀÀstlikum rakendusmeetod. Kuid selle meetodi tööjÔukulud on kÔige kÔrgemad.

TĂ€napĂ€eva populaarsetel GPU-del filtripanga kĂ€itamisel on vĂ”imalik rakendada keerukamat algoritmi: FFT-l pĂ”hinevat mitmefaasilist filtripanka, mis CUDA puhul on raamatukogust saadaval. VĂ€liskirjanduses nimetatakse algoritmi Polyphase ehk WOLA (Weight, Overlap and Add) FFT Filterbank. Laiskus joonistamisel ei anna mulle vĂ”imalust visuaalset selgitust iseseisvalt lĂ”petada. Internetis on teema kohta palju materjali, tehakse eriti selge graafik siin lehekĂŒljel 11 (suur tĂ€nu lugupeetud autoritele), siin see on:

Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti

PĂŒĂŒan töötlemisskeemi oma sĂ”nadega selgitada. Palun Ă€rge lugege nĂ”rganĂ€rvilistele.

Üritan oma metoodiliste vĂ”imaluste raames töötlusskeemi oma sĂ”nadega lahti seletada. FFT on sisendsignaali konvolutsioon koos kogu komplekssete ortogonaalsete harmooniliste spektriga, mis mahuvad impulssreaktsiooni intervalli. Filtri impulssreaktsiooni, millega signaal korrutatakse enne FFT-sisendit, moduleeritakse selle harmoonilise spektriga. TeisisĂ”nu, saadud kammfiltrite impulssreaktsiooni mĂ€his on sulgudes. Lisaks hĂ”reneb harmooniline spekter teatud arv kordi, kuna filtri ribalaius ristkĂŒlikukujulises aknas filtri suhtes laieneb. Pildil nĂ€eme hĂ”renemist nelja vĂ”rra. TeisisĂ”nu, pĂ€rast riba laiendamist Kaiseri aknaga (sammulise sumbumise suurenemisega stopperis) ei vaja me enam kĂ”iki filtreid, vaid ainult veerandit neist. ÜlejÀÀnud on ĂŒleliigsed, nende sagedusomadused kattuvad. Neljast jĂ€rjestikusest FFT-punktist valime ainult null ĂŒhe, mille arvutamine on nelja
sisendpunktid, mis on vÔetud pÀrast aega, mis on vÔrdne veerandiga algse FFT kestusest.

Valime kĂ€epĂ€rast triikraua. See on Instrumental Systemsi FMC126P sisendplaat. Kirjutasin sellest juba ĂŒhes eelnevas siit. Plaadi FMC-pistikusse on sisestatud sama firma alammoodul AD9371 transiiveriga 100 MHz sagedusalaga. Kogu transiiveri voogu saab töötlemiseks pidevalt arvutisse edastada.

Valime videokaardi GPU GTX 1050. (Ma valetasin, see valis meid: see oli kĂ”ik, mis oli kĂ€epĂ€rast, see rebiti arvutist vĂ€lja, et antenne arvutada, kuid seda ĂŒllatavam oli nĂ€ha töötav kamm). Liigume edasi tarkvara osa juurde.

Kahjuks ei saa me litsentside tĂ”ttu tĂ€ielikku koodi avaldada. Saame nĂ€idata ainult GPU tuumasid. ÜlejÀÀnud kood pole aga eriti huvitav.

Siin on tuum, mis teeb signaaliakna korrutamist ja liitmist, ning ĂŒmbris selle nimetamiseks:

__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<<<dataSize / windowStep - 3, windowSize, 1024, stream>>>(data, window, windowSize, result);
    return cudaGetLastError();
}

Seda tuuma kutsuv signaalitöötluskood kordab tĂ€pselt ĂŒlaltoodud joonisel nĂ€idatud algoritmi diagrammi, nii et ma ei nĂ€e pĂ”hjust seda siin esitada.

Kammi testiti kanalite vÀljundspektril reaalajas. AD9371 sisendisse anti 2450 MHz signaaligeneraatori signaal ja filtrite selektiivsus vastas arvutatule.

Kas vĂ”tate CUDA-ga vastu kogu Bluetoothi ​​korraga SDR-is? Kergesti

Plaanides on: tarkvara kohandamine XRTX-plaadile ja paketiotsingu juurutamine, kui kellelgi seda vaja on vÔi vaba aega on.

KÔik tarkvaratööd on lÔpetatud gaudima, au talle!

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster