func (m *OFDM) Fft(inputPin1 gocomm.Complex128AChannel) { /// Read your data from Input channel(s) [inputPin1] /// And write it to OutputChannels [outputPin1] outputPin1 := m.Pins["outputPin1"].Channel.(gocomm.Complex128AChannel) iters := 1 for i := 0; i < iters; i++ { chData := <-inputPin1 iters = chData.MaxExpected tsamples := chData.Ch /// Do process here with chData var outData gocomm.SComplex128AObj outData.Ch = dsp.ExtFFT_C(tsamples, m.NPoint) /// copy meta outData.MaxExpected = chData.MaxExpected outData.Ts = chData.Ts outData.TimeStamp = chData.TimeStamp outData.Message = chData.Message outputPin1 <- outData iters = chData.MaxExpected } }
func (m *MPChannel) Channel(inputPin0 gocomm.Complex128Channel) { /// Read your data from Input channel(s) [inputPin0] /// And write it to OutputChannels [outputPin0] outputPin0 := chipset.ToComplexCH(m.Pins["outputPin0"]) var IdealChObj gocomm.SComplex128AObj iters := 1 for i := 0; i < iters; i++ { chData := <-inputPin0 iters = chData.MaxExpected /// Do process here with chData outData := m.ChannelFn(chData) /// coeff attempt to send IdealChObj.Ch = m.Coeff IdealChObj.Ts = chData.Ts IdealChObj.TimeStamp = chData.TimeStamp IdealChObj.Message = chData.Message IdealChObj.MaxExpected = chData.MaxExpected //fmt.Printf("\n Want to broadcast %#v to %#v", IdealChObj, coeffPin) /// // select { // case coeffPin <- IdealChObj: // // fmt.Printf("\n%f : sent message %v", IdealChObj.TimeStamp, IdealChObj.Ch) // default: // // fmt.Printf("\n%f: no message sent", IdealChObj.TimeStamp) // } outputPin0 <- outData } }
func (m *MPChannel) ChannelFn(sample gocomm.SComplex128Obj) (result gocomm.SComplex128Obj) { /// Read your data from Input channel(s) [inputPin0] /// And write it to OutputChannels [outputPin0] // fmt.Printf("\n Channel Param %#v \n input = %v", m.ChannelParam, sample) if m.Ts == -1 { m.Coeff.Resize(m.pdp.Size()) for i := 0; i < m.pdp.Size(); i++ { m.Coeff[i] = sources.RandNC(m.pdp[i]) } if m.FeedbackCH != nil { var chdata gocomm.SComplex128AObj chdata.Ch = m.Coeff chdata.TimeStamp = m.TimeStamp chdata.MaxExpected = sample.MaxExpected chdata.Ts = m.Ts fmt.Printf("\n FAST IID generated for sample@%v with %v@%v", sample.TimeStamp, m.TimeStamp, cmplx.Abs(m.Coeff[0])*cmplx.Abs(m.Coeff[0])) m.FeedbackCH <- chdata } } else { m.updateCoeff(sample.TimeStamp) } if m.FilterMemory.Size() != m.Coeff.Size() { m.FilterMemory.Resize(m.Coeff.Size()) } result = sample /// Carefull if not same ChType // m.TimeStamp = sample.TimeStamp m.FilterMemory = m.FilterMemory.ShiftLeft(sample.Ch) //dummy := vlib.ElemMultC(m.Coeff, vlib.Conj(m.Coeff)) foutput := vlib.DotC(m.Coeff, m.FilterMemory) // fmt.Printf("\n CHANNEL @%v: I/P %v - Gain : %v : O/p : %v", sample.TimeStamp, sample.Ch, cmplx.Abs(m.Coeff[0])*cmplx.Abs(m.Coeff[0]), foutput) result.Ch = foutput result.Message = sample.Message + " Filter" result.Ts = sample.Ts result.TimeStamp = sample.TimeStamp result.MaxExpected = sample.MaxExpected // fmt.Printf("\n I/O (hn =%v) : %#v --> %#v", m.Coeff, sample, result) return result }
func (m *MPChannel) updateCoeff(timestamp float64) { /// first time generated := false if m.TimeStamp == -1 { m.Coeff.Resize(m.pdp.Size()) for i := 0; i < m.pdp.Size(); i++ { m.Coeff[i] = sources.RandNC(m.pdp[i]) } generated = true m.TimeStamp = 0 /// Unusuall if inbetween the MPchannel timestamp has got RESET !! } else { /// Existing channel-coeff is valid till m.Timestamp+m.TS, valid := timestamp < (m.TimeStamp + m.Ts) if !valid { /// TRIGGER NEW COEFF m.Coeff = vlib.NewVectorC(m.pdp.Size()) for i := 0; i < m.pdp.Size(); i++ { m.Coeff[i] = sources.RandNC(m.pdp[i]) } m.TimeStamp = timestamp generated = true } } /// Write new coeff to feedback channel if new was generated if m.FeedbackCH != nil && generated { var chdata gocomm.SComplex128AObj chdata.Ch = m.Coeff chdata.TimeStamp = m.TimeStamp chdata.Ts = m.Ts // fmt.Printf("\n CH:GENERATED @ %v with Coeff : %v, Gain : %v ", timestamp, m.Coeff[0], cmplx.Abs(m.Coeff[0])*cmplx.Abs(m.Coeff[0])) m.FeedbackCH <- chdata } }