Я попытался реализовать сверточное декодирование с использованием алгоритма Витерби в unetstack. Однако есть некоторые проблемы, с которыми я сталкиваюсь.
- Данные не отправляются на узел 2. (arr - строка 43 MulAgent.groovy)
- В некоторых случаях появляется ошибка
groovy.lang.MissingMethodException: Нет сигнатуры метода: Script2.send () применим для типов аргументов: (java.lang.Integer, java.lang.Integer)
значения: [2,1010]
// где 2, 1010
- входные значения, которые мы даем
mul-sim.groovy (первый файл, который открывается и запрашивает ввод данных)
import org.arl.fjage.Message
import org.arl.unet.*
import org.arl.mac.*
import org.arl.unet.phy.*
import org.arl.fjage.RealTimePlatform
println'''
OUTPUT TABLE
+----+----------+----------+
| | 0 | 1 |
+----+----------+----------+
| a | 00(a) | 11(b) |
+----+----------+----------+
| b | 10(c) | 01(d) |
+----+----------+----------+
| c | 11(a) | 00(b) |
+----+----------+----------+
| d | 01(c) | 10(d) |
+----+----------+----------+ '''
println '''
2-node network to perform sender - receiver operation
-----------------------------------------
Node 1 will send an encoded value to node 2
The agent MulAgent present at node 2, will decode the received data and send the value to node 1 checking
You can interact with node 1 in the console shell. For example, try:
send <to-address> , < data>
For example:
send 2, 1011
When you are done, exit the shell by pressing ^D or entering:
shutdown
'''
platform = RealTimePlatform
// run simulation forever
simulate {
node '1', address: 1, remote: 1101, location: [0, 0, 0], shell: true, stack: { container ->
container.shell.addInitrc "${script.parent}/fshrc.groovy"
}
node '2', address: 2, remote: 1102, location: [1.km, 0, 0], shell:5102, stack: { container ->
container.add 'mul', new MulAgent()
}
}
MulAgent.groovy( Agent file
// Агент для программы, содержащей код декодирования
импортировать org.arl.fjage.Message
импорт org.arl.unet. *
импорт org.arl.mac. *
класс MulAgent расширяет UnetAgent {
final static int PROTOCOL = Protocol.DATA
int receive_data
int new_data
def arr = new int [4] [2]
def temp = new int [2]
def code = new int [4] [2]
Int I
Int K
int j = 0
int error_bit;
int column_error = 0
int row_error = 0
int m = 4
int n = 4
int count
void startup () {
def phy = agentForService Services.PHYSICAL
подписаться на тему (phy)
}
void processMessage (Сообщение msg) {
if (msg instanceof DatagramNtf && msg.protocol == PROTOCOL)
{
для (я = 0; г <2; я ++)
{
temp [i] = msg.data [i]
println «Полученные данные печатаются в агенте $ {temp [i]}»
} <br>
для (я = 0; г <2; я ++)
arr [j] [i] = temp [i];
println "Массив в агенте - $ {arr}}"
println "Принятые данные распечатываются в агенте $ {temp}" </p>
println "Recieved total data printing in Agent is ${temp}"
send new DatagramReq(recipient: msg.sender,to: msg.from, protocol: Protocol.MAC, data: arr[j])
j++
// начало
/ ************************************************* ****************** /
/ * /
/ сверточное декодирование с использованием Витерби /
/ ------------------------------------------ /
/ Шаг 1: принять ввод как закодированное информационное слово /
/ Шаг 2: Подмодуль для расчета расстояния Хэмминга /
/ Шаг 2: код для декодирования с использованием алгоритма Витерби * /
/ ************************************************* ****************** /
Код = обр;
int state [] = [0,, 0,0,0,0,0,0] // состояние
int mem [] = [0,0,0,0,0,0,0,0,0,0] // память
int path = 0; // матрица пути
// int data [] = [1,1,0,1]
int n, l;
для (int j = 0; j <4; j ++)
{для (int i = 8; i> = 0; i--)
{mem [i + i] = mem [i]; // сдвиг на один бит
}
для (int i = 0; i <8; i ++)
{state [i] = mem [i];
}
// дисп (MEM);
состояние [I] = 0; // ввести 0
MEM [I] = 0;
// рассчитать расстояние Хемминга
int out1 = ((mem [1] ^ mem [2] ^ mem [4] ^ mem [5] ^ mem [6] ^ mem [7] ^ mem [8]) ^ ((mem [1] ^ mem [ 2] ^ mem [3] ^ mem [5] ^ mem [6] ^ mem [7] ^ mem [8])); // disp (out1); // вывод с 0
состояние [I] = 1; // ввести 1
MEM [I] = 1;
int out2 = ((mem [1] ^ mem [2] ^ mem [4] ^ mem [5] ^ mem [6] ^ mem [7] ^ mem [8]) ^ ((mem [1] ^ mem [ 2] ^ MEM [3] ^ MEM [5] ^ MEM [6] ^ MEM [7] ^ MEM [8])); </p>
int l = (код [j] [0] ^ out1) + (код [j] [1] ^ out)); // расстояние Хемминга с out1
int m = (код [j] [0] ^ out2) + (код [j] [1] ^ out2)); // расстояние Хэмминга с out2
if(l<m) { //consider with minimum hamming distance
path=path+l;
state[1]=0;
mem[1]=0;
data[j]=0;}
else
{ path=path+m;
data[j]=1;
}
if(l<m)
{ path=path+l;
decode[k]=0;}
else if(l>m)
{ path=path+m;
decode[k]=1;
}
println "значение пути = $ путь"
int code = data;
}
def codew = new int [4] [2]
codew = code; // обнаружение ошибки 0 бит
int правильное = 0;
int detect = 0;
int n;
для (я = 0; г <2; я ++)
если (codew [I] [J])
codew [I] [J] = 0; </p>
для (int i = 0; i <4; i ++) </p>
if(path!=0) //one error detected
{ if(y==codew) //corrected
{ correct=correct+1;
detect=detect+1;
}
}
if(path!=0) //detected
{ if(y!=codew) //not corrected
{ detect=detect+1;
}
}
n++;
if(codew[i][j])
codew[i][j]=0;
else
codew[i][j]=1;
}
если (обнаружение == 0)
println "обнаружение завершено"
Println "$ код"
еще если (обнаружить! = 0)
println "обнаружение завершено"
Println "$ код"
}
}
fshrc.groovy (the received word is encoded and sent for decoding)
import org.arl.unet. *
импорт org.arl.unet.phy. *
импорт org.arl.unet. *
импорт org.arl.unet.phy. *
импорт org.arl.unet.mac. *
// импортируем org.arl.unet.nodeinfo.NodeInfo
// импортируем org.arl.unet.PDU
импортировать org.arl.fjage. *
// импортируем статические org.arl.unet.Services. *// импортировать статический org.arl.unet.phy.Physical. *
подписать phy
send = {addr, value -> println "отправив $ value на узел $ addr" def y =новый int [4];def a = new int [4];a = [1, 1, 1, 1] y = [0, 0, 0, 0] int i = 3 println «$ value» int x = value;
while (x! = 0) {у [I] = х% 10;println "$ y" x = x / 10;я--;} def code = new int [4] [2];
/ * кодовое слово, закодированное с использованием функций генератора g1 = 1101 g2 = 1110 * /
для (i = 0; i <4; i ++) {<br> int bit = y [3-i];[3-i] = бит;
код [i] [0] = a [0] ^ a [1] ^ a [3];код [i] [1] = a [0] ^ a [1] ^ a [2];}
println "4-битовое кодированное слово:"
// Кодовое слово печатается
println "$ code"
//println "sending ${value[0]} to node $addr "
phy << new DatagramReq(to: addr, protocol: Protocol.DATA, data: code[0])
def txNtf1= receive(TxFrameNtf, 1000)
def rxNtf1 = receive({ it instanceof RxFrameNtf && it.from == addr}, 5000)
if (txNtf1 && rxNtf1 && rxNtf1.from == addr)
println "Data Received at ${rxNtf.to} from ${rxNtf.from} is: ${rxNtf.data}"
// println "отправка $ {value [1]} на узел $ addr" phy << new DatagramReq (to: addr, протокол: Protocol.DATA, data: code [1]) def txNtf2 = receive (TxFrameNtf, 1000) def rxNtf2= receive ({it instanceof RxFrameNtf && it.from == addr}, 5000) if (txNtf2 && rxNtf2 && rxNtf2.from == addr) println "Данные, полученные в $ {rxNtf2.to} от $ {rxNtf2.from}, равны: $ {rxNtf2.data} "</p>
// println" отправка $ {value [2]} на узел $ addr "phy << new DatagramReq (to: addr, протокол: Protocol.DATA, data: code[2]) def txNtf3 = receive (TxFrameNtf, 1000) def rxNtf3 = receive ({it instanceof RxFrameNtf && it.from == addr}, 5000) if (txNtf3 && rxNtf3 && rxNtf3.from == addr) println "Данные полученыв $ {rxNtf3.to} из $ {rxNtf3.from} есть: $ {rxNtf3.data} "</p>
// println" отправка $ {value [3]} на узел $ addr "phy << newDatagramReq (to: addr, протокол: Protocol.DATA, данные: код [3]) def txNtf4 = receive (TxFrameNtf, 1000) def rxNtf4 = receive ({это экземпляр RxFrameNtf && it.from == addr}, 5000) if (txNtf4 && rxNtf4 && rxNtf4.from == addr) println {rN получит данные в $.to} из $ {rxNtf4.from}: $ {rxNtf4.data} "</p>
}