// execution
//////////////////////////////////////////////////////////////////////////
+//========================================================================
+// util
+
+PRIVATE REAL
+CXBnorm(CXB buff) {
+ int i;
+ double sum = 0.0;
+ for (i = 0; i < CXBhave(buff); i++)
+ sum += Csqrmag(CXBdata(buff, i));
+ return sqrt(sum);
+}
+
//========================================================================
/* all */
should_do_rx_squelch(void) {
if (rx.squelch.flag) {
int i, n = CXBhave(rx.buf.o);
- REAL tst;
rx.squelch.power = 0.0;
for (i = 0; i < n; i++)
rx.squelch.power += Csqrmag(CXBdata(rx.buf.o, i));
- tst = (10.0 * log10(rx.squelch.power)
- + rx.squelch.offset.meter
- + rx.squelch.offset.att
- + rx.squelch.offset.gain);
- return rx.squelch.thresh > tst;
+ return rx.squelch.thresh > 10.0 * log10(rx.squelch.power);
} else
return rx.squelch.set = FALSE;
}
/* filtering, metering, & AGC */
if (rx.mode != SPEC) {
+ if (rx.tick == 0) reset_OvSv(rx.filt.ovsv);
filter_OvSv(rx.filt.ovsv);
CXBhave(rx.buf.o) = CXBhave(rx.buf.i);
if (uni.meter.flag) do_meter(CXBbase(rx.buf.o), uni.buflen);
PRIVATE void
do_rx_post(void) {
- int i, n = CXBhave(rx.buf.o);;
+ int i, n = CXBhave(rx.buf.o);
if (!rx.squelch.set) {
no_squelch();
PRIVATE void
do_tx_pre(void) {
+
if (tx.scl.pre.flag) {
int i, n = CXBhave(tx.buf.i);
for (i = 0; i < n; i++)
}
//
- // mix in CW tone here
+ // mix in CW tone here?
//
correctIQ(tx.buf.i, tx.iqfix);
if (tx.spr.flag) SpeechProcessor(tx.spr.gen);
+
+ if (tx.tick == 0) reset_OvSv(tx.filt.ovsv);
filter_OvSv(tx.filt.ovsv);
}
PRIVATE void
do_tx_SBCW(void) {
- int i, n = min(CXBhave(tx.buf.i), uni.buflen);
- for (i = 0; i < n; i++) {
- tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.99),
- Cscl(CXBdata(tx.buf.o,i), -0.01));
- CXBdata(tx.buf.o, i) = Cadd(CXBdata(tx.buf.o,i), tx.scl.dc);
- }
+ int i, n = min(CXBhave(tx.buf.o), uni.buflen);
+
+ if ((tx.norm = CXBnorm(tx.buf.o)) > 0.0)
+ for (i = 0; i < n; i++) {
+ tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.99),
+ Cscl(CXBdata(tx.buf.o, i), -0.01));
+ CXBdata(tx.buf.o, i) = Cadd(CXBdata(tx.buf.o, i), tx.scl.dc);
+ }
}
PRIVATE void
do_tx_AM(void) {
- int i, n = min(CXBhave(tx.buf.i), uni.buflen);
- for (i = 0; i < n; i++) {
- tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.999),
- Cscl(CXBdata(tx.buf.o,i), -0.001));
- CXBreal(tx.buf.o, i) =
- 0.49995 + 0.49995 * (CXBreal(tx.buf.o,i) - tx.scl.dc.re);
- CXBimag(tx.buf.o, i) = 0.0;
- }
+ int i, n = min(CXBhave(tx.buf.o), uni.buflen);
+
+ if ((tx.norm = CXBnorm(tx.buf.o)) > 0.0)
+ for (i = 0; i < n; i++) {
+ tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.999),
+ Cscl(CXBdata(tx.buf.o, i), -0.001));
+ CXBreal(tx.buf.o, i) =
+ 0.49995 + 0.49995 * (CXBreal(tx.buf.o, i) - tx.scl.dc.re);
+ CXBimag(tx.buf.o, i) = 0.0;
+ }
}
PRIVATE void
do_tx_FM(void) {
- int i, n = min(CXBhave(tx.buf.i), uni.buflen);
- for (i = 0; i < n; i++) {
- tx.scl.dc = Cadd(Cscl(tx.scl.dc,0.999),
- Cscl(CXBdata(tx.buf.o,i), 0.001));
- tx.osc.phase += (CXBreal(tx.buf.o, i)- tx.scl.dc.re) * CvtMod2Freq;
- if (tx.osc.phase >= TWOPI) tx.osc.phase -= TWOPI;
- if (tx.osc.phase < 0.0) tx.osc.phase += TWOPI;
- CXBdata(tx.buf.o, i) =
- Cscl(Cmplx(cos(tx.osc.phase), sin(tx.osc.phase)), 0.99999);
- }
+ int i, n = min(CXBhave(tx.buf.o), uni.buflen);
+ if ((tx.norm = CXBnorm(tx.buf.o)) > 0.0)
+ for (i = 0; i < n; i++) {
+ tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.999),
+ Cscl(CXBdata(tx.buf.o, i), 0.001));
+ tx.osc.phase += (CXBreal(tx.buf.o, i) - tx.scl.dc.re) * CvtMod2Freq;
+ if (tx.osc.phase >= TWOPI) tx.osc.phase -= TWOPI;
+ if (tx.osc.phase < 0.0) tx.osc.phase += TWOPI;
+ CXBdata(tx.buf.o, i) =
+ Cscl(Cmplx(cos(tx.osc.phase), sin(tx.osc.phase)), 0.99999);
+ }
}
PRIVATE void
for (i = 0; i < n; i++)
bufl[i] = (float)CXBimag(tx.buf.o, i), bufr[i] = (float)CXBreal(tx.buf.o, i);
- CXBhave(rx.buf.o) = n;
+ CXBhave(tx.buf.o) = n;
break;
}