Cómo hacer amigos PLUTO y HDSDR



No hace mucho tiempo, impulsivamente compr√≥ un lindo transceptor SDR para ni√Īos y j√≥venes: ADALM PLUTO. Para mi pesar, funciona con un mont√≥n de software para LINUX, pero mi HDSDR favorito no lo admite. Sin pensarlo dos veces, comenc√© a lidiar con este problema y esto es lo que surgi√≥:

Analog Devices dirige su PLUTO a los estudiantes. Todo el software para PLUTO est√° abierto y est√° disponible gratuitamente. El sitio web de la compa√Ī√≠a tiene una p√°gina donde puede encontrar casi toda la informaci√≥n necesaria sobre el funcionamiento de PLUTO. La mayor parte del software est√° escrito bajo Linux y se recomienda a los estudiantes que usen GNU Radio, MATLAB, etc.

Tengo un interés de radio puramente amateur en PLUTO. Un SDR con un rango de 70MHz a 6GHz (después de la divulgación ) por solo 150 dólares estadounidenses es un milagro. ¡Cuántos experimentos se pueden hacer! Vea cuánto está todo integrado allí:



Aparentemente, AD cree que los jamones mismos deberían escribir controladores para programas populares, por lo que hasta hace poco, incluso SDR # no era compatible. Pero SDR # no me conviene, porque necesito un buen soporte CAT en un programa para sincronizar la frecuencia con un transceptor. Me gustaría intentar usar HDSDR como receptor panorámico conectándolo a la primera frecuencia intermedia del transceptor. Por lo tanto, solo hay una salida: integrar HDSDR y PLUTO usted mismo.

Al usar Google, descubr√≠ r√°pidamente que para resolver mi problema, necesito crear una biblioteca ExtIO_.dll especial en formato Winrad . Esta biblioteca sirve como un puente de software entre el HDSDR y el receptor SDR deseado. Afortunadamente, la interfaz de la biblioteca est√° bien documentada . Adem√°s, hay bastantes implementaciones de biblioteca preparadas para varios receptores en github: RTL_SDR, LimeSDR , etc. Hab√≠a un lugar para ver c√≥mo escribir c√≥digo. La biblioteca en s√≠ es bastante antigua, no hay nuevas tecnolog√≠as, puro C89, como escribieron hace 20 a√Īos. Al menos no necesita aprender un nuevo lenguaje de programaci√≥n, que ya inspir√≥ la esperanza de √©xito.

Esencialmente, ExtIO_.dll debe implementarse con docenas de funciones que le permiten inicializar el equipo SDR, iniciar y detener la recepci√≥n de la se√Īal, guardar y restaurar la configuraci√≥n especificada. Para m√≠, el momento m√°s incomprensible fue el formato del intercambio de datos de transmisi√≥n entre el receptor y HDSDR, pero m√°s sobre eso a continuaci√≥n.

Ahora ha surgido la pregunta de c√≥mo controlar PLUTO mediante programaci√≥n. En realidad, hay varias opciones de control. Encontr√© al menos dos: directamente con el chip a trav√©s de la biblioteca libad9361.dll o a trav√©s de la biblioteca IIO . La √ļltima opci√≥n me pareci√≥ m√°s simple y mejor descrita, as√≠ que me decid√≠ por ella. En esta biblioteca, todos los ajustes del equipo est√°n disponibles en forma de alg√ļn tipo de estructura XML, a un elemento individual se accede mediante el nombre textual de la propiedad, lo cual es bastante conveniente. Una descripci√≥n m√°s detallada de la biblioteca se puede encontrar aqu√≠ . La gran ventaja de la biblioteca es que viene con utilidades de l√≠nea de comandos, con las cuales siempre puede cambiar r√°pidamente la configuraci√≥n deseada del receptor. Por lo tanto, no necesita implementar todas las configuraciones SDR en la interfaz HDSDR, puede hacerlo con el m√≠nimo necesario. Y cargar alg√ļn filtro FIR ex√≥tico se puede hacer desde la l√≠nea de comando, si alguna vez surge tal necesidad. Flujos de datos en IIO:



Aprender programáticamente cómo controlar PLUTO desde HDSDR fue bastante rápido y fácil. Fue un poco más difícil obtener un resultado satisfactorio en la transmisión de datos, especialmente porque no tenía experiencia previa con SDR. Aquí debe comprender que los datos provienen del receptor SDR en forma de una secuencia de muestras I / Q / I / Q ... I / Q. Cada muestra es un entero de 16 bits sin signo, de los cuales solo importan 12 bits de orden inferior. Al mismo tiempo, HDSDR tiene una docena de opciones para recibir flujos de datos. Cuál es más conveniente y mejor no está del todo claro para mí. Como resultado, me decidí por la opción, que en ExtIO se llama exthwUSBdata16, es decir en realidad, uno a uno, cómo la biblioteca IIO da datos.
El siguiente problema fue la transferencia de datos entre las memorias intermedias de recepci√≥n IIO y HDSDR. Este √ļltimo recibe datos en bloques que son m√ļltiplos de 512 bytes, y IIO no puede generar datos en este formato. Tuve que hacer un b√ļfer intermedio y transferir la corriente a trav√©s de √©l. El c√≥digo de transmisi√≥n se muestra a continuaci√≥n.

DWORD WINAPI GeneratorThreadProc( __in LPVOID lpParameter ) { int16_t iqbuf[EXT_BLOCKLEN * 2]; ssize_t nbytes_rx; char *p_dat, *p_end; ptrdiff_t p_inc; int iqcnt = 0; // pointer to sample in iqbuf while ( !gbExitThread ) { nbytes_rx = iio_buffer_refill(rxbuf); p_inc = iio_buffer_step(rxbuf); p_end = (char *)iio_buffer_end(rxbuf); for (p_dat = (char *)iio_buffer_first(rxbuf, rx0_i); p_dat < p_end; p_dat += p_inc) { iqbuf[iqcnt++] = ((int16_t*)p_dat)[0]; iqbuf[iqcnt++] = ((int16_t*)p_dat)[1]; if (iqcnt == EXT_BLOCKLEN * 2) { // buffer full iqcnt = 0; pfnCallback(EXT_BLOCKLEN, 0, 0.0F, &iqbuf[0]); } } } gbExitThread = false; gbThreadRunning = false; return 0; } 

Utilizando el ciclo indicado, fue posible lograr una transferencia de flujo de 4 MS / s, por encima de este valor, los datos no tienen tiempo para transmitirse y la se√Īal se recibe con tartamudeo, aunque parece que el hierro puede enviar 20 MS / sy a√ļn m√°s. Se aument√≥ la prioridad del subproceso en el que el bucle gira a THREAD_PRIORITY_TIME_CRITICAL, aument√≥ el tama√Īo de los b√ļferes. Sin resultado Adem√°s, cuando se aument√≥ el tamp√≥n a 1 MB, la recepci√≥n normal era imposible al caudal m√≠nimo. M√°s aqu√≠ no significa mejor. Si tiene ideas sobre c√≥mo aumentar la velocidad, comparta en los comentarios.

Debo decir que 4 MS / s es suficiente para mis propósitos, la banda cubre más que cualquier banda amateur de HF. Sí, y en las bandas de VHF y microondas suficientes para la mayoría de las tareas. Como resultado, la biblioteca está escrita, la ventana HDSDR con PLUTO activado para recepción se ve así:



Todo el código de la biblioteca está disponible en github aquí . Siéntase libre de usarlo para sus experimentos con ADALM PLUTO.

73 de R2AJP

Source: https://habr.com/ru/post/441676/


All Articles