aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Transceiver52M/sigProcLib.cpp49
-rw-r--r--Transceiver52M/sigProcLib.h3
2 files changed, 31 insertions, 21 deletions
diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp
index ab421b6..23538f3 100644
--- a/Transceiver52M/sigProcLib.cpp
+++ b/Transceiver52M/sigProcLib.cpp
@@ -369,9 +369,11 @@ signalVector *convolve(const signalVector *x,
switch (spanType) {
case START_ONLY:
start = 0;
- head = h->size();
+ head = h->size() - 1;
len = x->size();
- append = true;
+
+ if (x->getStartIndex() < head)
+ append = true;
break;
case NO_DELAY:
start = h->size() / 2;
@@ -681,7 +683,8 @@ static signalVector *modulateBurstLaurent(const BitVector &bits,
{
int burst_len;
float phase;
- signalVector *c0_pulse, *c1_pulse, c0_burst, c1_burst, *c0_shaped, *c1_shaped;
+ signalVector *c0_pulse, *c1_pulse, *c0_burst;
+ signalVector *c1_burst, *c0_shaped, *c1_shaped;
signalVector::iterator c0_itr, c1_itr;
/*
@@ -696,13 +699,13 @@ static signalVector *modulateBurstLaurent(const BitVector &bits,
burst_len = sps * (bits.size() + guard_len);
- c0_burst = signalVector(burst_len);
- c0_burst.isRealOnly(true);
- c0_itr = c0_burst.begin();
+ c0_burst = new signalVector(burst_len, c0_pulse->size());
+ c0_burst->isRealOnly(true);
+ c0_itr = c0_burst->begin();
- c1_burst = signalVector(burst_len);
- c1_burst.isRealOnly(true);
- c1_itr = c1_burst.begin();
+ c1_burst = new signalVector(burst_len, c1_pulse->size());
+ c1_burst->isRealOnly(true);
+ c1_itr = c1_burst->begin();
/* Padded differential start bits */
*c0_itr = 2.0 * (0x00 & 0x01) - 1.0;
@@ -718,10 +721,10 @@ static signalVector *modulateBurstLaurent(const BitVector &bits,
*c0_itr = 2.0 * (0x01 & 0x01) - 1.0;
/* Generate C0 phase coefficients */
- GMSKRotate(c0_burst, sps);
- c0_burst.isRealOnly(false);
+ GMSKRotate(*c0_burst, sps);
+ c0_burst->isRealOnly(false);
- c0_itr = c0_burst.begin();
+ c0_itr = c0_burst->begin();
c0_itr += sps * 2;
c1_itr += sps * 2;
@@ -746,8 +749,8 @@ static signalVector *modulateBurstLaurent(const BitVector &bits,
*c1_itr = *c0_itr * Complex<float>(0, phase);
/* Primary (C0) and secondary (C1) pulse shaping */
- c0_shaped = convolve(&c0_burst, c0_pulse, NULL, START_ONLY);
- c1_shaped = convolve(&c1_burst, c1_pulse, NULL, START_ONLY);
+ c0_shaped = convolve(c0_burst, c0_pulse, NULL, START_ONLY);
+ c1_shaped = convolve(c1_burst, c1_pulse, NULL, START_ONLY);
/* Sum shaped outputs into C0 */
c0_itr = c0_shaped->begin();
@@ -755,6 +758,8 @@ static signalVector *modulateBurstLaurent(const BitVector &bits,
for (unsigned i = 0; i < c0_shaped->size(); i++ )
*c0_itr++ += *c1_itr++;
+ delete c0_burst;
+ delete c1_burst;
delete c1_shaped;
return c0_shaped;
@@ -764,7 +769,7 @@ static signalVector *modulateBurstBasic(const BitVector &bits,
int guard_len, int sps)
{
int burst_len;
- signalVector *pulse, burst, *shaped;
+ signalVector *pulse, *burst, *shaped;
signalVector::iterator burst_itr;
if (sps == 1)
@@ -774,9 +779,9 @@ static signalVector *modulateBurstBasic(const BitVector &bits,
burst_len = sps * (bits.size() + guard_len);
- burst = signalVector(burst_len);
- burst.isRealOnly(true);
- burst_itr = burst.begin();
+ burst = new signalVector(burst_len, pulse->size());
+ burst->isRealOnly(true);
+ burst_itr = burst->begin();
/* Raw bits are not differentially encoded */
for (unsigned i = 0; i < bits.size(); i++) {
@@ -784,11 +789,13 @@ static signalVector *modulateBurstBasic(const BitVector &bits,
burst_itr += sps;
}
- GMSKRotate(burst, sps);
- burst.isRealOnly(false);
+ GMSKRotate(*burst, sps);
+ burst->isRealOnly(false);
/* Single Gaussian pulse approximation shaping */
- shaped = convolve(&burst, pulse, NULL, START_ONLY);
+ shaped = convolve(burst, pulse, NULL, START_ONLY);
+
+ delete burst;
return shaped;
}
diff --git a/Transceiver52M/sigProcLib.h b/Transceiver52M/sigProcLib.h
index 516d352..ebe7519 100644
--- a/Transceiver52M/sigProcLib.h
+++ b/Transceiver52M/sigProcLib.h
@@ -95,6 +95,9 @@ class signalVector: public Vector<complex>
symmetry = NONE;
};
+ /** start index */
+ int getStartIndex() const { return mStart - mData; };
+
/** symmetry operators */
Symmetry getSymmetry() const { return symmetry;};
void setSymmetry(Symmetry wSymmetry) { symmetry = wSymmetry;};