root/experimental/components/FrameAssembler/branches/FrameAssembler-metadata/src/FrameAssemblerDSP.cpp @ 5638

Revision 5638, 5.9 KB (checked in by jgaeddert, 6 years ago)

more control stability

  • Property svn:eol-style set to native
Line 
1/****************************************************************************
2
3Copyright 2007 Virginia Polytechnic Institute and State University
4
5This file is part of the OSSIE FrameAssembler.
6
7OSSIE FrameAssembler is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12OSSIE FrameAssembler is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OSSIE FrameAssembler; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
21****************************************************************************/
22
23
24#include <iostream>
25#include "FrameAssemblerDSP.h"
26#include <math.h>
27
28using namespace SigProc;
29
30// Default constructor
31FrameAssemblerDSP::FrameAssemblerDSP()
32{
33    // Initialize control block pointers
34    controlBlock = new char*[8];
35
36    // Default control block codes to be all positive
37    for (unsigned int i=0; i<8; i++)
38        controlBlock[i] = pnControlCode;
39
40    ConfigureModulationScheme( BPSK );
41    ConfigureFrameSize( FRAME_SIZE_1 );
42    ConfigureFrameType( FRAME_TYPE_DATA );
43
44    numFrameSymbolsAssembled = 0;
45}
46
47// Destructor
48FrameAssemblerDSP::~FrameAssemblerDSP()
49{
50    delete [] controlBlock;
51}
52
53void FrameAssemblerDSP::ConfigureModulationScheme(ModulationScheme _ms)
54{
55    // Set appropriate modulation function
56    switch (_ms) {
57    case BPSK:
58        controlBlock[0] = pnControlCodeInv; // 0
59        controlBlock[1] = pnControlCodeInv; // 0
60        controlBlock[2] = pnControlCodeInv; // 0
61        break;
62    case QPSK:
63        controlBlock[0] = pnControlCodeInv; // 0
64        controlBlock[1] = pnControlCodeInv; // 0
65        controlBlock[2] = pnControlCode;    // 1
66        break;
67    case PSK8:
68        controlBlock[0] = pnControlCodeInv; // 0
69        controlBlock[1] = pnControlCode;    // 1
70        controlBlock[2] = pnControlCodeInv; // 0
71        break;
72    case QAM16:
73        controlBlock[0] = pnControlCodeInv; // 0
74        controlBlock[1] = pnControlCode;    // 1
75        controlBlock[2] = pnControlCode;    // 1
76        break;
77    case PAM4:
78        controlBlock[0] = pnControlCode;    // 1
79        controlBlock[1] = pnControlCodeInv; // 0
80        controlBlock[2] = pnControlCodeInv; // 0
81        break;
82    default:
83        // unknown property
84        std::cerr << "ERROR: FrameAssemblerDSP::ConfigureModulationScheme(): "
85                  << "unsupported mod. scheme " << _ms << std::endl;
86        throw 0;
87    }
88}
89
90
91void FrameAssemblerDSP::ConfigureFrameType(unsigned int _ft)
92{
93    switch (_ft) {
94    case FRAME_TYPE_DATA:
95        controlBlock[5] = pnControlCodeInv; // 0
96        controlBlock[6] = pnControlCodeInv; // 0
97        frameType = FRAME_TYPE_DATA;
98        break;
99    case FRAME_TYPE_CONTROL:
100        controlBlock[5] = pnControlCodeInv; // 0
101        controlBlock[6] = pnControlCode;    // 1
102        frameType = FRAME_TYPE_CONTROL;
103        ConfigureFrameSize(512);
104        break;
105    default:
106        // unsupported frame size
107        std::cout << "WARNING: FrameAssemblerDSP::ConfigureFrameType(): "
108                  << "unsupported frame type (" << _ft << ")" << std::endl;
109        std::cout << "  => using FRAME_TYPE_DATA instead" << std::endl;
110        ConfigureFrameType(FRAME_TYPE_DATA);
111        return;
112    }
113   
114}
115
116void FrameAssemblerDSP::ConfigureFrameSize(unsigned int _fs)
117{
118    switch (_fs) {
119    case FRAME_SIZE_1:
120        frameSize = FRAME_SIZE_1;
121        controlBlock[3] = pnControlCodeInv;
122        controlBlock[4] = pnControlCodeInv;
123        break;
124    case FRAME_SIZE_2:
125        frameSize = FRAME_SIZE_2;
126        controlBlock[3] = pnControlCodeInv;
127        controlBlock[4] = pnControlCode;
128        break;
129    case FRAME_SIZE_3:
130        frameSize = FRAME_SIZE_3;
131        controlBlock[3] = pnControlCode;
132        controlBlock[4] = pnControlCodeInv;
133        break;
134    case FRAME_SIZE_4:
135        frameSize = FRAME_SIZE_4;
136        controlBlock[3] = pnControlCode;
137        controlBlock[4] = pnControlCode;
138        break;
139    default:
140        // unsupported frame size
141        std::cout << "WARNING: FrameAssemblerDSP::ConfigureFrameSize(): "
142                  << "unsupported frame size (" << _fs << ")" << std::endl;
143        std::cout << "  => using " << FRAME_SIZE_1 << " instead" << std::endl;
144        ConfigureFrameSize(FRAME_SIZE_1);
145    }
146}
147
148
149// Generates 10101010 phasing pattern
150void FrameAssemblerDSP::AssemblePhasingPattern(
151    short * I_out,
152    short * Q_out)
153{
154    bool bitFlag(true);
155
156    for (unsigned int i=0; i<512; i++) {
157
158        if ( bitFlag ) {
159            I_out[i] =  BPSK_LEVEL;
160            Q_out[i] =  0;
161        } else {
162            I_out[i] = -BPSK_LEVEL;
163            Q_out[i] =  0;
164        }
165
166        bitFlag = !bitFlag;
167    }
168}
169
170// Generates header
171void FrameAssemblerDSP::AssembleHeader(
172    short * I_out,
173    short * Q_out)
174{
175    // Write tail end of phasing pattern
176    char phasingTail[9] = {1, 0, 1, 0, 1, 0, 1, 0, 1};
177    WriteSequence(phasingTail, 9, I_out, Q_out);
178    I_out += 9;
179    Q_out += 9;
180
181    // Write P/N Sync code
182    WriteSequence(pnFrameSyncCode, 255, I_out, Q_out);
183    I_out += 255;
184    Q_out += 255;
185
186    // Write control blocks
187    for (unsigned int i=0; i<8; i++) {
188        WriteSequence(controlBlock[i], 31, I_out, Q_out);
189        I_out += 31;
190        Q_out += 31;
191    }
192
193}
194
195// Generates postamble...
196void FrameAssemblerDSP::AssemblePostamble()
197{
198}
199
200//
201void FrameAssemblerDSP::WriteSequence(
202    char * bits_in,
203    unsigned int N_in,
204    short * I_out,
205    short * Q_out)
206{
207    //
208    for (unsigned int i=0; i<N_in; i++) {
209        I_out[i] = ( bits_in[i] ) ? BPSK_LEVEL : -BPSK_LEVEL;
210        Q_out[i] = 0;
211    }
212}
213
214
Note: See TracBrowser for help on using the browser.