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