1 #include "Corner_Turn_OL.h"
3 /************************************************************************************/
5 void Corner_Turn_OL_init(DOLProcess * p)
12 for (i=0; i<NUMBER_OF_RANGE_BINS; i=i+1)
14 for (j=0; j<NFFT; j=j+1)
16 p->local->Main_A[i][j].real = 0.0; // Buffer for N_Range_Bins * NFFT complex samples
17 p->local->Main_A[i][j].imag = 0.0;
18 p->local->Main_B[i][j].real = 0.0;
19 p->local->Main_B[i][j].imag = 0.0;
20 p->local->Delayed_C[i][j].real = 0.0; // Buffer for N_Range_Bins * NFFT complex samples
21 p->local->Delayed_C[i][j].imag = 0.0;
22 p->local->Delayed_D[i][j].real = 0.0;
23 p->local->Delayed_D[i][j].imag = 0.0;
26 // for (j=0; j<(NFFT/2); j=j+1)
28 // p->local->Delayed_Output[i][j].real = 0.0; // Buffer to create out delay of NFFT/2
29 // p->local->Delayed_Output[i][j].imag = 0.0;
33 p->local->Zero.real = 0.0;
34 p->local->Zero.imag = 0.0;
36 // p->local->buffer_mode = 0;
38 p->local->input_pointer = 0;
39 p->local->output_pointer = 0;
40 p->local->hold_input=0;
41 p->local->hold_output=0;
43 p->local->pulse_counter_in = 0;
44 p->local->pulse_counter_out = 0;
45 p->local->bin_counter_in = 0;
46 p->local->bin_counter_out = 0;
47 // p->local->output_index = 0;
48 p->local->n_batches = 0;
49 p->local->n_iterations = 0;
54 /************************************************************************************/
56 int Corner_Turn_OL_fire(DOLProcess * p)
58 ComplexNumber samples_in[NUMBER_OF_RANGE_BINS];
61 // This block will input in RANGE dimension and output in NFFT dimension.
62 if(!p->local->hold_input){
63 DOL_read((void*)PORT_DATA_IN, &samples_in, NUMBER_OF_RANGE_BINS*sizeof(ComplexNumber), p); // Read a vector of input samples.
65 // if (p->local->buffer_mode == 0) // if buffer_mode = 0: input buffer is A, output buffer is B
67 // p->local->Beams_A[p->local->bin_counter_in][p->local->pulse_counter_in] = next_sample;
68 // next_sample = p->local->Beams_B[p->local->bin_counter_out][p->local->pulse_counter_out];
69 // DOL_write((void*)PORT_DATA_OUT, &next_sample, sizeof(ComplexNumber), p);
70 // DOL_write((void*)PORT_DATA_OUT_OL, &(p->local->Delayed_Output[p->local->bin_counter_out][p->local->output_index]), sizeof(ComplexNumber), p);
71 // p->local->Delayed_Output[p->local->bin_counter_out][p->local->output_index] = next_sample; // Fill delay buffer with input
73 // else // if buffer_mode = 1: input buffer is B, output buffer is A
75 // p->local->Beams_B[p->local->bin_counter_in][p->local->pulse_counter_in] = next_sample;
76 // next_sample = p->local->Beams_A[p->local->bin_counter_out][p->local->pulse_counter_out];
77 // DOL_write((void*)PORT_DATA_OUT, &next_sample, sizeof(ComplexNumber), p);
78 // DOL_write((void*)PORT_DATA_OUT_OL, &(p->local->Delayed_Output[p->local->bin_counter_out][p->local->output_index]), sizeof(ComplexNumber), p);
79 // p->local->Delayed_Output[p->local->bin_counter_out][p->local->output_index] = next_sample; // Fill delay buffer with input
82 switch (p->local->state)
86 // put the input vector in buffers (check documentation for details)
87 if(!p->local->hold_input){
88 for (i=0; i<NUMBER_OF_RANGE_BINS; i++){
89 p->local->Main_B[i][p->local->input_pointer]=samples_in[i]; //input B1
90 p->local->Delayed_C[i][p->local->input_pointer + (NFFT/2)]=samples_in[i]; //input C2
94 if(!p->local->hold_output){
95 DOL_write((void*)PORT_DATA_OUT, &(p->local->Main_A[p->local->output_pointer][0]),NFFT*sizeof(ComplexNumber), p); //output A
96 DOL_write((void*)PORT_DATA_OUT_OL, &(p->local->Delayed_D[p->local->output_pointer][0]), NFFT*sizeof(ComplexNumber), p); //output D
102 // put the input vector in buffers (check documentation for details)
103 if(!p->local->hold_input){
104 for (i=0; i<NUMBER_OF_RANGE_BINS; i++){
105 p->local->Main_B[i][p->local->input_pointer + (NFFT/2)]=samples_in[i]; //input B2
106 p->local->Delayed_D[i][p->local->input_pointer ]=samples_in[i]; //input D1
109 if(!p->local->hold_output){
110 DOL_write((void*)PORT_DATA_OUT, &(p->local->Main_A[p->local->output_pointer][0]),NFFT*sizeof(ComplexNumber), p); //output A
111 DOL_write((void*)PORT_DATA_OUT_OL, &(p->local->Delayed_C[p->local->output_pointer][0]), NFFT*sizeof(ComplexNumber), p); //output D
117 // put the input vector in buffers (check documentation for details)
118 if(!p->local->hold_input){
119 for (i=0; i<NUMBER_OF_RANGE_BINS; i++){
120 p->local->Main_A[i][p->local->input_pointer]=samples_in[i]; //input A1
121 p->local->Delayed_D[i][p->local->input_pointer + (NFFT/2)]=samples_in[i]; //input D2
124 if(!p->local->hold_output){
125 DOL_write((void*)PORT_DATA_OUT, &(p->local->Main_B[p->local->output_pointer][0]),NFFT*sizeof(ComplexNumber), p); //output A
126 DOL_write((void*)PORT_DATA_OUT_OL, &(p->local->Delayed_C[p->local->output_pointer][0]), NFFT*sizeof(ComplexNumber), p); //output D
132 // put the input vector in buffers (check documentation for details)
133 if(!p->local->hold_input){
134 for (i=0; i<NUMBER_OF_RANGE_BINS; i++){
135 p->local->Main_A[i][p->local->input_pointer + (NFFT/2)]=samples_in[i]; //input A2
136 p->local->Delayed_C[i][p->local->input_pointer ]=samples_in[i]; //input C1
139 if(!p->local->hold_output){
140 DOL_write((void*)PORT_DATA_OUT, &(p->local->Main_B[p->local->output_pointer][0]),NFFT*sizeof(ComplexNumber), p); //output A
141 DOL_write((void*)PORT_DATA_OUT_OL, &(p->local->Delayed_D[p->local->output_pointer][0]), NFFT*sizeof(ComplexNumber), p); //output D
147 // state switching every NFFT/2
150 //something is wrong with the logic! proceed to debug for now!
151 #if NUMBER_OF_RANGE_BINS > NFFT // This case, hold input till all output is sent (applies to all state switches)
153 if (!p->local->hold_input)
155 p->local->input_pointer = p->local->input_pointer + 1;
158 p->local->output_pointer = p->local->output_pointer + 1;
160 if (p->local->input_pointer == NFFT/2 - 1)
162 if(p->local->output_pointer < NUMBER_OF_RANGE_BINS)
164 p->local->hold_input = 1;
166 else // output_pointer == NUMBER OF RANGE BINS
168 p->local->input_pointer = 0;
169 p->local->output_pointer = 0;
170 p->local->hold_input = 0;
171 p->local->n_batches = p->local->n_batches + 1;
172 p->local->state = p->local->state + 1;
173 if (p->local->state > 3)
181 #elif NUMBER_OF_RANGE_BINS < NFFT //This is the case that we have to hold the output until we receive
183 p->local->input_pointer = p->local->input_pointer + 1;
185 if(!p->local->hold_output)
187 p->local->output_pointer = p->local->output_pointer + 1;
190 if (p->local->output_pointer >= NUMBER_OF_RANGE_BINS)
192 if (p->local->input_pointer < (NFFT/2 ) ) // ??? -1 ??
194 p->local->hold_output = 1 ;
198 p->local->input_pointer = 0;
199 p->local->output_pointer = 0;
200 p->local->hold_output = 0;
202 p->local->state = p->local->state + 1;
203 p->local->n_batches = p->local->n_batches + 1;
204 if (p->local->state > 3)
213 #else // This is the case that we have equal number of input and output iterations
214 p->local->input_pointer = p->local->input_pointer + 1;
215 p->local->output_pointer = p->local->output_pointer + 1;
217 if (p->local->input_pointer == NFFT/2 - 1)
219 p->local->input_pointer = 0;
220 p->local->n_batches = p->local->n_batches + 1;
221 p->local->state = p->local->state + 1;
222 if (p->local->state > 3)
228 if (p->local->output_pointer == NUMBER_OF_RANGE_BINS)
230 p->local->output_pointer = 0;
239 // !!!!!!!!!!!!!!!!1 check numbers! number of batches! I'm not sure!
240 if (p->local->n_batches == 2 * (NUMBER_OF_PULSES/NFFT)) // Check if all batches completed
242 p->local->n_batches = 0;
243 p->local->n_iterations = p->local->n_iterations + 1;
248 if (p->local->n_iterations == NUMBER_OF_ITERATIONS)
250 printf("\n\n:: Corner Turn with overlap process finished ::\n\n");
251 // printf("\ttotal number of executions: %d",p->local->excount);
266 // p->local->pulse_counter_in = p->local->pulse_counter_in + 1;
270 // if (p->local->pulse_counter_in == NFFT)
274 // p->local->pulse_counter_in = 0;
275 // p->local->bin_counter_in = p->local->bin_counter_in + 1;
277 // if (p->local->bin_counter_in == NUMBER_OF_RANGE_BINS)
279 // p->local->bin_counter_in = 0; // One batch (N Range bins * NFFT pulses) ready
283 // p->local->bin_counter_out = p->local->bin_counter_out + 1;
284 // if (p->local->bin_counter_out == NUMBER_OF_RANGE_BINS)
286 // p->local->bin_counter_out = 0;
287 // p->local->pulse_counter_out = p->local->pulse_counter_out + 1;
288 // if (p->local->pulse_counter_out == NFFT)
290 // p->local->pulse_counter_out = 0;
291 // p->local->buffer_mode = p->local->buffer_mode ^ 0x01; // Switch buffer mode
293 // p->local->n_batches = p->local->n_batches + 1;
294 // if (p->local->n_batches == (NUMBER_OF_PULSES/NFFT)) // Check if all batches completed
296 // p->local->n_batches = 0;
297 // p->local->n_iterations = p->local->n_iterations + 1;
302 // p->local->output_index = p->local->output_index + 1;
303 // if (p->local->output_index == NFFT/2)
305 // p->local->output_index = 0;