SvxLink-UDP

svxlink erlaubt die Anbindung von Audio (sowohl als "Mic", wie als "Lautsprecher") über UDP.

Dazu ist etwa folgender Abschnitt in der Konfiguration von svxlink notwendig:

[TxUDP]
TYPE=Local
AUDIO_DEV=udp:44.143.100.200:4300
AUDIO_CHANNEL=0
PTT_TYPE=NONE
CARDS_CHANNELS =1

[RxUDP]
TYPE=Local
AUDIO_DEV=udp:0.0.0.0:4301
AUDIO_CHANNEL=0
SQL_DET=VOX
VOX_FILTER_DEPTH=100
VOX_THRESH=10

44.143.100.200 ist die fiktive Adresse des Ziels der UDP-Daten auf Port 4300. Daten für Rx werden am Rechner (Adresse 0.0.0.0) am Port 4301 entgegengenommen. Nachdem es bereits RX und TX gibt ist es nun notwendig die neuen Quellen und Senken zu integrieren. Für "RX" wird ein Voter verwendet, für "TX" ein Multiplexer:

[MultiTX]
TYPE=Multi
TRANSMITTERS=Tx1,TxUDP

[Voter]
TYPE=Voter
RECEIVERS=Rx1,Rx1,RxUDP
VOTING_DELAY=200
BUFFER_LENGTH=0

An anderer Stelle - etwa in der RepeaterLogic - ist nun die neue Definition statt "Rx1" bzw "Tx1" einzufügen:

[RepeaterLogic]
TYPE=Repeater
RX=Voter
TX=MultiTX

Die Daten werden mit zwei Kanälen mit jeweils 16 Bits kodiert. Pro Sekunde werden 48 UDP-Pakete mit einer Länge von 4032 Bytes übermittelt, dh. je Paket 1008 Samples mit einer Sample-Rate von 48.000 Samples/s, der wohl internen Sample-Rate von svxlink.

