summaryrefslogtreecommitdiff
path: root/R/prbs.R
blob: 0380625119becc8752746505157bb3604709b284 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#' @export
 library(bitops)
require(signal)

idin.prbs<-function(n,band=c(0,1),levels=c(0,1)){
  u=vector()
  for(i in 1:18){
    if(n / (2^i) < 1){
      u=idin.prbs12(i,band,levels)
      break
    }
  }
  return(u[1:n])
}

idin.prbs12 <- function(N,band=c(0,1),levels=c(0,1)){
  first=ceiling(abs(rnorm(1)*10))  #some non-zero initial state 
  x= first
  v = vector()  
  n=2^N-1
  i=1
  clock=floor(1/band[2])
  k=1
  M=rbind(c(0,0,0,0),c(1,2,0,0),c(1,3,0,0),c(1,4,0,0),c(2,5,0,0),c(1,6,0,0),
          c(1,7,0,0),c(1,2,7,8),c(4,9,0,0),c(3,10,0,0),c(9,11,0,0),
          c(6,8,11,12),c(9,10,12,13),c(4,8,13,14),c(14,15,0,0),c(4,13,15,16),
          c(14,17,0,0),c(11,18,0,0))
  repeat{
    a=M[N,1]
    b=M[N,2]
    c=M[N,3]
    d=M[N,4]
    four=c(8,12,13,14,16)
    if(N %in% four){
    e=bitwXor(bitwShiftR(x,N-a),bitwShiftR(x,N-b))
    f=bitwXor(bitwShiftR(x,N-c),bitwShiftR(x,N-d))
    newbit=bitwAnd(bitwXor(e,f),1)
    }else{
      newbit=bitwAnd(bitwXor(bitwShiftR(x,N-a),bitwShiftR(x,N-b)),1)
    }
     if(k>=clock || i==1){
       # newbit=bitwAnd(bitwXor(bitwShiftR(x,0),bitwShiftR(x,1)),1)
       v[i]=newbit
       i=i+1
       # x=bitwOr(bitwShiftR(x,1),bitwShiftL(newbit,6))
       k=1
     }else{
       
       v[i]=v[i-1]
       i=i+1
       k=k+1
     }
     
    x=bitwOr(bitwShiftR(x,1),bitwShiftL(newbit,N-1))
    
    #checking if it exceeds the repetition period or reaches
    #required no. of bits first
    if(x==first){
      cat("Repetition period is ",i-1)
      break
    }
    # else if(i-1==n){
    #   break
    # }
    
  }

  v=sapply(v, function(x){if (x==0) levels[1] else levels[2]})
  return(v)
}