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