func main() { rand.Seed(time.Now().Unix()) rand.Seed(1) // for i := 0; i < 256; i++ { // fmt.Printf("\n %d %c ", i, i) // } var N = 10 bits2 := vlib.NewOnesB(10) fmt.Print("\nRandBits = ", vlib.Randsrc(N, 2)) fmt.Print("\nRandNoise = ", vlib.RandNCVec(N, 1)) // msg := sources.RandChars(N) msg := vlib.RandReadableChars(N) strmsg := string(msg) // strmsg = "Hello world, this is a message sent" // var msg = "HELLO SENDIL" fmt.Printf("\nRandChars = %s ", strmsg) fmt.Print("\nBit messages = ", sources.BitsFromMessage(strmsg)) bits3 := sources.BitsFromMessage(strmsg) fmt.Printf("\nBits : %v", bits2) fmt.Printf("\nBits : %v ", bits3) bpskModem := core.NewModem() // bpskModem.Init(1) fmt.Printf("\n%v", bpskModem) fmt.Printf("\n%f", bpskModem.Constellation) print("\n") // Legacy // qpskModem := modem.NewModem(2, "QPSK") qpskModem := new(core.Modem) qpskModem.Init(2, "QPSK") fmt.Printf("\n%v", qpskModem) fmt.Printf("\n%f", qpskModem.Constellation) qpskModem.ModulateBits(bits2) }
func main() { rand.Seed(time.Now().Unix()) // rand.Seed(1) start := time.Now() var N = 10 var N0 float64 = 1.0 / 10 txbits := vlib.VectorB(sources.RandB(N)) qpskModem := new(core.Modem) var BitsPerSymbol = 2 qpskModem.Init(BitsPerSymbol, "") fmt.Printf("\n%v", qpskModem) /// Take every N-bit and push to modem-channel-demod length := len(txbits) // slength := length / BitsPerSymbol //var result = make([]complex128, slength) /// Actual Modulation happens here cnt := 0 // rxcnt := 0 // symCH := make([]chan complex128, length) COUNT := length / 2 rxCH := make([]chan []uint8, COUNT) for i := 0; i < COUNT; i++ { rxCH[i] = make(chan []uint8) } for i := 0; i < length; i += BitsPerSymbol { symCH := make(chan complex128) go qpskModem.GenerateSymbolCH(cnt, txbits[i:i+BitsPerSymbol], symCH) go func(twowayChannel chan complex128, cnt int) { symbol := <-twowayChannel noise := sources.RandNC(N0) fmt.Printf("\n Added Noise %d %v", cnt, noise) rxsymbol := symbol + noise twowayChannel <- rxsymbol }(symCH, cnt) go qpskModem.DemodSymbolCH(cnt, symCH, rxCH[cnt]) cnt++ } ORDER := true //// UNORDERED receiver bits... for i := 0; i < COUNT; i++ { if ORDER { func(cnt int, tmpRxCh chan []uint8) { for rxbits := range tmpRxCh { fmt.Printf("\n Unordered Loop Detected bits %d %v", cnt, rxbits) } }(i, rxCH[i]) } else { go func(cnt int, tmpRxCh chan []uint8) { for rxbits := range tmpRxCh { fmt.Printf("\n Unordered Loop Detected bits %d %v", cnt, rxbits) } }(i, rxCH[i]) fmt.Printf("Waiting for routines to finish") time.Sleep(2 * time.Second) } } /// Ordered read from the Receiver channels // cnt = 0 // for _, channel := range rxCH { // for rxbits := range channel { // fmt.Printf("\n Outer Loop Detected bits %d %v", cnt, rxbits) // } // cnt++ // } // txsymbols := qpskModem.ModulateBits(txbits) // rxsymbols := vlib.ElemAddCmplx(txsymbols, sources.Noise(len(txsymbols), N0)) // rxbits := qpskModem.DeModulateBits(rxsymbols) // // fmt.Printf("\nTx=%v", txbits) // // fmt.Printf("\nRx=%v", rxbits) // fmt.Printf("\nERR=%v/%d = %f", txbits.CountErrors(rxbits), len(txbits), float64(txbits.CountErrors(rxbits))/float64(len(txbits))) fmt.Printf("\n\n Elapsed %v \n", time.Since(start).String()) }