[2025-03-10 21:12:45.603] Received 4032 bytes from ('127.0.0.1', 53786): 
8eff00006eff000037ff0000fafe0000befe000099fe000094fe0000a7fe0000cefe0000fbfe00001eff000034ff00003cff00003dff000044ff00005bff000086ff0000c2ff0000000000003500000051000000480000001f000000deff000094ff00005aff00003fff00004cff000089ff0000e9ff00005b000000d90000004e010000af010000f801000026020000390200003702000022020000ff010000d5010000a9010000810100006301000050010000490100004801000048010000410100003101000015010000f1000000ce000000b3000000a6000000a4000000ab000000b4000000a80000008400000046000000e6ff000077ff00000cff0000b0fe000079fe000072fe000095fe0000dcfe00003dff0000a0ff0000faff000043000000730000008c000000970000009200000086000000730000005400000028000000efff0000a4ff00004fff0000f9fe0000acfe000075fe00005bfe000067fe000095fe0000d8fe00002dff000080ff0000c2ff0000eeff000000000000f9ff0000e2ff0000c5ff0000abff000096ff00008aff000085ff00007fff000076ff00006cff000065ff00006bff000086ff0000c4ff00001e000000900000000f01000083010000d6010000fe010000f1010000b60100005a010000ef000000870000002f000000ebff0000b5ff000084ff000050ff000010ff0000c9fe000084fe00004afe00002efe000034fe00005afe000097fe0000d8fe00000bff00001cff000007ff0000d2fe00007ffe000028fe0000e1fd0000b1fd0000a3fd0000b7fd0000e3fd000020fe000065fe0000affe0000fffe000053ff0000b6ff00002200000092000000050100006b010000b7010000ec01000002020000fe010000ee010000d9010000c6010000c0010000c4010000c9010000d7010000e1010000e2010000e7010000ec010000f50100000b0200002c020000520200007a02000099020000ab020000a702000091020000710200004302000017020000f3010000ce010000ac010000890100005801000018010000ce0000007600000020000000dbff0000a6ff00008bff00008bff000094ff00009fff0000a2ff000087ff000054ff000011ff0000befe00006ffe000037fe00000efe0000fbfd0000f8fd0000eefd0000d7fd0000abfd000064fd000010fd0000befc00007dfc00005afc00005bfc00007afc0000abfc0000dcfc000000fd00000efd000006fd0000f4fc0000e6fc0000e9fc00000cfd00004dfd0000a0fd000004fe000064fe0000b3fe0000f8fe000032ff000066ff0000aeff00000800000072000000f70000007c010000ef0100005402000097020000b5020000c5020000c5020000bd020000c2020000cc020000d3020000e2020000e6020000da020000c8020000aa020000840200005d0200003402000007020000d8010000a30100006c01000030010000f8000000ca000000a00000007f000000670000004200000014000000dcff00008cff000036ff0000e8fe00009ffe000072fe00006afe000076fe00009bfe0000d1fe000001ff00002cff000050ff000066ff00007bff000097ff0000b9ff0000e9ff000023000000600000009a000000cb000000eb000000fd00000002010000020100000201000005010000160100002f0100004c0100007101000091010000a6010000b3010000b0010000a00100008701000067010000440100002301000005010000ea000000cf000000b10000009100000068000000390000000a000000d9ff0000adff00008aff00006dff000058ff000048ff000035ff000020ff00000bff0000effe0000d5fe0000c1fe0000acfe00009afe000087fe00006afe000040fe00000bfe0000cbfd00008bfd000057fd000039fd00003bfd000060fd0000a3fd0000f8fd000051fe0000a0fe0000d6fe0000edfe0000e6fe0000c4fe00008ffe000056fe00001efe0000eefd0000cefd0000bffd0000bcfd0000cefd0000edfd000014fe000048fe00007efe0000acfe0000dcfe000002ff00001bff000036ff000050ff00006aff00008eff0000b6ff0000ddff0000020000001e000000290000002b000000250000001a0000001e00000033000000590000009b000000ee00000047010000a7010000010200004c0200008a020000b6020000cc020000d1020000c6020000aa020000850200005d0200003b02000026020000260200003d0200006b020000a7020000ea020000280300005803000077030000810300007d0300007203000061030000530300004d03000041030000330300002603000007030000de020000b3020000790200003d02000006020000ca01000093010000660100003901000012010000f9000000dc000000c2000000ac000000810000004900000006000000a8ff00003cff0000d0fe000059fe0000eafd00008afd000029fd0000cffc00007dfc000024fc0000cefb000084fb000043fb00001afb000010fb00001efb000044fb000078fb0000a8fb0000cefb0000e3fb0000e4fb0000dafb0000cefb0000cafb0000d5fb0000f0fb00001ffc000056fc000089fc0000c0fc0000f1fc000017fd00004dfd00008dfd0000d6fd000041fe0000bcfe000038ff0000c5ff000046000000ad0000000a0100004a010000690100007d0100007d0100006801000059010000460100002e010000290100002a0100002e010000460100006601000087010000b8010000ee0100002502000065020000a5020000de0200000c0300002403000020030000f7020000ad0200004a020000d30100005c010000f7000000aa000000820000007f00000097000000c2000000f800000029010000550100007f010000a3010000cc0100000002000032020000630200008d020000910200007002000027020000a90100000a01000062000000bfff00003dff0000f2fe0000e6fe00001cff00008bff00001d000000c100000060010000e3010000410200007702000080020000640200002f020000da01000071010000fa0000006b000000d2ff00003cff0000aefe00003dfe0000fbfd0000f0fd00001cfe000076fe0000eefe000067ff0000c8ff0000feff000000000000d1ff000077ff000008ff00009bfe000030fe0000d3fd000082fd000029fd0000c5fc000051fc0000cdfb000049fb0000d7fa000093fa00008afa0000c0fa00003dfb0000eafb0000adfc000071fd00001cfe00009afe0000e4fe0000fafe0000e2fe0000a7fe000056fe0000f7fd0000a1fd00005cfd000031fd00003dfd000082fd000000fe0000cafe0000c8ff0000dc0000000b0200002403000009040000c30400003b050000720500008305000074050000510500002d05000006050000db040000b10400007e0400004404000012040000e8030000ce030000d9030000fe030000360400007c040000b5040000d4040000bf04000073040000f70300003a0300005a0200006d0100006500000063ff000073fe000083fd0000a7fc0000eefb000047fb0000cafa000084fa000064fa000076fa0000b4fa0000fafa000042fb00007efb00008bfb000076fb00004afb0000fdfa0000b7fa00008cfa000078fa00008efa0000c8fa000019fb000078fb0000d8fb000040fc0000affc000024fd0000c2fd000081fe000056ff00005400000059010000440200001d030000c40300002c040000710400009204000096040000a7040000be040000d70400000c050000420500006d0500009e050000c1050000d1050000e4050000ea050000e3050000d7050000b90500008405000038050000d30400005d040000d10300003e030000b30200001f020000920100001301000088000000ffff00007cff0000e7fe000053fe0000cdfd00003efd0000bcfc000053fc0000e9fb000091fb000053fb00000ffb0000d5fa0000abfa000072fa00003ffa000017fa0000ebf90000cef90000c9f90000d3f90000f5f900002bfa000069fa0000aafa0000e2fa000010fb000033fb00004afb00006ffb0000a5fb0000f2fb00006efc00000cfd0000bcfd000088fe000051ff000000000000a60000002e0100008d010000e70100002d020000580200008a020000af020000bd020000d2020000dd020000da020000e9020000ff0200001a030000540300009c030000e90300004a040000a9040000fc04000047050000790500008e0500007c05000042050000e504000060040000c6030000290300008e0200000b020000ae0100006c0100004d01000049010000480100004b0100004f01000043010000340100002a01000014010000ff000000ed000000bd0000007d00000034000000cbff000060ff00000aff0000c2fe0000a6fe0000befe0000f7fe000052ff0000bfff0000250000007f000000c7000000f7000000160100002f0100003f0100004c010000560100004d0100002e010000f4000000980000001f00000094ff000001ff000075fe0000fcfd0000a4fd00006bfd00004ffd00004afd00004bfd000045fd00002bfd0000f5fc0000a2fc000034fc0000bafb000046fb0000defa000092fa000067fa000052fa00004cfa000049fa00003cfa000021fa0000fcf90000dbf90000cdf90000dbf900001afa000082fa000003fb00009afb00002bfc0000a0fc000003fd00004efd000087fd0000d3fd000034fe0000a9fe00004bff0000fdff0000a500000051010000e401000050020000bb0200001b03000074030000ea03000067040000dc04000058050000b9050000f30500001b0600002c0600002d0600003f0600005f0600008c060000c9060000000700001f0700001c070000ec060000930600001706000089050000ff0400007904000008040000b30300006403000022030000ee020000a90200006202000020020000c6010000660100000b010000950000001a000000a9ff000022ff0000a6fe000044fe0000defd00008efd00005dfd000025fd0000fafc0000defc0000b9fc00009dfc000094fc000093fc0000a9fc0000dafc000015fd00005cfd0000a7fd0000e3fd000011fe000030fe000041fe00004dfe00005dfe00007dfe0000affe0000effe000042ff000098ff0000e3ff000027000000560000006c0000007c000000800000007a0000007d0000007d00000071000000630000003f00000001000000b6ff00005aff0000f7fe0000a3fe00005ffe00002ffe00001afe000014fe000010fe00000bfe0000f8fd0000d8fd0000adfd00007efd000052fd00002afd00000afd0000ebfc0000c7fc00009afc000066fc000030fc000007fc0000f9fb000016fc000062fc0000d6fc00006bfd000007fe00008ffe0000fefe000045ff000066ff000079ff00008bff0000aaff0000ebff000048000000b40000002d0100009a010000ed01000033020000670200008f020000cb020000160300006b030000d8030000430400009c040000e70400001605000028050000280500001a050000ff040000db040000a60400005c040000fa0300007f030000f602000067020000e40100007f010000340100000c0100000301000000010000fc000000f3000000cc000000940000005600000001000000afff00006bff00001fff0000e0fe0000

