Сверточное декодирование с использованием алгоритма Витерби в unetstack - PullRequest
1 голос
/ 11 апреля 2019

Я попытался реализовать сверточное декодирование с использованием алгоритма Витерби в unetstack. Однако есть некоторые проблемы, с которыми я сталкиваюсь.

  1. Данные не отправляются на узел 2. (arr - строка 43 MulAgent.groovy)
  2. В некоторых случаях появляется ошибка

    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>

}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...