Attachment 'line07.c'
Download 1 // line07.c random spacings
2 // version 0.7 - constants fed in defines
3 //
4 // compile with gcc -o line07 line07.c -lm
5 //
6 // This computes the off-axis lobes for a 1 dimensional phased array
7 // normalized random spacing
8 //
9 // The array is NX points wide centered around x=0.
10 // The distance from the center of the array to a ground station is gy
11
12 // look at signal intensity along a line from X0 to X1
13
14 // Start with the simple minded assumption that all stations are
15 // phased from the ground receiver, with an (r,-i) component
16 // Then look at the change of intensity with distance.
17
18 #define DISTANCE 1
19 #undef DISTANCE
20
21 // -------------------- array definition --------------------------
22 // NX == number of cells in array
23 // #define NX 32
24 #define NX 128
25
26 // SX1 == base spacing
27 #define SX1 10.0
28
29 // SXF == random spread (uniform) in meters
30 // #define SXF 0.5
31 #define SXF 3.0
32
33 // number of random spreads from 0 to SXF
34 #define NSP 4
35
36 // SAM == amplitude increase, parabolic
37 // #define SAM -1.0
38 #define SAM 0.0
39
40 // wavelength
41 #define WL 0.008
42
43 // -------------------- ground spot --------------------------------
44
45 #define GY 6411000.0 // 6411km from m288 to equator
46 #define GX 0.0
47
48 // -------------------- ground sweep -------------------------------
49 #define THRESH 0.02
50
51 // -1000/5000
52 #define X0 -1000000.0
53 #define X1 5000000.0
54 #define NBINS 1201
55 #define NPTS_PER_BIN 4999 // odd to get center lobe
56
57 // -100/500
58 //#define X0 -100000.0
59 //#define X1 500000.0
60 //#define NBINS 1201
61 //#define NPTS_PER_BIN 499 // odd to get center lobe
62
63 // -10/50
64 //#define X0 -10000.0
65 //#define X1 50000.0
66 //#define NBINS 1201
67 //#define NPTS_PER_BIN 49 // odd to get center lobe
68
69 // -5/20
70 // #define X0 -5000.0
71 // #define X1 20000.0
72 // #define NBINS 1001
73 // #define NPTS_PER_BIN 49 // odd to get center lobe
74
75 // -1/1
76 //#define X0 -1000.0
77 //#define X1 1000.0
78 //#define NBINS 1001
79 //#define NPTS_PER_BIN 9 // odd to get center lobe
80
81 // 14/16
82 //#define X0 14000.0
83 //#define X1 16000.0
84 //#define NBINS 1001
85 //#define NPTS_PER_BIN 9 // odd to get center lobe
86
87
88 #include <stdio.h>
89 #include <stdlib.h>
90 #include <math.h>
91
92 // emitter array phase
93 double r[NX][NSP];
94 double i[NX][NSP];
95
96 main()
97 {
98 int ix ; // array index
99 int ir ; // random part index
100 double gx ; // swept ground position
101 double px ; //
102 double x1[NX][NSP] ; // distance component for x
103 double x0 ; // working distance from center
104 double xx ; // distance component for x
105 double x2 ; // squared distance component for x
106 double y1 ; // distance component for y
107 double y2 ; // squared distance component for y
108 double ran ; // accumulating random part
109 double xdd ;
110
111 double sumr ; // working sum per point
112 double sumi ; // working sum per point
113 double mag ; // power magnitude
114 double binmax ; // maximum sum per bin
115 double binmin ; // minimum sum per bin
116 double lbinmax ; // log maximum sum per bin
117 double lbinmin ; // log minimum sum per bin
118 double frac ; // fraction of sweep
119 double rp, ip ; // downlink path phase
120 int nbin, npt ; // ground index
121
122 double length ; // length of beam in wavelengths
123 double wavenum = 2.0 * 3.1415926535897932 / WL ; // wavenumber
124 double tmp ;
125
126 double s2 = 1.0 / ( (double) ( NBINS-1 ) ) ;
127 double s1 = 1.0 / ( (double) ( (NBINS-1)*( NPTS_PER_BIN ) ) ) ;
128 double s0 = 0.5 * ( s1 - s2 ) ;
129 double nx2 = 2.0 / ( NX - 1 ) ;
130 double sam = SAM * nx2 * nx2 ;
131 double am ;
132 double amsum ;
133
134 // first, compute emitter array from intended ground spot
135
136 ran = 0.0 ;
137 x0 = 0.5*SX1*(1-NX%2) ; // 0.5 if even, 0.0 if odd
138
139
140 // find the distances
141 for( ix=0 ; ix < NX/2 ; ix++ ) {
142 // array position with spreading
143 for( ir= 0 ; ir < NSP ; ir++ ) {
144 xdd = x0 + ran * ( (double) ir ) / ( (double) (NSP-1) ) ;
145 x1[NX/2+ix][ir] = GX + xdd ;
146 x1[NX/2-(ix+1)][ir] = GX - xdd ;
147 }
148 ran += SXF*(drand48()-0.5) ;
149 x0 += SX1 ;
150 }
151
152 // next, find the conjugate real and imaginary parts for each array
153
154 y1 = GY ;
155 y2 = y1*y1 ;
156 for ( ir=0 ; ir < NSP ; ir++ ) {
157 amsum=0.0 ;
158 for( ix=0 ; ix < NX ; ix++ ) {
159 x2 = x1[ix][ir]*x1[ix][ir] ; // distance squared
160 length = wavenum * sqrt( x2 + y2 );
161 px = ix + 0.5 * ( 1.0 - NX ) ;
162 am = 1.0 + sam * px * px ;
163 amsum += am ;
164 r[ix][ir] = am * cos( length ) ;
165 i[ix][ir] = -am * sin( length ) ;
166 }
167
168 // normalize
169 for( ix=0 ; ix < NX ; ix++ ) {
170 r[ix][ir] /= amsum ;
171 i[ix][ir] /= amsum ;
172 }
173 }
174
175 #ifdef DISTANCE
176 for( ix=0 ; ix < NX/2 ; ix++ ) {
177 printf("%12d",NX/2+ix );
178 for( ir= 0 ; ir < NSP ; ir++ ) {
179 printf("%8.2f", x1[NX/2+ix][ir] );
180 }
181 printf("\n" );
182 }
183
184 printf("\n");
185 printf("random scale");
186 for( ir= 0 ; ir < NSP ; ir++ ) {
187 xdd = SXF * ( (double) ir ) / ( (double) (NSP-1) ) ;
188 printf( "%8.3f", xdd );
189 }
190 printf("\n");
191 printf(" gx max(db)\n");
192 #endif //DISTANCE
193
194
195 // now, compute the traverse
196
197 for( nbin = 0 ; nbin < NBINS ; nbin++ ) {
198 frac = ((double)nbin )/(double)(NBINS-1) ;
199 gx = GX + X0 + frac*(X1-X0);
200 printf( "%12.2f", gx );
201
202 for ( ir=0 ; ir < NSP ; ir++ ) {
203 binmax = -1e30 ;
204 binmin = 1e30 ;
205 for( npt = 0 ; npt < NPTS_PER_BIN ; npt++ ) {
206 frac = s0 + s1*npt + s2*nbin ;
207 gx = GX + X0 + frac*(X1-X0) ;
208
209 sumr = 0.0 ;
210 sumi = 0.0 ;
211
212 // compute the signal sum at the ground from all the antennas
213
214 for( ix=0 ; ix < NX ; ix++ ) {
215 xx = gx + x1[ix][ir] ;
216 x2 = xx * xx ;
217 length = wavenum * sqrt( x2 + y2 );
218 rp = cos( length ) ;
219 ip = sin( length ) ;
220 sumr += rp*r[ix][ir] - ip*i[ix][ir] ;
221 sumi += ip*r[ix][ir] + rp*i[ix][ir] ;
222 }
223
224 mag = sumr*sumr + sumi*sumi ;
225 if ( binmax < mag ) binmax = mag ;
226 if ( binmin > mag ) binmin = mag ;
227 }
228
229 lbinmax = 10.0*(log(binmax)/log(10.0));
230
231 printf("%8.3f", lbinmax );
232 }
233 printf("\n");
234 fflush(stdout);
235 }
236 }
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.