Der digitale Kanal kann auch parallel zu einem bestehenden Kanal erstellt werden, etwa durch eine Multi-TRX-Konfiguration:

[MultiTX]
TYPE=Multi
TRANSMITTERS=Tx1,TxUDP

Einfacher Python-Code zur Ausgabe der UDP-Daten:

import socket
from datetime import datetime

def start_udp_server(host='0.0.0.0', port=4300):
    # Create a UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # Bind the socket to the address and port
    server_address = (host, port)
    sock.bind(server_address)

    print(f"Starting UDP server on {host}:{port}. Waiting for data...")

    try:
        while True:
            # Receive data from the client
            data, address = sock.recvfrom(65535)

            # Get the current timestamp with milliseconds
            timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

            # Convert the data to hexadecimal format
            hex_data = data.hex()

            # Print the timestamp and the received hex data
            print(f"[{timestamp}] Received {len(data)} bytes from {address}: {hex_data}")

    except KeyboardInterrupt:
        print("\nServer is shutting down.")
    finally:
        sock.close()

if __name__ == '__main__':
    start_udp_server()

Einfacher Pyhton-Code um die Daten auf 8000 Samples/s zu konvertieren:

import socket
import numpy as np
from scipy import signal 
import wave

def low_pass_filter(data, cutoff, fs, order=5):
    nyquist = 0.5 * fs
    normal_cutoff = cutoff / nyquist
    b, a = signal.butter(order, normal_cutoff, btype='low', analog=False)
    return signal.lfilter(b, a, data)

def start_udp_server_with_processing(host='0.0.0.0', port=4300, output_file='output.wav'):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind((host, port))

    print(f"Listening on {host}:{port}")

    out_wave = wave.open(output_file, 'wb')
    out_wave.setnchannels(1)
    out_wave.setsampwidth(2)
    out_wave.setframerate(8000)

    try:
        while True:
            data, _ = sock.recvfrom(4032)
            samples = np.frombuffer(data, dtype=np.int16)[::2]

            filtered_samples = low_pass_filter(samples, cutoff=3400, fs=48000)

            downsampled_samples = signal.resample_poly(filtered_samples, up=1, down=6)

            out_wave.writeframes(downsampled_samples.astype(np.int16).tobytes())

    except KeyboardInterrupt:
        print("\nServer shutting down.")
    finally:
        sock.close()
        out_wave.close()

if __name__ == '__main__':
    start_udp_server_with_processing()

Das Downsampling und die Ratenadaption basiert auf Samples von lediglich 20ms, damit kommt es zu Artifakten.

Diskussionen

Anhänge