1 // Copyright (c) <2012> <Leif Asbrink>
2 //
3 // Permission is hereby granted, free of charge, to any person
4 // obtaining a copy of this software and associated documentation
5 // files (the "Software"), to deal in the Software without restriction,
6 // including without limitation the rights to use, copy, modify,
7 // merge, publish, distribute, sublicense, and/or sell copies of
8 // the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16 // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
21 // OR OTHER DEALINGS IN THE SOFTWARE.
22
23
24 #include <unistd.h>
25 #include <string.h>
26 #include "globdef.h"
27 #include "uidef.h"
28 #include "fft1def.h"
29 #include "screendef.h"
30 #include "caldef.h"
31 #include "seldef.h"
32 #include "rusage.h"
33 #include "thrdef.h"
34 #include "options.h"
35
fix2_dspnames(char * s,int i)36 void fix2_dspnames(char *s,int i)
37 {
38 s[i]='c';
39 s[i+1]='o';
40 s[i+2]='r';
41 s[i+3]='r';
42 s[i+4]=0;
43 s[0]='d';
44 s[1]='s';
45 s[2]='p';
46 }
47
48
fix1_dspnames(char * s)49 int fix1_dspnames(char *s)
50 {
51 int i;
52 i=0;
53 while(rxpar_filenames[rx_mode][i] != 0)
54 {
55 s[i]=rxpar_filenames[rx_mode][i];
56 i++;
57 }
58 s[i]='_';
59 i++;
60 return i;
61 }
62
63
64
make_iqcorr_filename(char * s)65 void make_iqcorr_filename(char *s)
66 {
67 int i;
68 i=fix1_dspnames(s);
69 s[i]='i';
70 s[i+1]='q';
71 i+=2;
72 fix2_dspnames(s,i);
73 }
74
75
make_filfunc_filename(char * s)76 void make_filfunc_filename(char *s)
77 {
78 int i;
79 i=fix1_dspnames(s);
80 fix2_dspnames(s,i);
81 }
82
update_wg_waterf(void)83 void update_wg_waterf(void)
84 {
85 wg_waterf_ptr-=wg_xpixels;
86 if(wg_waterf_ptr < 0)wg_waterf_ptr+=wg_waterf_size;
87 wg_waterf_sum_counter=0;
88 }
89
fft1_waterfall(void)90 void fft1_waterfall(void)
91 {
92 int i,j,k,m,ix;
93 float der,t1,t2,y,yval;
94 while(fft1_sumsq_pwg != fft1_sumsq_pa )
95 {
96 j=fft1_sumsq_pwg+wg.first_xpoint;
97 for(i=wg_first_point; i <= wg_last_point; i++)
98 {
99 wg_waterf_sum[i]+=fft1_sumsq[j];
100 j++;
101 }
102 fft1_sumsq_pwg=(fft1_sumsq_pwg+fft1_size)&fft1_sumsq_mask;
103 wg_waterf_sum_counter+=wg.fft_avg1num;
104 if(wg_waterf_sum_counter >= wg.waterfall_avgnum)
105 {
106 // A new summed power spectrum has arrived.
107 // Convert it from linear power scale to log in units of 0.1dB.
108 // Expand or contract so we get the number of pixels that
109 // will fit on the screen.
110 // Store at the pos of our current line in waterfall
111 if(wg.xpoints_per_pixel == 1 || wg.pixels_per_xpoint == 1)
112 {
113 i=wg.first_xpoint;
114 for(ix=0; ix < wg_xpixels; ix++)
115 {
116 y=1000*(float)log10(wg_waterf_sum[i]*wg_waterf_yfac[i]);
117 if(y < -32767)y=-32767;
118 if(y>32767)y=32767;
119 wg_waterf[wg_waterf_ptr+ix]=(short int)y;
120 i++;
121 }
122 }
123 else
124 {
125 if(wg.xpoints_per_pixel == 0)
126 {
127 // There are more pixels than data points so we must interpolate.
128 y=1000*(float)log10(wg_waterf_sum[wg.first_xpoint]*
129 wg_waterf_yfac[wg.first_xpoint]);
130 yval=y;
131 if(y < -32767)y=-32767;
132 if(y>32767)y=32767;
133 wg_waterf[wg_waterf_ptr]=(short int)y;
134 i=wg.first_xpoint+1;
135 m=wg_xpixels-wg.pixels_per_xpoint;
136 for(ix=0; ix<m; ix+=wg.pixels_per_xpoint)
137 {
138 t1=1000*(float)log10(wg_waterf_sum[i]*wg_waterf_yfac[i]);
139 der=(t1-yval)/(float)wg.pixels_per_xpoint;
140 for(k=ix+1; k<=ix+wg.pixels_per_xpoint; k++)
141 {
142 yval=yval+der;
143 y=yval;
144 if(y < -32767)y=32767;
145 if(y>32767)y=32767;
146 wg_waterf[wg_waterf_ptr+k]=(short int)y;
147 }
148 yval=t1;
149 i++;
150 }
151 if(i < fft1_size)
152 {
153 t1=1000*(float)log10(wg_waterf_sum[i]*wg_waterf_yfac[i]);
154 der=(t1-yval)/(float)wg.pixels_per_xpoint;
155 for(k=ix+1; k<=ix+wg.pixels_per_xpoint; k++)
156 {
157 yval=yval+der;
158 y=yval;
159 if(y < -32767)y=32767;
160 if(y>32767)y=32767;
161 wg_waterf[wg_waterf_ptr+k]=(short int)y;
162 }
163 }
164 }
165 else
166 {
167 // There is more than one data point for each pixel.
168 // Pick the strongest bin. We want to enhance the visibility of
169 // frequency stable signal.
170 // Slide a triangular filter across the spectrum to make it
171 // smoother before resampling.
172 i=wg.first_xpoint;
173 for(ix=0; ix<wg_xpixels; ix++)
174 {
175 t1=0;
176 for(k=0; k<wg.xpoints_per_pixel; k++)
177 {
178 t2=wg_waterf_sum[i+k]*wg_waterf_yfac[i+k];
179 if(t2 >t1)t1=t2;
180 }
181 y=1000*(float)log10(t1);
182 if(y < -32767)y=-32767;
183 if(y>32767)y=32767;
184 wg_waterf[wg_waterf_ptr+ix]=(short int)y;
185 i+=wg.xpoints_per_pixel;
186 }
187 }
188 }
189 for(i=wg_first_point; i <= wg_last_point; i++)
190 {
191 // Set a very small value rather than zero to avoid errors
192 // due to sending zero into the log function.
193 wg_waterf_sum[i]=0.00001F;
194 }
195 update_wg_waterf();
196 }
197 }
198 }
199
fft1win_dif_one(int timf1p_ref,float * tmp)200 void fft1win_dif_one(int timf1p_ref, float *tmp)
201 {
202 int m, nn;
203 int p0, pa, pb, pa1, pb1;
204 int ia,ib;
205 float t1,t2,t3,t4;
206 float x1,x2;
207 nn=fft1_size/2;
208 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
209 {
210 m=timf1_bytemask/sizeof(short int);
211 p0=timf1p_ref/sizeof(short int);
212 p0=(p0-fft1_interleave_points*2+m+1)&m;
213 pa=p0;
214 pb=(pa+fft1_size)&m;
215 ib=fft1_size-2;
216 if(ui.sample_shift == 0)
217 {
218 if(genparm[FIRST_FFT_SINPOW] != 0)
219 {
220 for( ia=0; ia<nn; ia++)
221 {
222 t1=timf1_short_int[pa ]*fft1_window[2*ia];
223 t2=timf1_short_int[pa+1]*fft1_window[2*ia];
224 ib+=2;
225 t3=timf1_short_int[pb ]*fft1_window[2*ia+1];
226 t4=timf1_short_int[pb+1]*fft1_window[2*ia+1];
227 pa=(pa+2)&m;
228 x1=t1-t3;
229 tmp[2*ia ]= t1+t3;
230 x2=t4-t2;
231 tmp[2*ia+1]=-(t2+t4);
232 pb=(pb+2)&m;
233 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
234 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
235 }
236 }
237 else
238 {
239 for( ia=0; ia<nn; ia++)
240 {
241 t1=timf1_short_int[pa ];
242 ib+=2;
243 t2=timf1_short_int[pa+1];
244 t3=timf1_short_int[pb ];
245 t4=timf1_short_int[pb+1];
246 x1=t1-t3;
247 pa=(pa+2)&m;
248 x2=t4-t2;
249 tmp[2*ia ]= t1+t3;
250 tmp[2*ia+1]=-(t2+t4);
251 pb=(pb+2)&m;
252 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
253 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
254 }
255 }
256 }
257 else
258 {
259 if(ui.sample_shift < 0)
260 {
261 pa1=(pa+2*ui.sample_shift+m+1)&m;
262 pb1=(pa1+fft1_size)&m;
263 }
264 else
265 {
266 pa1=pa;
267 pb1=pb;
268 pa=(pa-2*ui.sample_shift+m+1)&m;
269 pb=(pb-2*ui.sample_shift+m+1)&m;
270 }
271 if(genparm[FIRST_FFT_SINPOW] != 0)
272 {
273 for( ia=0; ia<nn; ia++)
274 {
275 t1=timf1_short_int[pa ]*fft1_window[2*ia];
276 t2=timf1_short_int[pa1+1]*fft1_window[2*ia];
277 ib+=2;
278 t3=timf1_short_int[pb ]*fft1_window[2*ia+1];
279 t4=timf1_short_int[pb1+1]*fft1_window[2*ia+1];
280 pa=(pa+2)&m;
281 x1=t1-t3;
282 pb=(pb+2)&m;
283 tmp[2*ia ]= t1+t3;
284 x2=t4-t2;
285 pa1=(pa1+2)&m;
286 tmp[2*ia+1]=-(t2+t4);
287 pb1=(pb1+2)&m;
288 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
289 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
290 }
291 }
292 else
293 {
294 for( ia=0; ia<nn; ia++)
295 {
296 t1=timf1_short_int[pa ];
297 ib+=2;
298 t2=timf1_short_int[pa1+1];
299 t3=timf1_short_int[pb ];
300 pa=(pa+2)&m;
301 t4=timf1_short_int[pb1+1];
302 x1=t1-t3;
303 pb=(pb+2)&m;
304 x2=t4-t2;
305 tmp[2*ia ]= t1+t3;
306 pa1=(pa1+2)&m;
307 tmp[2*ia+1]=-(t2+t4);
308 pb1=(pb1+2)&m;
309 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
310 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
311 }
312 }
313 }
314 }
315 else
316 {
317 m=timf1_bytemask/sizeof(int);
318 p0=timf1p_ref/sizeof(int);
319 p0=(p0-fft1_interleave_points*2+m+1)&m;
320 pa=p0;
321 pb=(pa+fft1_size)&m;
322 ib=fft1_size-2;
323 if(ui.sample_shift == 0)
324 {
325 if(genparm[FIRST_FFT_SINPOW] != 0)
326 {
327 for( ia=0; ia<nn; ia++)
328 {
329 t1=timf1_int[pa ]*fft1_window[2*ia];
330 t2=timf1_int[pa+1]*fft1_window[2*ia];
331 ib+=2;
332 t3=timf1_int[pb ]*fft1_window[2*ia+1];
333 t4=timf1_int[pb+1]*fft1_window[2*ia+1];
334 pa=(pa+2)&m;
335 x1=t1-t3;
336 tmp[2*ia ]= t1+t3;
337 x2=t4-t2;
338 tmp[2*ia+1]=-(t2+t4);
339 pb=(pb+2)&m;
340 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
341 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
342 }
343 }
344 else
345 {
346 for( ia=0; ia<nn; ia++)
347 {
348 t1=timf1_int[pa ];
349 t2=timf1_int[pa+1];
350 ib+=2;
351 t3=timf1_int[pb ];
352 t4=timf1_int[pb+1];
353 pa=(pa+2)&m;
354 x1=t1-t3;
355 x2=t4-t2;
356 pb=(pb+2)&m;
357 tmp[2*ia ]= t1+t3;
358 tmp[2*ia+1]=-(t2+t4);
359 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
360 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
361 }
362 }
363 }
364 else
365 {
366 if(ui.sample_shift < 0)
367 {
368 pa1=(pa+2*ui.sample_shift+m+1)&m;
369 pb1=(pa1+fft1_size)&m;
370 }
371 else
372 {
373 pa1=pa;
374 pb1=pb;
375 pa=(pa-2*ui.sample_shift+m+1)&m;
376 pb=(pb-2*ui.sample_shift+m+1)&m;
377 }
378 if(genparm[FIRST_FFT_SINPOW] != 0)
379 {
380 for( ia=0; ia<nn; ia++)
381 {
382 t1=timf1_int[pa ]*fft1_window[2*ia];
383 t2=timf1_int[pa1+1]*fft1_window[2*ia];
384 ib+=2;
385 t3=timf1_int[pb ]*fft1_window[2*ia+1];
386 t4=timf1_int[pb1+1]*fft1_window[2*ia+1];
387 pa=(pa+2)&m;
388 x1=t1-t3;
389 pb=(pb+2)&m;
390 tmp[2*ia ]= t1+t3;
391 x2=t4-t2;
392 pa1=(pa1+2)&m;
393 tmp[2*ia+1]=-(t2+t4);
394 pb1=(pb1+2)&m;
395 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
396 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
397 }
398 }
399 else
400 {
401 for( ia=0; ia<nn; ia++)
402 {
403 t1=timf1_int[pa ];
404 t2=timf1_int[pa1+1];
405 ib+=2;
406 t3=timf1_int[pb ];
407 t4=timf1_int[pb1+1];
408 pa=(pa+2)&m;
409 x1=t1-t3;
410 x2=t4-t2;
411 pb=(pb+2)&m;
412 tmp[2*ia ]= t1+t3;
413 tmp[2*ia+1]=-(t2+t4);
414 pa1=(pa1+2)&m;
415 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
416 pb1=(pb1+2)&m;
417 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
418 }
419 }
420 }
421 }
422 }
423
dif_permute_one(float * out,float * tmp)424 void dif_permute_one(float *out, float *tmp)
425 {
426 int nn, ia, ib, ic;
427 nn=fft1_size;
428 for(ia=0; ia < nn; ia+=2)
429 {
430 ib=2*fft1_permute[ia];
431 ic=2*fft1_permute[ia+1];
432 out[ib ]=tmp[2*ia ]+tmp[2*ia+2];
433 out[ic ]=tmp[2*ia ]-tmp[2*ia+2];
434 out[ib+1]=tmp[2*ia+1]+tmp[2*ia+3];
435 out[ic+1]=tmp[2*ia+1]-tmp[2*ia+3];
436 }
437 }
438
439
dif_permute_chan(int chan,float * out,float * tmp)440 void dif_permute_chan(int chan, float *out, float *tmp)
441 {
442 int n, ia, ib, ic, pc;
443 n=fft1_size;
444 pc=2*chan;
445 for(ia=0; ia < n; ia+=2)
446 {
447 ib=pc+4*fft1_permute[ia];
448 ic=pc+4*fft1_permute[ia+1];
449 out[ib ]=tmp[2*ia ]+tmp[2*ia+2];
450 out[ic ]=tmp[2*ia ]-tmp[2*ia+2];
451 out[ib+1]=tmp[2*ia+1]+tmp[2*ia+3];
452 out[ic+1]=tmp[2*ia+1]-tmp[2*ia+3];
453 }
454 }
455
fft1win_dit_one(int timf1p_ref,float * out)456 void fft1win_dit_one(int timf1p_ref, float *out)
457 {
458 int j, m, nn;
459 int p0, pa, pa1;
460 int ia,ib,ic,id;
461 float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
462 int ja, jb, jc, jd;
463 float a1,a2;
464 float b1,b2;
465 float c1,c2;
466 float d1,d2;
467 nn=fft1_size;
468 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
469 {
470 m=timf1_bytemask/sizeof(short int);
471 p0=timf1p_ref/sizeof(short int);
472 p0=(p0-fft1_interleave_points*2+m+1)&m;
473 if(ui.sample_shift == 0)
474 {
475 if(genparm[FIRST_FFT_SINPOW] != 0)
476 {
477 for(j=0; j<nn; j+=4)
478 {
479 ja=fft1_permute[j ];
480 jb=fft1_permute[j+1];
481 jc=fft1_permute[j+2];
482 jd=fft1_permute[j+3];
483 ia=(p0+2*ja)&m;
484 ib=(p0+2*jb)&m;
485 ic=(p0+2*jc)&m;
486 id=(p0+2*jd)&m;
487 a1=fft1_window[ja]*timf1_short_int[ia ];
488 a2=fft1_window[ja]*timf1_short_int[ia+1];
489 b1=fft1_window[jb]*timf1_short_int[ib ];
490 b2=fft1_window[jb]*timf1_short_int[ib+1];
491 c1=fft1_window[jc]*timf1_short_int[ic ];
492 c2=fft1_window[jc]*timf1_short_int[ic+1];
493 d1=fft1_window[jd]*timf1_short_int[id ];
494 d2=fft1_window[jd]*timf1_short_int[id+1];
495 t1=a1+b1;
496 t2=a2+b2;
497 t3=c1+d1;
498 t4=c2+d2;
499 t5=a1-b1;
500 t7=a2-b2;
501 t10=c1-d1;
502 t6= c2-d2;
503 out[2*j ]=t1+t3;
504 out[2*j+1]=t2+t4;
505 out[2*j+4]=t1-t3;
506 out[2*j+5]=t2-t4;
507 t11=t5-t6;
508 t8=t7-t10;
509 t12=t5+t6;
510 t9=t7+t10;
511 out[2*j+2]=t12;
512 out[2*j+3]=t8;
513 out[2*j+6]=t11;
514 out[2*j+7]=t9;
515 }
516 }
517 else
518 {
519 for(j=0; j<nn; j+=4)
520 {
521 ia=(p0+2*fft1_permute[j ])&m;
522 ib=(p0+2*fft1_permute[j+1])&m;
523 ic=(p0+2*fft1_permute[j+2])&m;
524 id=(p0+2*fft1_permute[j+3])&m;
525 t1=(float)(timf1_short_int[ia ])+(float)(timf1_short_int[ib ]);
526 t2=(float)(timf1_short_int[ia+1])+(float)(timf1_short_int[ib+1]);
527 t3=(float)(timf1_short_int[ic ])+(float)(timf1_short_int[id ]);
528 t4=(float)(timf1_short_int[ic+1])+(float)(timf1_short_int[id+1]);
529 t5=(float)(timf1_short_int[ia ])-(float)(timf1_short_int[ib ]);
530 t7=(float)(timf1_short_int[ia+1])-(float)(timf1_short_int[ib+1]);
531 t10=(float)(timf1_short_int[ic ])-(float)(timf1_short_int[id ]);
532 t6= (float)(timf1_short_int[ic+1])-(float)(timf1_short_int[id+1]);
533 out[2*j ]=t1+t3;
534 out[2*j+1]=t2+t4;
535 out[2*j+4]=t1-t3;
536 out[2*j+5]=t2-t4;
537 t11=t5-t6;
538 t8=t7-t10;
539 t12=t5+t6;
540 t9=t7+t10;
541 out[2*j+2]=t12;
542 out[2*j+3]=t8;
543 out[2*j+6]=t11;
544 out[2*j+7]=t9;
545 }
546 }
547 }
548 else
549 {
550 if(ui.sample_shift < 0)
551 {
552 pa=p0;
553 pa1=(p0+2*ui.sample_shift+m+1)&m;
554 }
555 else
556 {
557 pa1=p0;
558 pa=(p0-2*ui.sample_shift+m+1)&m;
559 }
560 if(genparm[FIRST_FFT_SINPOW] != 0)
561 {
562 for(j=0; j<nn; j+=4)
563 {
564 ja=fft1_permute[j ];
565 jb=fft1_permute[j+1];
566 jc=fft1_permute[j+2];
567 jd=fft1_permute[j+3];
568 a1=fft1_window[ja]*timf1_short_int[((pa+2*ja)&m) ];
569 a2=fft1_window[ja]*timf1_short_int[((pa1+2*ja)&m)+1];
570 b1=fft1_window[jb]*timf1_short_int[((pa+2*jb)&m) ];
571 b2=fft1_window[jb]*timf1_short_int[((pa1+2*jb)&m)+1];
572 c1=fft1_window[jc]*timf1_short_int[((pa+2*jc)&m) ];
573 c2=fft1_window[jc]*timf1_short_int[((pa1+2*jc)&m)+1];
574 d1=fft1_window[jd]*timf1_short_int[((pa+2*jd)&m) ];
575 d2=fft1_window[jd]*timf1_short_int[((pa1+2*jd)&m)+1];
576 t1=a1+b1;
577 t2=a2+b2;
578 t3=c1+d1;
579 t4=c2+d2;
580 t5=a1-b1;
581 t7=a2-b2;
582 t10=c1-d1;
583 t6= c2-d2;
584 out[2*j ]=t1+t3;
585 out[2*j+1]=t2+t4;
586 out[2*j+4]=t1-t3;
587 out[2*j+5]=t2-t4;
588 t11=t5-t6;
589 t8=t7-t10;
590 t12=t5+t6;
591 t9=t7+t10;
592 out[2*j+2]=t12;
593 out[2*j+3]=t8;
594 out[2*j+6]=t11;
595 out[2*j+7]=t9;
596 }
597 }
598 else
599 {
600 for(j=0; j<nn; j+=4)
601 {
602 t1=(float)(timf1_short_int[((pa+2*fft1_permute[j ])&m) ])+
603 (float)(timf1_short_int[((pa+2*fft1_permute[j+1])&m) ]);
604 t2=(float)(timf1_short_int[((pa1+2*fft1_permute[j ])&m)+1])+
605 (float)(timf1_short_int[((pa1+2*fft1_permute[j+1])&m)+1]);
606 t3=(float)(timf1_short_int[((pa+2*fft1_permute[j+2])&m) ])+
607 (float)(timf1_short_int[((pa+2*fft1_permute[j+3])&m) ]);
608 t4=(float)(timf1_short_int[((pa1+2*fft1_permute[j+2])&m)+1])+
609 (float)(timf1_short_int[((pa1+2*fft1_permute[j+3])&m)+1]);
610 t5=(float)(timf1_short_int[((pa+2*fft1_permute[j ])&m) ])-
611 (float)(timf1_short_int[((pa+2*fft1_permute[j+1])&m) ]);
612 t7=(float)(timf1_short_int[((pa1+2*fft1_permute[j ])&m)+1])-
613 (float)(timf1_short_int[((pa1+2*fft1_permute[j+1])&m)+1]);
614 t10=(float)(timf1_short_int[((pa+2*fft1_permute[j+2])&m) ])-
615 (float)(timf1_short_int[((pa+2*fft1_permute[j+3])&m) ]);
616 t6= (float)(timf1_short_int[((pa1+2*fft1_permute[j+2])&m)+1])-
617 (float)(timf1_short_int[((pa1+2*fft1_permute[j+3])&m)+1]);
618 out[2*j ]=t1+t3;
619 out[2*j+1]=t2+t4;
620 out[2*j+4]=t1-t3;
621 out[2*j+5]=t2-t4;
622 t11=t5-t6;
623 t8=t7-t10;
624 t12=t5+t6;
625 t9=t7+t10;
626 out[2*j+2]=t12;
627 out[2*j+3]=t8;
628 out[2*j+6]=t11;
629 out[2*j+7]=t9;
630 }
631 }
632 }
633 }
634 else
635 {
636 m=timf1_bytemask/sizeof(int);
637 p0=timf1p_ref/sizeof(int);
638 p0=(p0-fft1_interleave_points*2+m+1)&m;
639 if(ui.sample_shift == 0)
640 {
641 if(genparm[FIRST_FFT_SINPOW] != 0)
642 {
643 for(j=0; j<nn; j+=4)
644 {
645 ja=fft1_permute[j ];
646 jb=fft1_permute[j+1];
647 jc=fft1_permute[j+2];
648 jd=fft1_permute[j+3];
649 ia=(p0+2*ja)&m;
650 ib=(p0+2*jb)&m;
651 ic=(p0+2*jc)&m;
652 id=(p0+2*jd)&m;
653 a1=fft1_window[ja]*timf1_int[ia ];
654 a2=fft1_window[ja]*timf1_int[ia+1];
655 b1=fft1_window[jb]*timf1_int[ib ];
656 b2=fft1_window[jb]*timf1_int[ib+1];
657 c1=fft1_window[jc]*timf1_int[ic ];
658 c2=fft1_window[jc]*timf1_int[ic+1];
659 d1=fft1_window[jd]*timf1_int[id ];
660 d2=fft1_window[jd]*timf1_int[id+1];
661 t1=a1+b1;
662 t2=a2+b2;
663 t3=c1+d1;
664 t4=c2+d2;
665 t5=a1-b1;
666 t7=a2-b2;
667 t10=c1-d1;
668 t6= c2-d2;
669 out[2*j ]=t1+t3;
670 out[2*j+1]=t2+t4;
671 out[2*j+4]=t1-t3;
672 out[2*j+5]=t2-t4;
673 t11=t5-t6;
674 t8=t7-t10;
675 t12=t5+t6;
676 t9=t7+t10;
677 out[2*j+2]=t12;
678 out[2*j+3]=t8;
679 out[2*j+6]=t11;
680 out[2*j+7]=t9;
681 }
682 }
683 else
684 {
685 for(j=0; j<nn; j+=4)
686 {
687 ia=(p0+2*fft1_permute[j ])&m;
688 ib=(p0+2*fft1_permute[j+1])&m;
689 ic=(p0+2*fft1_permute[j+2])&m;
690 id=(p0+2*fft1_permute[j+3])&m;
691 t1=(float)(timf1_int[ia ])+(float)(timf1_int[ib ]);
692 t2=(float)(timf1_int[ia+1])+(float)(timf1_int[ib+1]);
693 t3=(float)(timf1_int[ic ])+(float)(timf1_int[id ]);
694 t4=(float)(timf1_int[ic+1])+(float)(timf1_int[id+1]);
695 t5=(float)(timf1_int[ia ])-(float)(timf1_int[ib ]);
696 t7=(float)(timf1_int[ia+1])-(float)(timf1_int[ib+1]);
697 t10=(float)(timf1_int[ic ])-(float)(timf1_int[id ]);
698 t6= (float)(timf1_int[ic+1])-(float)(timf1_int[id+1]);
699 out[2*j ]=t1+t3;
700 out[2*j+1]=t2+t4;
701 out[2*j+4]=t1-t3;
702 out[2*j+5]=t2-t4;
703 t11=t5-t6;
704 t8=t7-t10;
705 t12=t5+t6;
706 t9=t7+t10;
707 out[2*j+2]=t12;
708 out[2*j+3]=t8;
709 out[2*j+6]=t11;
710 out[2*j+7]=t9;
711 }
712 }
713 }
714 else
715 {
716 if(ui.sample_shift < 0)
717 {
718 pa=p0;
719 pa1=(p0+2*ui.sample_shift+m+1)&m;
720 }
721 else
722 {
723 pa1=p0;
724 pa=(p0-2*ui.sample_shift+m+1)&m;
725 }
726 if(genparm[FIRST_FFT_SINPOW] != 0)
727 {
728 for(j=0; j<nn; j+=4)
729 {
730 ja=fft1_permute[j ];
731 jb=fft1_permute[j+1];
732 jc=fft1_permute[j+2];
733 jd=fft1_permute[j+3];
734 a1=fft1_window[ja]*timf1_int[(pa+2*ja)&m ];
735 a2=fft1_window[ja]*timf1_int[((pa1+2*ja)&m)+1];
736 b1=fft1_window[jb]*timf1_int[(pa+2*jb)&m ];
737 b2=fft1_window[jb]*timf1_int[((pa1+2*jb)&m) +1];
738 c1=fft1_window[jc]*timf1_int[(pa+2*jc)&m ];
739 c2=fft1_window[jc]*timf1_int[((pa1+2*jc)&m)+1];
740 d1=fft1_window[jd]*timf1_int[(pa+2*jd)&m ];
741 d2=fft1_window[jd]*timf1_int[((pa1+2*jd)&m)+1];
742 t1=a1+b1;
743 t2=a2+b2;
744 t3=c1+d1;
745 t4=c2+d2;
746 t5=a1-b1;
747 t7=a2-b2;
748 t10=c1-d1;
749 t6= c2-d2;
750 out[2*j ]=t1+t3;
751 out[2*j+1]=t2+t4;
752 out[2*j+4]=t1-t3;
753 out[2*j+5]=t2-t4;
754 t11=t5-t6;
755 t8=t7-t10;
756 t12=t5+t6;
757 t9=t7+t10;
758 out[2*j+2]=t12;
759 out[2*j+3]=t8;
760 out[2*j+6]=t11;
761 out[2*j+7]=t9;
762 }
763 }
764 else
765 {
766 for(j=0; j<nn; j+=4)
767 {
768 t1= (float)(timf1_int[((pa+2*fft1_permute[j ])&m) ])+
769 (float)(timf1_int[((pa+2*fft1_permute[j+1])&m) ]);
770 t2= (float)(timf1_int[((pa1+2*fft1_permute[j ])&m)+1])+
771 (float)(timf1_int[((pa1+2*fft1_permute[j+1])&m)+1]);
772 t3= (float)(timf1_int[((pa+2*fft1_permute[j+2])&m) ])+
773 (float)(timf1_int[((pa+2*fft1_permute[j+3])&m) ]);
774 t4= (float)(timf1_int[((pa1+2*fft1_permute[j+2])&m)+1])+
775 (float)(timf1_int[((pa1+2*fft1_permute[j+3])&m)+1]);
776 t5= (float)(timf1_int[((pa+2*fft1_permute[j ])&m) ])-
777 (float)(timf1_int[((pa+2*fft1_permute[j+1])&m) ]);
778 t6= (float)(timf1_int[((pa1+2*fft1_permute[j+2])&m)+1])-
779 (float)(timf1_int[((pa1+2*fft1_permute[j+3])&m)+1]);
780 t7= (float)(timf1_int[((pa1+2*fft1_permute[j ])&m)+1])-
781 (float)(timf1_int[((pa1+2*fft1_permute[j+1])&m)+1]);
782 t10=(float)(timf1_int[((pa+2*fft1_permute[j+2])&m) ])-
783 (float)(timf1_int[((pa+2*fft1_permute[j+3])&m) ]);
784 out[2*j ]=t1+t3;
785 out[2*j+1]=t2+t4;
786 out[2*j+4]=t1-t3;
787 out[2*j+5]=t2-t4;
788 t11=t5-t6;
789 t8=t7-t10;
790 t12=t5+t6;
791 t9=t7+t10;
792 out[2*j+2]=t12;
793 out[2*j+3]=t8;
794 out[2*j+6]=t11;
795 out[2*j+7]=t9;
796 }
797 }
798 }
799 }
800 }
801
fft1win_dit_one_real(int timf1p_ref,float * tmp)802 void fft1win_dit_one_real(int timf1p_ref, float *tmp)
803 {
804 int j, m, mm, nn;
805 int p0;
806 int ia,ib,ic,id;
807 float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
808 int ja, jb, jc, jd;
809 int ka, kb, kc, kd;
810 float a1,a2;
811 float b1,b2;
812 float c1,c2;
813 float d1,d2;
814 nn=2*fft1_size;
815 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
816 {
817 m=timf1_bytemask/sizeof(short int);
818 p0=timf1p_ref/sizeof(short int);
819 p0=(p0-4*fft1_interleave_points+m+1)&m;
820 mm=timf1_blockbytes/(2*sizeof(short int));
821 if(genparm[FIRST_FFT_SINPOW] != 0)
822 {
823 for(j=0; j<nn; j+=4)
824 {
825 ja=fft1_permute[j ];
826 jb=fft1_permute[j+1];
827 jc=fft1_permute[j+2];
828 jd=fft1_permute[j+3];
829 ia=(p0+ja)&m;
830 ib=(p0+jb)&m;
831 ic=(p0+jc)&m;
832 id=(p0+jd)&m;
833 ka=(mm+p0+ja)&m;
834 kb=(mm+p0+jb)&m;
835 kc=(mm+p0+jc)&m;
836 kd=(mm+p0+jd)&m;
837 a1=fft1_window[ja]*timf1_short_int[ia];
838 a2=fft1_window[ja]*timf1_short_int[ka];
839 b1=fft1_window[jb]*timf1_short_int[ib];
840 b2=fft1_window[jb]*timf1_short_int[kb];
841 c1=fft1_window[jc]*timf1_short_int[ic];
842 c2=fft1_window[jc]*timf1_short_int[kc];
843 d1=fft1_window[jd]*timf1_short_int[id];
844 d2=fft1_window[jd]*timf1_short_int[kd];
845 t1=a1+b1;
846 t2=a2+b2;
847 t3=c1+d1;
848 t4=c2+d2;
849 t5=a1-b1;
850 t7=a2-b2;
851 t10=c1-d1;
852 t6= c2-d2;
853
854 tmp[2*j ]=t1+t3;
855 tmp[2*j+1]=t2+t4;
856 tmp[2*j+4]=t1-t3;
857 tmp[2*j+5]=t2-t4;
858 t11=t5-t6;
859 t8=t7-t10;
860 t12=t5+t6;
861 t9=t7+t10;
862 tmp[2*j+2]=t12;
863 tmp[2*j+3]=t8;
864 tmp[2*j+6]=t11;
865 tmp[2*j+7]=t9;
866 }
867 }
868 else
869 {
870 for(j=0; j<nn; j+=4)
871 {
872 ia=(p0+fft1_permute[j ])&m;
873 ib=(p0+fft1_permute[j+1])&m;
874 ic=(p0+fft1_permute[j+2])&m;
875 id=(p0+fft1_permute[j+3])&m;
876 ka=(mm+ia)&m;
877 kb=(mm+ib)&m;
878 kc=(mm+ic)&m;
879 kd=(mm+id)&m;
880 t1=(float)(timf1_short_int[ia])+(float)(timf1_short_int[ib]);
881 t2=(float)(timf1_short_int[ka])+(float)(timf1_short_int[kb]);
882 t3=(float)(timf1_short_int[ic])+(float)(timf1_short_int[id]);
883 t4=(float)(timf1_short_int[kc])+(float)(timf1_short_int[kd]);
884 t5=(float)(timf1_short_int[ia])-(float)(timf1_short_int[ib]);
885 t7=(float)(timf1_short_int[ka])-(float)(timf1_short_int[kb]);
886 t10=(float)(timf1_short_int[ic])-(float)(timf1_short_int[id]);
887 t6= (float)(timf1_short_int[kc])-(float)(timf1_short_int[kd]);
888 tmp[2*j ]=t1+t3;
889 tmp[2*j+1]=t2+t4;
890 tmp[2*j+4]=t1-t3;
891 tmp[2*j+5]=t2-t4;
892 t11=t5-t6;
893 t8=t7-t10;
894 t12=t5+t6;
895 t9=t7+t10;
896 tmp[2*j+2]=t12;
897 tmp[2*j+3]=t8;
898 tmp[2*j+6]=t11;
899 tmp[2*j+7]=t9;
900 }
901 }
902 }
903 else
904 {
905 m=timf1_bytemask/sizeof(int);
906 p0=timf1p_ref/sizeof(int);
907 p0=(p0-4*fft1_interleave_points+m+1)&m;
908 mm=timf1_blockbytes/(2*sizeof(int));
909 if(genparm[FIRST_FFT_SINPOW] != 0)
910 {
911 for(j=0; j<nn; j+=4)
912 {
913 ja=fft1_permute[j ];
914 jb=fft1_permute[j+1];
915 jc=fft1_permute[j+2];
916 jd=fft1_permute[j+3];
917 ia=(p0+ja)&m;
918 ib=(p0+jb)&m;
919 ic=(p0+jc)&m;
920 id=(p0+jd)&m;
921 ka=(mm+p0+ja)&m;
922 kb=(mm+p0+jb)&m;
923 kc=(mm+p0+jc)&m;
924 kd=(mm+p0+jd)&m;
925 a1=fft1_window[ja]*timf1_int[ia];
926 a2=fft1_window[ja]*timf1_int[ka];
927 b1=fft1_window[jb]*timf1_int[ib];
928 b2=fft1_window[jb]*timf1_int[kb];
929 c1=fft1_window[jc]*timf1_int[ic];
930 c2=fft1_window[jc]*timf1_int[kc];
931 d1=fft1_window[jd]*timf1_int[id];
932 d2=fft1_window[jd]*timf1_int[kd];
933 t1=a1+b1;
934 t2=a2+b2;
935 t3=c1+d1;
936 t4=c2+d2;
937 t5=a1-b1;
938 t7=a2-b2;
939 t10=c1-d1;
940 t6= c2-d2;
941 tmp[2*j ]=t1+t3;
942 tmp[2*j+1]=t2+t4;
943 tmp[2*j+4]=t1-t3;
944 tmp[2*j+5]=t2-t4;
945 t11=t5-t6;
946 t8=t7-t10;
947 t12=t5+t6;
948 t9=t7+t10;
949 tmp[2*j+2]=t12;
950 tmp[2*j+3]=t8;
951 tmp[2*j+6]=t11;
952 tmp[2*j+7]=t9;
953 }
954 }
955 else
956 {
957 for(j=0; j<nn; j+=4)
958 {
959 ia=(p0+fft1_permute[j ])&m;
960 ib=(p0+fft1_permute[j+1])&m;
961 ic=(p0+fft1_permute[j+2])&m;
962 id=(p0+fft1_permute[j+3])&m;
963 ka=(mm+p0+fft1_permute[j ])&m;
964 kb=(mm+p0+fft1_permute[j+1])&m;
965 kc=(mm+p0+fft1_permute[j+2])&m;
966 kd=(mm+p0+fft1_permute[j+3])&m;
967 t1=(float)(timf1_int[ia])+(float)(timf1_int[ib]);
968 t2=(float)(timf1_int[ka])+(float)(timf1_int[kb]);
969 t3=(float)(timf1_int[ic])+(float)(timf1_int[id]);
970 t4=(float)(timf1_int[kc])+(float)(timf1_int[kd]);
971 t5=(float)(timf1_int[ia])-(float)(timf1_int[ib]);
972 t7=(float)(timf1_int[ka])-(float)(timf1_int[kb]);
973 t10=(float)(timf1_int[ic])-(float)(timf1_int[id]);
974 t6= (float)(timf1_int[kc])-(float)(timf1_int[kd]);
975 tmp[2*j ]=t1+t3;
976 tmp[2*j+1]=t2+t4;
977 tmp[2*j+4]=t1-t3;
978 tmp[2*j+5]=t2-t4;
979 t11=t5-t6;
980 t8=t7-t10;
981 t12=t5+t6;
982 t9=t7+t10;
983 tmp[2*j+2]=t12;
984 tmp[2*j+3]=t8;
985 tmp[2*j+6]=t11;
986 tmp[2*j+7]=t9;
987 }
988 }
989 }
990 }
991
fft1win_dit_one_dual_real(int timf1p_ref,float * tmp)992 void fft1win_dit_one_dual_real(int timf1p_ref, float *tmp)
993 {
994 int j, m, n, mm;
995 int p0;
996 int ia,ib,ic,id;
997 int ja,jb,jc,jd;
998 int ka,kb,kc,kd;
999 int la,lb,lc,ld;
1000 int ma,mb,mc,md;
1001 float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
1002 float r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12;
1003 float a1,a2,a3,a4;
1004 float b1,b2,b3,b4;
1005 float c1,c2,c3,c4;
1006 float d1,d2,d3,d4;
1007 n=2*fft1_size;
1008 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
1009 {
1010 m=timf1_bytemask/sizeof(short int);
1011 p0=timf1p_ref/sizeof(short int);
1012 mm=timf1_blockbytes/(4*sizeof(short int));
1013 p0=(p0-fft1_interleave_points*4+m+1)&m;
1014 if(genparm[FIRST_FFT_SINPOW] == 0)
1015 {
1016 for(j=0; j<n; j+=4)
1017 {
1018 ia=(p0+fft1_permute[j ])&m;
1019 ib=(p0+fft1_permute[j+1])&m;
1020 ic=(p0+fft1_permute[j+2])&m;
1021 id=(p0+fft1_permute[j+3])&m;
1022
1023 ka=(mm+p0+fft1_permute[j ])&m;
1024 kb=(mm+p0+fft1_permute[j+1])&m;
1025 kc=(mm+p0+fft1_permute[j+2])&m;
1026 kd=(mm+p0+fft1_permute[j+3])&m;
1027
1028 la=(2*mm+p0+fft1_permute[j ])&m;
1029 lb=(2*mm+p0+fft1_permute[j+1])&m;
1030 lc=(2*mm+p0+fft1_permute[j+2])&m;
1031 ld=(2*mm+p0+fft1_permute[j+3])&m;
1032
1033 ma=(3*mm+p0+fft1_permute[j ])&m;
1034 mb=(3*mm+p0+fft1_permute[j+1])&m;
1035 mc=(3*mm+p0+fft1_permute[j+2])&m;
1036 md=(3*mm+p0+fft1_permute[j+3])&m;
1037
1038 t1=(float)(timf1_short_int[ia])+(float)(timf1_short_int[ib]);
1039 t2=(float)(timf1_short_int[ka])+(float)(timf1_short_int[kb]);
1040 r1=(float)(timf1_short_int[la])+(float)(timf1_short_int[lb]);
1041 r2=(float)(timf1_short_int[ma])+(float)(timf1_short_int[mb]);
1042
1043 t3=(float)(timf1_short_int[ic])+(float)(timf1_short_int[id]);
1044 t4=(float)(timf1_short_int[kc])+(float)(timf1_short_int[kd]);
1045 r3=(float)(timf1_short_int[lc])+(float)(timf1_short_int[ld]);
1046 r4=(float)(timf1_short_int[mc])+(float)(timf1_short_int[md]);
1047
1048 t5=(float)(timf1_short_int[ia])-(float)(timf1_short_int[ib]);
1049 t7=(float)(timf1_short_int[ka])-(float)(timf1_short_int[kb]);
1050 r5=(float)(timf1_short_int[la])-(float)(timf1_short_int[lb]);
1051 r7=(float)(timf1_short_int[ma])-(float)(timf1_short_int[mb]);
1052
1053 t10=(float)(timf1_short_int[ic])-(float)(timf1_short_int[id]);
1054 t6= (float)(timf1_short_int[kc])-(float)(timf1_short_int[kd]);
1055 r10=(float)(timf1_short_int[lc])-(float)(timf1_short_int[ld]);
1056 r6= (float)(timf1_short_int[mc])-(float)(timf1_short_int[md]);
1057
1058 //r1=r2=r3=r4=r5=r7=r10=r6=0;
1059 //t1=t2=t3=t4=t5=t7=t10=t6=0;
1060 tmp[4*j ]=t1+t3;
1061 tmp[4*j+1]=t2+t4;
1062 tmp[4*j+2]=r1+r3;
1063 tmp[4*j+3]=r2+r4;
1064
1065 tmp[4*j+8]=t1-t3;
1066 tmp[4*j+9]=t2-t4;
1067 tmp[4*j+10]=r1-r3;
1068 tmp[4*j+11]=r2-r4;
1069
1070 t11=t5-t6;
1071 t8=t7-t10;
1072 r11=r5-r6;
1073 r8=r7-r10;
1074
1075 t12=t5+t6;
1076 t9=t7+t10;
1077 r12=r5+r6;
1078 r9=r7+r10;
1079
1080 tmp[4*j+4]=t12;
1081 tmp[4*j+5]=t8;
1082 tmp[4*j+6]=r12;
1083 tmp[4*j+7]=r8;
1084
1085 tmp[4*j+12]=t11;
1086 tmp[4*j+13]=t9;
1087 tmp[4*j+14]=r11;
1088 tmp[4*j+15]=r9;
1089 }
1090 }
1091 else
1092 {
1093 for(j=0; j<n; j+=4)
1094 {
1095 ja=fft1_permute[j ];
1096 jb=fft1_permute[j+1];
1097 jc=fft1_permute[j+2];
1098 jd=fft1_permute[j+3];
1099
1100 ia=(p0+ja)&m;
1101 ib=(p0+jb)&m;
1102 ic=(p0+jc)&m;
1103 id=(p0+jd)&m;
1104
1105 ka=(mm+p0+fft1_permute[j ])&m;
1106 kb=(mm+p0+fft1_permute[j+1])&m;
1107 kc=(mm+p0+fft1_permute[j+2])&m;
1108 kd=(mm+p0+fft1_permute[j+3])&m;
1109
1110 la=(2*mm+p0+fft1_permute[j ])&m;
1111 lb=(2*mm+p0+fft1_permute[j+1])&m;
1112 lc=(2*mm+p0+fft1_permute[j+2])&m;
1113 ld=(2*mm+p0+fft1_permute[j+3])&m;
1114
1115 ma=(3*mm+p0+fft1_permute[j ])&m;
1116 mb=(3*mm+p0+fft1_permute[j+1])&m;
1117 mc=(3*mm+p0+fft1_permute[j+2])&m;
1118 md=(3*mm+p0+fft1_permute[j+3])&m;
1119
1120 a1=fft1_window[ja]*timf1_short_int[ia];
1121 a2=fft1_window[ja]*timf1_short_int[ka];
1122 a3=fft1_window[ja]*timf1_short_int[la];
1123 a4=fft1_window[ja]*timf1_short_int[ma];
1124
1125 b1=fft1_window[jb]*timf1_short_int[ib];
1126 b2=fft1_window[jb]*timf1_short_int[kb];
1127 b3=fft1_window[jb]*timf1_short_int[lb];
1128 b4=fft1_window[jb]*timf1_short_int[mb];
1129
1130 c1=fft1_window[jc]*timf1_short_int[ic];
1131 c2=fft1_window[jc]*timf1_short_int[kc];
1132 c3=fft1_window[jc]*timf1_short_int[lc];
1133 c4=fft1_window[jc]*timf1_short_int[mc];
1134
1135 d1=fft1_window[jd]*timf1_short_int[id];
1136 d2=fft1_window[jd]*timf1_short_int[kd];
1137 d3=fft1_window[jd]*timf1_short_int[ld];
1138 d4=fft1_window[jd]*timf1_short_int[md];
1139
1140 t1=a1+b1;
1141 t2=a2+b2;
1142 r1=a3+b3;
1143 r2=a4+b4;
1144
1145 t5=a1-b1;
1146 t7=a2-b2;
1147 r5=a3-b3;
1148 r7=a4-b4;
1149
1150 t3=c1+d1;
1151 t4=c2+d2;
1152 r3=c3+d3;
1153 r4=c4+d4;
1154
1155 t10=c1-d1;
1156 t6= c2-d2;
1157 r10=c3-d3;
1158 r6= c4-d4;
1159
1160 tmp[4*j ]=t1+t3;
1161 tmp[4*j+1]=t2+t4;
1162 tmp[4*j+2]=r1+r3;
1163 tmp[4*j+3]=r2+r4;
1164
1165 tmp[4*j+8]=t1-t3;
1166 tmp[4*j+9]=t2-t4;
1167 tmp[4*j+10]=r1-r3;
1168 tmp[4*j+11]=r2-r4;
1169
1170 tmp[4*j+4]=t5+t6;
1171 tmp[4*j+5]=t7-t10;
1172 tmp[4*j+6]=r5+r6;
1173 tmp[4*j+7]=r7-r10;
1174
1175 tmp[4*j+12]=t5-t6;
1176 tmp[4*j+13]=t7+t10;
1177 tmp[4*j+14]=r5-r6;
1178 tmp[4*j+15]=r7+r10;
1179 }
1180 }
1181 }
1182 else
1183 {
1184 m=timf1_bytemask/sizeof(int);
1185 p0=timf1p_ref/sizeof(int);
1186 p0=(p0-fft1_interleave_points*4+m+1)&m;
1187 mm=timf1_blockbytes/(4*sizeof(int));
1188 if(genparm[FIRST_FFT_SINPOW] == 0)
1189 {
1190 for(j=0; j<n; j+=4)
1191 {
1192 ia=(p0+fft1_permute[j ])&m;
1193 ib=(p0+fft1_permute[j+1])&m;
1194 ic=(p0+fft1_permute[j+2])&m;
1195 id=(p0+fft1_permute[j+3])&m;
1196
1197 ka=(mm+p0+fft1_permute[j ])&m;
1198 kb=(mm+p0+fft1_permute[j+1])&m;
1199 kc=(mm+p0+fft1_permute[j+2])&m;
1200 kd=(mm+p0+fft1_permute[j+3])&m;
1201
1202 la=(2*mm+p0+fft1_permute[j ])&m;
1203 lb=(2*mm+p0+fft1_permute[j+1])&m;
1204 lc=(2*mm+p0+fft1_permute[j+2])&m;
1205 ld=(2*mm+p0+fft1_permute[j+3])&m;
1206
1207 ma=(3*mm+p0+fft1_permute[j ])&m;
1208 mb=(3*mm+p0+fft1_permute[j+1])&m;
1209 mc=(3*mm+p0+fft1_permute[j+2])&m;
1210 md=(3*mm+p0+fft1_permute[j+3])&m;
1211
1212 t1=(float)(timf1_int[ia])+(float)(timf1_int[ib]);
1213 t2=(float)(timf1_int[ka])+(float)(timf1_int[kb]);
1214 r1=(float)(timf1_int[la])+(float)(timf1_int[lb]);
1215 r2=(float)(timf1_int[ma])+(float)(timf1_int[mb]);
1216
1217 t3=(float)(timf1_int[ic])+(float)(timf1_int[id]);
1218 t4=(float)(timf1_int[kc])+(float)(timf1_int[kd]);
1219 r3=(float)(timf1_int[lc])+(float)(timf1_int[ld]);
1220 r4=(float)(timf1_int[mc])+(float)(timf1_int[md]);
1221
1222 t5=(float)(timf1_int[ia])-(float)(timf1_int[ib]);
1223 t7=(float)(timf1_int[ka])-(float)(timf1_int[kb]);
1224 r5=(float)(timf1_int[la])-(float)(timf1_int[lb]);
1225 r7=(float)(timf1_int[ma])-(float)(timf1_int[mb]);
1226
1227 t10=(float)(timf1_int[ic])-(float)(timf1_int[id]);
1228 t6= (float)(timf1_int[kc])-(float)(timf1_int[kd]);
1229 r10=(float)(timf1_int[lc])-(float)(timf1_int[ld]);
1230 r6= (float)(timf1_int[mc])-(float)(timf1_int[md]);
1231
1232 tmp[4*j ]=t1+t3;
1233 tmp[4*j+1]=t2+t4;
1234 tmp[4*j+2]=r1+r3;
1235 tmp[4*j+3]=r2+r4;
1236
1237 tmp[4*j+8]=t1-t3;
1238 tmp[4*j+9]=t2-t4;
1239 tmp[4*j+10]=r1-r3;
1240 tmp[4*j+11]=r2-r4;
1241
1242 t11=t5-t6;
1243 t8=t7-t10;
1244 r11=r5-r6;
1245 r8=r7-r10;
1246
1247 t12=t5+t6;
1248 t9=t7+t10;
1249 r12=r5+r6;
1250 r9=r7+r10;
1251
1252 tmp[4*j+4]=t12;
1253 tmp[4*j+5]=t8;
1254 tmp[4*j+6]=r12;
1255 tmp[4*j+7]=r8;
1256
1257 tmp[4*j+12]=t11;
1258 tmp[4*j+13]=t9;
1259 tmp[4*j+14]=r11;
1260 tmp[4*j+15]=r9;
1261 }
1262 }
1263 else
1264 {
1265 for(j=0; j<n; j+=4)
1266 {
1267 ja=fft1_permute[j ];
1268 jb=fft1_permute[j+1];
1269 jc=fft1_permute[j+2];
1270 jd=fft1_permute[j+3];
1271
1272 ia=(p0+ja)&m;
1273 ib=(p0+jb)&m;
1274 ic=(p0+jc)&m;
1275 id=(p0+jd)&m;
1276
1277 ka=(mm+p0+fft1_permute[j ])&m;
1278 kb=(mm+p0+fft1_permute[j+1])&m;
1279 kc=(mm+p0+fft1_permute[j+2])&m;
1280 kd=(mm+p0+fft1_permute[j+3])&m;
1281
1282 la=(2*mm+p0+fft1_permute[j ])&m;
1283 lb=(2*mm+p0+fft1_permute[j+1])&m;
1284 lc=(2*mm+p0+fft1_permute[j+2])&m;
1285 ld=(2*mm+p0+fft1_permute[j+3])&m;
1286
1287 ma=(3*mm+p0+fft1_permute[j ])&m;
1288 mb=(3*mm+p0+fft1_permute[j+1])&m;
1289 mc=(3*mm+p0+fft1_permute[j+2])&m;
1290 md=(3*mm+p0+fft1_permute[j+3])&m;
1291
1292 a1=fft1_window[ja]*timf1_int[ia];
1293 a2=fft1_window[ja]*timf1_int[ka];
1294 a3=fft1_window[ja]*timf1_int[la];
1295 a4=fft1_window[ja]*timf1_int[ma];
1296
1297 b1=fft1_window[jb]*timf1_int[ib];
1298 b2=fft1_window[jb]*timf1_int[kb];
1299 b3=fft1_window[jb]*timf1_int[lb];
1300 b4=fft1_window[jb]*timf1_int[mb];
1301
1302 c1=fft1_window[jc]*timf1_int[ic];
1303 c2=fft1_window[jc]*timf1_int[kc];
1304 c3=fft1_window[jc]*timf1_int[lc];
1305 c4=fft1_window[jc]*timf1_int[mc];
1306
1307 d1=fft1_window[jd]*timf1_int[id];
1308 d2=fft1_window[jd]*timf1_int[kd];
1309 d3=fft1_window[jd]*timf1_int[ld];
1310 d4=fft1_window[jd]*timf1_int[md];
1311
1312 t1=a1+b1;
1313 t2=a2+b2;
1314 r1=a3+b3;
1315 r2=a4+b4;
1316
1317 t3=c1+d1;
1318 t4=c2+d2;
1319 r3=c3+d3;
1320 r4=c4+d4;
1321
1322 t5=a1-b1;
1323 t7=a2-b2;
1324 r5=a3-b3;
1325 r7=a4-b4;
1326
1327 t10=c1-d1;
1328 t6= c2-d2;
1329 r10=c3-d3;
1330 r6= c4-d4;
1331
1332 tmp[4*j ]=t1+t3;
1333 tmp[4*j+1]=t2+t4;
1334 tmp[4*j+2]=r1+r3;
1335 tmp[4*j+3]=r2+r4;
1336
1337 tmp[4*j+8]=t1-t3;
1338 tmp[4*j+9]=t2-t4;
1339 tmp[4*j+10]=r1-r3;
1340 tmp[4*j+11]=r2-r4;
1341
1342 t11=t5-t6;
1343 t8=t7-t10;
1344 r11=r5-r6;
1345 r8=r7-r10;
1346
1347 t12=t5+t6;
1348 t9=t7+t10;
1349 r12=r5+r6;
1350 r9=r7+r10;
1351
1352 tmp[4*j+4]=t12;
1353 tmp[4*j+5]=t8;
1354 tmp[4*j+6]=r12;
1355 tmp[4*j+7]=r8;
1356
1357 tmp[4*j+12]=t11;
1358 tmp[4*j+13]=t9;
1359 tmp[4*j+14]=r11;
1360 tmp[4*j+15]=r9;
1361 }
1362 }
1363 }
1364 }
1365
1366
1367
fft1win_dif_chan(int chan,int timf1p_ref,float * tmp)1368 void fft1win_dif_chan(int chan, int timf1p_ref, float *tmp)
1369 {
1370 int m, nn;
1371 int p0, pa, pb;
1372 int ia,ib;
1373 float x1,x2;
1374 float t1,t2,t3,t4;
1375 nn=fft1_size/2;
1376 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
1377 {
1378 m=timf1_bytemask/sizeof(short int);
1379 p0=timf1p_ref/sizeof(short int);
1380 p0=(p0-fft1_interleave_points*4+m+1)&m;
1381 pa=(p0+2*chan)&m;
1382 pb=(pa+2*fft1_size)&m;
1383 ib=fft1_size-2;
1384 if(genparm[FIRST_FFT_SINPOW] != 0)
1385 {
1386 for( ia=0; ia<nn; ia++)
1387 {
1388 ib+=2;
1389 t1=timf1_short_int[pa ]*fft1_window[2*ia];
1390 t2=timf1_short_int[pa+1]*fft1_window[2*ia];
1391 t3=timf1_short_int[pb ]*fft1_window[2*ia+1];
1392 t4=timf1_short_int[pb+1]*fft1_window[2*ia+1];
1393 x1=t1-t3;
1394 tmp[2*ia ]= t1+t3;
1395 x2=t4-t2;
1396 tmp[2*ia+1]=-(t2+t4);
1397 pa=(pa+4)&m;
1398 pb=(pb+4)&m;
1399 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1400 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1401 }
1402 }
1403 else
1404 {
1405 for( ia=0; ia<nn; ia++)
1406 {
1407 t1=timf1_short_int[pa ];
1408 ib+=2;
1409 t2=timf1_short_int[pa+1];
1410 t3=timf1_short_int[pb ];
1411 t4=timf1_short_int[pb+1];
1412 x1=t1-t3;
1413 x2=t4-t2;
1414 tmp[2*ia ]= t1+t3;
1415 tmp[2*ia+1]=-(t2+t4);
1416 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1417 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1418 pa=(pa+4)&m;
1419 pb=(pb+4)&m;
1420 }
1421 }
1422 }
1423 else
1424 {
1425 m=timf1_bytemask/sizeof(int);
1426 p0=timf1p_ref/sizeof(int);
1427 p0=(p0-fft1_interleave_points*4+m+1)&m;
1428 pa=(p0+2*chan)&m;
1429 pb=(pa+2*fft1_size)&m;
1430 ib=fft1_size-2;
1431 if(genparm[FIRST_FFT_SINPOW] != 0)
1432 {
1433 for( ia=0; ia<nn; ia++)
1434 {
1435 t1=timf1_int[pa ]*fft1_window[2*ia];
1436 ib+=2;
1437 t2=timf1_int[pa+1]*fft1_window[2*ia];
1438 t3=timf1_int[pb ]*fft1_window[2*ia+1];
1439 t4=timf1_int[pb+1]*fft1_window[2*ia+1];
1440 x1=t1-t3;
1441 tmp[2*ia ]= t1+t3;
1442 x2=t4-t2;
1443 tmp[2*ia+1]=-(t2+t4);
1444 pa=(pa+4)&m;
1445 pb=(pb+4)&m;
1446 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1447 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1448 }
1449 }
1450 else
1451 {
1452 for( ia=0; ia<nn; ia++)
1453 {
1454 t1=timf1_int[pa ];
1455 ib+=2;
1456 t2=timf1_int[pa+1];
1457 t3=timf1_int[pb ];
1458 t4=timf1_int[pb+1];
1459 tmp[2*ia ]= t1+t3;
1460 x1=t1-t3;
1461 tmp[2*ia+1]=-(t2+t4);
1462 x2=t4-t2;
1463 pa=(pa+4)&m;
1464 pb=(pb+4)&m;
1465 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1466 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1467 }
1468 }
1469 }
1470 }
1471
fft1win_dif_two(int timf1p_ref,float * tmp)1472 void fft1win_dif_two(int timf1p_ref, float *tmp)
1473 {
1474 int m, p0, pa, pb, ia, ib, nn;
1475 float t1, t2, t3, t4, x1, x2;
1476 nn=fft1_size/2;
1477
1478 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
1479 {
1480 m=timf1_bytemask/sizeof(short int);
1481 p0=timf1p_ref/sizeof(short int);
1482 p0=(p0-fft1_interleave_points*4+m+1)&m;
1483 pa=p0;
1484 pb=(pa+2*fft1_size)&m;
1485 ib=2*fft1_size-4;
1486 if(genparm[FIRST_FFT_SINPOW] != 0)
1487 {
1488 for( ia=0; ia<nn; ia++)
1489 {
1490 t1=timf1_short_int[pa ]*fft1_window[2*ia];
1491 t2=timf1_short_int[pa+1]*fft1_window[2*ia];
1492 t3=timf1_short_int[pb ]*fft1_window[2*ia+1];
1493 t4=timf1_short_int[pb+1]*fft1_window[2*ia+1];
1494 ib+=4;
1495 x1=t1-t3;
1496 tmp[4*ia ]= t1+t3;
1497 x2=t4-t2;
1498 tmp[4*ia+1]=-(t2+t4);
1499 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1500 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1501 t1=timf1_short_int[pa+2]*fft1_window[2*ia];
1502 t2=timf1_short_int[pa+3]*fft1_window[2*ia];
1503 t3=timf1_short_int[pb+2]*fft1_window[2*ia+1];
1504 t4=timf1_short_int[pb+3]*fft1_window[2*ia+1];
1505 x1=t1-t3;
1506 tmp[4*ia+2]= t1+t3;
1507 x2=t4-t2;
1508 tmp[4*ia+3]=-(t2+t4);
1509 pa=(pa+4)&m;
1510 pb=(pb+4)&m;
1511 tmp[ib+2]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1512 tmp[ib+3]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1513 }
1514 }
1515 else
1516 {
1517 for( ia=0; ia<nn; ia++)
1518 {
1519 t1=timf1_short_int[pa ];
1520 t2=timf1_short_int[pa+1];
1521 t3=timf1_short_int[pb ];
1522 t4=timf1_short_int[pb+1];
1523 ib+=4;
1524 x1=t1-t3;
1525 tmp[4*ia ]= t1+t3;
1526 x2=t4-t2;
1527 tmp[4*ia+1]=-(t2+t4);
1528 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1529 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1530 t1=timf1_short_int[pa+2];
1531 t2=timf1_short_int[pa+3];
1532 t3=timf1_short_int[pb+2];
1533 t4=timf1_short_int[pb+3];
1534 x1=t1-t3;
1535 tmp[4*ia+2]= t1+t3;
1536 x2=t4-t2;
1537 tmp[4*ia+3]=-(t2+t4);
1538 pa=(pa+4)&m;
1539 pb=(pb+4)&m;
1540 tmp[ib+2]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1541 tmp[ib+3]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1542 }
1543 }
1544 }
1545 else
1546 {
1547 m=timf1_bytemask/sizeof(int);
1548 p0=timf1p_ref/sizeof(int);
1549 p0=(p0-fft1_interleave_points*4+m+1)&m;
1550 pa=p0;
1551 pb=(pa+2*fft1_size)&m;
1552 ib=2*fft1_size-4;
1553 if(genparm[FIRST_FFT_SINPOW] != 0)
1554 {
1555 for( ia=0; ia<nn; ia++)
1556 {
1557 t1=timf1_int[pa ]*fft1_window[2*ia];
1558 t2=timf1_int[pa+1]*fft1_window[2*ia];
1559 t3=timf1_int[pb ]*fft1_window[2*ia+1];
1560 t4=timf1_int[pb+1]*fft1_window[2*ia+1];
1561 ib+=4;
1562 x1=t1-t3;
1563 tmp[4*ia ]= t1+t3;
1564 x2=t4-t2;
1565 tmp[4*ia+1]=-(t2+t4);
1566 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1567 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1568 t1=timf1_int[pa+2]*fft1_window[2*ia];
1569 t2=timf1_int[pa+3]*fft1_window[2*ia];
1570 t3=timf1_int[pb+2]*fft1_window[2*ia+1];
1571 t4=timf1_int[pb+3]*fft1_window[2*ia+1];
1572 x1=t1-t3;
1573 tmp[4*ia+2]= t1+t3;
1574 x2=t4-t2;
1575 tmp[4*ia+3]=-(t2+t4);
1576 pa=(pa+4)&m;
1577 pb=(pb+4)&m;
1578 tmp[ib+2]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1579 tmp[ib+3]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1580 }
1581 }
1582 else
1583 {
1584 for( ia=0; ia<nn; ia++)
1585 {
1586 t1=timf1_int[pa ];
1587 t2=timf1_int[pa+1];
1588 t3=timf1_int[pb ];
1589 t4=timf1_int[pb+1];
1590 ib+=4;
1591 x1=t1-t3;
1592 tmp[4*ia ]= t1+t3;
1593 x2=t4-t2;
1594 tmp[4*ia+1]=-(t2+t4);
1595 tmp[ib ]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1596 tmp[ib+1]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1597 t1=timf1_int[pa+2];
1598 t2=timf1_int[pa+3];
1599 t3=timf1_int[pb+2];
1600 t4=timf1_int[pb+3];
1601 x1=t1-t3;
1602 tmp[4*ia+2]= t1+t3;
1603 x2=t4-t2;
1604 tmp[4*ia+3]=-(t2+t4);
1605 pa=(pa+4)&m;
1606 pb=(pb+4)&m;
1607 tmp[ib+2]=fft1tab[ia].cos*x1-fft1tab[ia].sin*x2;
1608 tmp[ib+3]=fft1tab[ia].sin*x1+fft1tab[ia].cos*x2;
1609 }
1610 }
1611 }
1612 }
1613
dif_permute_two(float * out,float * tmp)1614 void dif_permute_two(float *out, float * tmp)
1615 {
1616 int n, ia, ib, ic;
1617 n=fft1_size;
1618 for(ia=0; ia < n; ia+=2)
1619 {
1620 ib=4*fft1_permute[ia];
1621 ic=4*fft1_permute[ia+1];
1622 out[ib ]=tmp[4*ia ]+tmp[4*ia+4];
1623 out[ic ]=tmp[4*ia ]-tmp[4*ia+4];
1624 out[ib+1]=tmp[4*ia+1]+tmp[4*ia+5];
1625 out[ic+1]=tmp[4*ia+1]-tmp[4*ia+5];
1626 out[ib+2]=tmp[4*ia+2]+tmp[4*ia+6];
1627 out[ic+2]=tmp[4*ia+2]-tmp[4*ia+6];
1628 out[ib+3]=tmp[4*ia+3]+tmp[4*ia+7];
1629 out[ic+3]=tmp[4*ia+3]-tmp[4*ia+7];
1630 }
1631 }
1632
fft1win_dit_chan(int chan,int timf1p_ref,float * tmp)1633 void fft1win_dit_chan(int chan, int timf1p_ref, float *tmp)
1634 {
1635 int j, m, n;
1636 int p0;
1637 int ia,ib,ic,id;
1638 int ja,jb,jc,jd;
1639 float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
1640 float a1,a2;
1641 float b1,b2;
1642 float c1,c2;
1643 float d1,d2;
1644 n=fft1_size;
1645 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
1646 {
1647 m=timf1_bytemask/sizeof(short int);
1648 p0=timf1p_ref/sizeof(short int);
1649 p0=(p0-fft1_interleave_points*4+m+1+2*chan)&m;
1650 if(genparm[FIRST_FFT_SINPOW] == 0)
1651 {
1652 for(j=0; j<n; j+=4)
1653 {
1654 ia=(p0+4*fft1_permute[j ])&m;
1655 ib=(p0+4*fft1_permute[j+1])&m;
1656 ic=(p0+4*fft1_permute[j+2])&m;
1657 id=(p0+4*fft1_permute[j+3])&m;
1658
1659 t1=(float)(timf1_short_int[ia ])+(float)(timf1_short_int[ib ]);
1660 t2=(float)(timf1_short_int[ia+1])+(float)(timf1_short_int[ib+1]);
1661
1662 t3=(float)(timf1_short_int[ic ])+(float)(timf1_short_int[id ]);
1663 t4=(float)(timf1_short_int[ic+1])+(float)(timf1_short_int[id+1]);
1664
1665 t5=(float)(timf1_short_int[ia ])-(float)(timf1_short_int[ib ]);
1666 t7=(float)(timf1_short_int[ia+1])-(float)(timf1_short_int[ib+1]);
1667
1668 t10=(float)(timf1_short_int[ic ])-(float)(timf1_short_int[id ]);
1669 t6= (float)(timf1_short_int[ic+1])-(float)(timf1_short_int[id+1]);
1670
1671 tmp[2*j ]=t1+t3;
1672 tmp[2*j+1]=t2+t4;
1673
1674 tmp[2*j+4]=t1-t3;
1675 tmp[2*j+5]=t2-t4;
1676
1677 t11=t5-t6;
1678 t8=t7-t10;
1679
1680 t12=t5+t6;
1681 t9=t7+t10;
1682
1683 tmp[2*j+2]=t12;
1684 tmp[2*j+3]=t8;
1685
1686 tmp[2*j+6]=t11;
1687 tmp[2*j+7]=t9;
1688 }
1689 }
1690 else
1691 {
1692 for(j=0; j<n; j+=4)
1693 {
1694 ja=fft1_permute[j ];
1695 jb=fft1_permute[j+1];
1696 jc=fft1_permute[j+2];
1697 jd=fft1_permute[j+3];
1698
1699 ia=(p0+4*ja)&m;
1700 ib=(p0+4*jb)&m;
1701 ic=(p0+4*jc)&m;
1702 id=(p0+4*jd)&m;
1703
1704 a1=fft1_window[ja]*timf1_short_int[ia ];
1705 a2=fft1_window[ja]*timf1_short_int[ia+1];
1706
1707 b1=fft1_window[jb]*timf1_short_int[ib ];
1708 b2=fft1_window[jb]*timf1_short_int[ib+1];
1709
1710 c1=fft1_window[jc]*timf1_short_int[ic ];
1711 c2=fft1_window[jc]*timf1_short_int[ic+1];
1712
1713 d1=fft1_window[jd]*timf1_short_int[id ];
1714 d2=fft1_window[jd]*timf1_short_int[id+1];
1715
1716 t1=a1+b1;
1717 t2=a2+b2;
1718
1719 t3=c1+d1;
1720 t4=c2+d2;
1721
1722 t5=a1-b1;
1723 t7=a2-b2;
1724
1725 t10=c1-d1;
1726 t6= c2-d2;
1727
1728 tmp[2*j ]=t1+t3;
1729 tmp[2*j+1]=t2+t4;
1730
1731 tmp[2*j+4]=t1-t3;
1732 tmp[2*j+5]=t2-t4;
1733
1734 t11=t5-t6;
1735 t8=t7-t10;
1736
1737 t12=t5+t6;
1738 t9=t7+t10;
1739
1740 tmp[2*j+2]=t12;
1741 tmp[2*j+3]=t8;
1742
1743 tmp[2*j+6]=t11;
1744 tmp[2*j+7]=t9;
1745 }
1746 }
1747 }
1748 else
1749 {
1750 m=timf1_bytemask/sizeof(int);
1751 p0=timf1p_ref/sizeof(int);
1752 p0=(p0-fft1_interleave_points*4+m+1+2*chan)&m;
1753 if(genparm[FIRST_FFT_SINPOW] == 0)
1754 {
1755 for(j=0; j<n; j+=4)
1756 {
1757 ia=(p0+4*fft1_permute[j ])&m;
1758 ib=(p0+4*fft1_permute[j+1])&m;
1759 ic=(p0+4*fft1_permute[j+2])&m;
1760 id=(p0+4*fft1_permute[j+3])&m;
1761
1762 t1=(float)(timf1_int[ia ])+(float)(timf1_int[ib ]);
1763 t2=(float)(timf1_int[ia+1])+(float)(timf1_int[ib+1]);
1764
1765 t3=(float)(timf1_int[ic ])+(float)(timf1_int[id ]);
1766 t4=(float)(timf1_int[ic+1])+(float)(timf1_int[id+1]);
1767
1768 t5=(float)(timf1_int[ia ])-(float)(timf1_int[ib ]);
1769 t7=(float)(timf1_int[ia+1])-(float)(timf1_int[ib+1]);
1770
1771 t10=(float)(timf1_int[ic ])-(float)(timf1_int[id ]);
1772 t6= (float)(timf1_int[ic+1])-(float)(timf1_int[id+1]);
1773
1774 tmp[2*j ]=t1+t3;
1775 tmp[2*j+1]=t2+t4;
1776
1777 tmp[2*j+4]=t1-t3;
1778 tmp[2*j+5]=t2-t4;
1779
1780 t11=t5-t6;
1781 t8=t7-t10;
1782
1783 t12=t5+t6;
1784 t9=t7+t10;
1785
1786 tmp[2*j+2]=t12;
1787 tmp[2*j+3]=t8;
1788
1789 tmp[2*j+6]=t11;
1790 tmp[2*j+7]=t9;
1791 }
1792 }
1793 else
1794 {
1795 for(j=0; j<n; j+=4)
1796 {
1797 ja=fft1_permute[j ];
1798 jb=fft1_permute[j+1];
1799 jc=fft1_permute[j+2];
1800 jd=fft1_permute[j+3];
1801
1802 ia=(p0+4*ja)&m;
1803 ib=(p0+4*jb)&m;
1804 ic=(p0+4*jc)&m;
1805 id=(p0+4*jd)&m;
1806
1807 a1=fft1_window[ja]*timf1_int[ia ];
1808 a2=fft1_window[ja]*timf1_int[ia+1];
1809
1810 b1=fft1_window[jb]*timf1_int[ib ];
1811 b2=fft1_window[jb]*timf1_int[ib+1];
1812
1813 c1=fft1_window[jc]*timf1_int[ic ];
1814 c2=fft1_window[jc]*timf1_int[ic+1];
1815
1816 d1=fft1_window[jd]*timf1_int[id ];
1817 d2=fft1_window[jd]*timf1_int[id+1];
1818
1819 t1=a1+b1;
1820 t2=a2+b2;
1821
1822 t3=c1+d1;
1823 t4=c2+d2;
1824
1825 t5=a1-b1;
1826 t7=a2-b2;
1827
1828 t10=c1-d1;
1829 t6= c2-d2;
1830
1831 tmp[2*j ]=t1+t3;
1832 tmp[2*j+1]=t2+t4;
1833
1834 tmp[2*j+4]=t1-t3;
1835 tmp[2*j+5]=t2-t4;
1836
1837 t11=t5-t6;
1838 t8=t7-t10;
1839
1840 t12=t5+t6;
1841 t9=t7+t10;
1842
1843 tmp[2*j+2]=t12;
1844 tmp[2*j+3]=t8;
1845
1846 tmp[2*j+6]=t11;
1847 tmp[2*j+7]=t9;
1848 }
1849 }
1850 }
1851 }
1852
dit_finish_chan(int chan,float * out,float * tmp)1853 void dit_finish_chan (int chan, float *out, float *tmp)
1854 {
1855 int i, k, m;
1856 k=2*chan;
1857 m=2*fft1_size;
1858 for(i=0; i<m; i+=2)
1859 {
1860 out[k ]=tmp[i];
1861 out[k+1]=tmp[i+1];
1862 k+=4;
1863 }
1864 }
1865
fft1win_dit_two(int timf1p_ref,float * out)1866 void fft1win_dit_two(int timf1p_ref, float *out)
1867 {
1868 int j, m, n;
1869 int p0;
1870 int ia,ib,ic,id;
1871 int ja,jb,jc,jd;
1872 float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
1873 float r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12;
1874 float a1,a2,a3,a4;
1875 float b1,b2,b3,b4;
1876 float c1,c2,c3,c4;
1877 float d1,d2,d3,d4;
1878 n=fft1_size;
1879 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
1880 {
1881 m=timf1_bytemask/sizeof(short int);
1882 p0=timf1p_ref/sizeof(short int);
1883 p0=(p0-fft1_interleave_points*4+m+1)&m;
1884 ib=2*fft1_size-4;
1885 if(genparm[FIRST_FFT_SINPOW] == 0)
1886 {
1887 for(j=0; j<n; j+=4)
1888 {
1889 ia=(p0+4*fft1_permute[j ])&m;
1890 ib=(p0+4*fft1_permute[j+1])&m;
1891 ic=(p0+4*fft1_permute[j+2])&m;
1892 id=(p0+4*fft1_permute[j+3])&m;
1893
1894 t1=(float)(timf1_short_int[ia ])+(float)(timf1_short_int[ib ]);
1895 t2=(float)(timf1_short_int[ia+1])+(float)(timf1_short_int[ib+1]);
1896 r1=(float)(timf1_short_int[ia+2])+(float)(timf1_short_int[ib+2]);
1897 r2=(float)(timf1_short_int[ia+3])+(float)(timf1_short_int[ib+3]);
1898
1899 t3=(float)(timf1_short_int[ic ])+(float)(timf1_short_int[id ]);
1900 t4=(float)(timf1_short_int[ic+1])+(float)(timf1_short_int[id+1]);
1901 r3=(float)(timf1_short_int[ic+2])+(float)(timf1_short_int[id+2]);
1902 r4=(float)(timf1_short_int[ic+3])+(float)(timf1_short_int[id+3]);
1903
1904 t5=(float)(timf1_short_int[ia ])-(float)(timf1_short_int[ib ]);
1905 t7=(float)(timf1_short_int[ia+1])-(float)(timf1_short_int[ib+1]);
1906 r5=(float)(timf1_short_int[ia+2])-(float)(timf1_short_int[ib+2]);
1907 r7=(float)(timf1_short_int[ia+3])-(float)(timf1_short_int[ib+3]);
1908
1909 t10=(float)(timf1_short_int[ic ])-(float)(timf1_short_int[id ]);
1910 t6= (float)(timf1_short_int[ic+1])-(float)(timf1_short_int[id+1]);
1911 r10=(float)(timf1_short_int[ic+2])-(float)(timf1_short_int[id+2]);
1912 r6= (float)(timf1_short_int[ic+3])-(float)(timf1_short_int[id+3]);
1913
1914 out[4*j ]=t1+t3;
1915 out[4*j+1]=t2+t4;
1916 out[4*j+2]=r1+r3;
1917 out[4*j+3]=r2+r4;
1918
1919 out[4*j+8]=t1-t3;
1920 out[4*j+9]=t2-t4;
1921 out[4*j+10]=r1-r3;
1922 out[4*j+11]=r2-r4;
1923
1924 t11=t5-t6;
1925 t8=t7-t10;
1926 r11=r5-r6;
1927 r8=r7-r10;
1928
1929 t12=t5+t6;
1930 t9=t7+t10;
1931 r12=r5+r6;
1932 r9=r7+r10;
1933
1934 out[4*j+4]=t12;
1935 out[4*j+5]=t8;
1936 out[4*j+6]=r12;
1937 out[4*j+7]=r8;
1938
1939 out[4*j+12]=t11;
1940 out[4*j+13]=t9;
1941 out[4*j+14]=r11;
1942 out[4*j+15]=r9;
1943 }
1944 }
1945 else
1946 {
1947 for(j=0; j<n; j+=4)
1948 {
1949 ja=fft1_permute[j ];
1950 jb=fft1_permute[j+1];
1951 jc=fft1_permute[j+2];
1952 jd=fft1_permute[j+3];
1953
1954 ia=(p0+4*ja)&m;
1955 ib=(p0+4*jb)&m;
1956 ic=(p0+4*jc)&m;
1957 id=(p0+4*jd)&m;
1958
1959 a1=fft1_window[ja]*timf1_short_int[ia ];
1960 a2=fft1_window[ja]*timf1_short_int[ia+1];
1961 a3=fft1_window[ja]*timf1_short_int[ia+2];
1962 a4=fft1_window[ja]*timf1_short_int[ia+3];
1963
1964 b1=fft1_window[jb]*timf1_short_int[ib ];
1965 b2=fft1_window[jb]*timf1_short_int[ib+1];
1966 b3=fft1_window[jb]*timf1_short_int[ib+2];
1967 b4=fft1_window[jb]*timf1_short_int[ib+3];
1968
1969 c1=fft1_window[jc]*timf1_short_int[ic ];
1970 c2=fft1_window[jc]*timf1_short_int[ic+1];
1971 c3=fft1_window[jc]*timf1_short_int[ic+2];
1972 c4=fft1_window[jc]*timf1_short_int[ic+3];
1973
1974 d1=fft1_window[jd]*timf1_short_int[id ];
1975 d2=fft1_window[jd]*timf1_short_int[id+1];
1976 d3=fft1_window[jd]*timf1_short_int[id+2];
1977 d4=fft1_window[jd]*timf1_short_int[id+3];
1978
1979 t1=a1+b1;
1980 t2=a2+b2;
1981 r1=a3+b3;
1982 r2=a4+b4;
1983
1984 t3=c1+d1;
1985 t4=c2+d2;
1986 r3=c3+d3;
1987 r4=c4+d4;
1988
1989 t5=a1-b1;
1990 t7=a2-b2;
1991 r5=a3-b3;
1992 r7=a4-b4;
1993
1994 t10=c1-d1;
1995 t6= c2-d2;
1996 r10=c3-d3;
1997 r6= c4-d4;
1998
1999 out[4*j ]=t1+t3;
2000 out[4*j+1]=t2+t4;
2001 out[4*j+2]=r1+r3;
2002 out[4*j+3]=r2+r4;
2003
2004 out[4*j+8]=t1-t3;
2005 out[4*j+9]=t2-t4;
2006 out[4*j+10]=r1-r3;
2007 out[4*j+11]=r2-r4;
2008
2009 t11=t5-t6;
2010 t8=t7-t10;
2011 r11=r5-r6;
2012 r8=r7-r10;
2013
2014 t12=t5+t6;
2015 t9=t7+t10;
2016 r12=r5+r6;
2017 r9=r7+r10;
2018
2019 out[4*j+4]=t12;
2020 out[4*j+5]=t8;
2021 out[4*j+6]=r12;
2022 out[4*j+7]=r8;
2023
2024 out[4*j+12]=t11;
2025 out[4*j+13]=t9;
2026 out[4*j+14]=r11;
2027 out[4*j+15]=r9;
2028 }
2029 }
2030 }
2031 else
2032 {
2033 m=timf1_bytemask/sizeof(int);
2034 p0=timf1p_ref/sizeof(int);
2035 p0=(p0-fft1_interleave_points*4+m+1)&m;
2036 if(genparm[FIRST_FFT_SINPOW] == 0)
2037 {
2038 for(j=0; j<n; j+=4)
2039 {
2040 ia=(p0+4*fft1_permute[j ])&m;
2041 ib=(p0+4*fft1_permute[j+1])&m;
2042 ic=(p0+4*fft1_permute[j+2])&m;
2043 id=(p0+4*fft1_permute[j+3])&m;
2044
2045 t1=(float)(timf1_int[ia ])+(float)(timf1_int[ib ]);
2046 t2=(float)(timf1_int[ia+1])+(float)(timf1_int[ib+1]);
2047 r1=(float)(timf1_int[ia+2])+(float)(timf1_int[ib+2]);
2048 r2=(float)(timf1_int[ia+3])+(float)(timf1_int[ib+3]);
2049
2050 t3=(float)(timf1_int[ic ])+(float)(timf1_int[id ]);
2051 t4=(float)(timf1_int[ic+1])+(float)(timf1_int[id+1]);
2052 r3=(float)(timf1_int[ic+2])+(float)(timf1_int[id+2]);
2053 r4=(float)(timf1_int[ic+3])+(float)(timf1_int[id+3]);
2054
2055 t5=(float)(timf1_int[ia ])-(float)(timf1_int[ib ]);
2056 t7=(float)(timf1_int[ia+1])-(float)(timf1_int[ib+1]);
2057 r5=(float)(timf1_int[ia+2])-(float)(timf1_int[ib+2]);
2058 r7=(float)(timf1_int[ia+3])-(float)(timf1_int[ib+3]);
2059
2060 t10=(float)(timf1_int[ic ])-(float)(timf1_int[id ]);
2061 t6= (float)(timf1_int[ic+1])-(float)(timf1_int[id+1]);
2062 r10=(float)(timf1_int[ic+2])-(float)(timf1_int[id+2]);
2063 r6= (float)(timf1_int[ic+3])-(float)(timf1_int[id+3]);
2064
2065 out[4*j ]=t1+t3;
2066 out[4*j+1]=t2+t4;
2067 out[4*j+2]=r1+r3;
2068 out[4*j+3]=r2+r4;
2069
2070 out[4*j+8]=t1-t3;
2071 out[4*j+9]=t2-t4;
2072 out[4*j+10]=r1-r3;
2073 out[4*j+11]=r2-r4;
2074
2075 t11=t5-t6;
2076 t8=t7-t10;
2077 r11=r5-r6;
2078 r8=r7-r10;
2079
2080 t12=t5+t6;
2081 t9=t7+t10;
2082 r12=r5+r6;
2083 r9=r7+r10;
2084
2085 out[4*j+4]=t12;
2086 out[4*j+5]=t8;
2087 out[4*j+6]=r12;
2088 out[4*j+7]=r8;
2089
2090 out[4*j+12]=t11;
2091 out[4*j+13]=t9;
2092 out[4*j+14]=r11;
2093 out[4*j+15]=r9;
2094 }
2095 }
2096 else
2097 {
2098 for(j=0; j<n; j+=4)
2099 {
2100 ja=fft1_permute[j ];
2101 jb=fft1_permute[j+1];
2102 jc=fft1_permute[j+2];
2103 jd=fft1_permute[j+3];
2104
2105 ia=(p0+4*ja)&m;
2106 ib=(p0+4*jb)&m;
2107 ic=(p0+4*jc)&m;
2108 id=(p0+4*jd)&m;
2109
2110 a1=fft1_window[ja]*timf1_int[ia ];
2111 a2=fft1_window[ja]*timf1_int[ia+1];
2112 a3=fft1_window[ja]*timf1_int[ia+2];
2113 a4=fft1_window[ja]*timf1_int[ia+3];
2114
2115 b1=fft1_window[jb]*timf1_int[ib ];
2116 b2=fft1_window[jb]*timf1_int[ib+1];
2117 b3=fft1_window[jb]*timf1_int[ib+2];
2118 b4=fft1_window[jb]*timf1_int[ib+3];
2119
2120 c1=fft1_window[jc]*timf1_int[ic ];
2121 c2=fft1_window[jc]*timf1_int[ic+1];
2122 c3=fft1_window[jc]*timf1_int[ic+2];
2123 c4=fft1_window[jc]*timf1_int[ic+3];
2124
2125 d1=fft1_window[jd]*timf1_int[id ];
2126 d2=fft1_window[jd]*timf1_int[id+1];
2127 d3=fft1_window[jd]*timf1_int[id+2];
2128 d4=fft1_window[jd]*timf1_int[id+3];
2129
2130 t1=a1+b1;
2131 t2=a2+b2;
2132 r1=a3+b3;
2133 r2=a4+b4;
2134
2135 t3=c1+d1;
2136 t4=c2+d2;
2137 r3=c3+d3;
2138 r4=c4+d4;
2139
2140 t5=a1-b1;
2141 t7=a2-b2;
2142 r5=a3-b3;
2143 r7=a4-b4;
2144
2145 t10=c1-d1;
2146 t6= c2-d2;
2147 r10=c3-d3;
2148 r6= c4-d4;
2149
2150 out[4*j ]=t1+t3;
2151 out[4*j+1]=t2+t4;
2152 out[4*j+2]=r1+r3;
2153 out[4*j+3]=r2+r4;
2154
2155 out[4*j+8]=t1-t3;
2156 out[4*j+9]=t2-t4;
2157 out[4*j+10]=r1-r3;
2158 out[4*j+11]=r2-r4;
2159
2160 t11=t5-t6;
2161 t8=t7-t10;
2162 r11=r5-r6;
2163 r8=r7-r10;
2164
2165 t12=t5+t6;
2166 t9=t7+t10;
2167 r12=r5+r6;
2168 r9=r7+r10;
2169
2170 out[4*j+4]=t12;
2171 out[4*j+5]=t8;
2172 out[4*j+6]=r12;
2173 out[4*j+7]=r8;
2174
2175 out[4*j+12]=t11;
2176 out[4*j+13]=t9;
2177 out[4*j+14]=r11;
2178 out[4*j+15]=r9;
2179 }
2180 }
2181 }
2182 }
2183
fft1win_dit_one_dual(int timf1p_ref,float * out)2184 void fft1win_dit_one_dual(int timf1p_ref, float *out)
2185 {
2186 int j, m, n, nn;
2187 int p0;
2188 int ia,ib,ic,id;
2189 int ka,kb,kc,kd;
2190 int ja,jb,jc,jd;
2191 float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
2192 float r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12;
2193 float a1,a2,a3,a4;
2194 float b1,b2,b3,b4;
2195 float c1,c2,c3,c4;
2196 float d1,d2,d3,d4;
2197 n=fft1_size;
2198 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
2199 {
2200 m=timf1_bytemask/sizeof(short int);
2201 p0=timf1p_ref/sizeof(short int);
2202 nn=timf1_blockbytes/(2*sizeof(short int));
2203 p0=(p0-fft1_interleave_points*4+m+1)&m;
2204 ib=2*fft1_size-4;
2205 if(genparm[FIRST_FFT_SINPOW] == 0)
2206 {
2207 for(j=0; j<n; j+=4)
2208 {
2209 ia=(p0+2*fft1_permute[j ])&m;
2210 ib=(p0+2*fft1_permute[j+1])&m;
2211 ic=(p0+2*fft1_permute[j+2])&m;
2212 id=(p0+2*fft1_permute[j+3])&m;
2213
2214 ja=(nn+p0+2*fft1_permute[j ])&m;
2215 jb=(nn+p0+2*fft1_permute[j+1])&m;
2216 jc=(nn+p0+2*fft1_permute[j+2])&m;
2217 jd=(nn+p0+2*fft1_permute[j+3])&m;
2218
2219 t1=(float)(timf1_short_int[ia ])+(float)(timf1_short_int[ib ]);
2220 t2=(float)(timf1_short_int[ia+1])+(float)(timf1_short_int[ib+1]);
2221 r1=(float)(timf1_short_int[ja ])+(float)(timf1_short_int[jb ]);
2222 r2=(float)(timf1_short_int[ja+1])+(float)(timf1_short_int[jb+1]);
2223
2224 t3=(float)(timf1_short_int[ic ])+(float)(timf1_short_int[id ]);
2225 t4=(float)(timf1_short_int[ic+1])+(float)(timf1_short_int[id+1]);
2226 r3=(float)(timf1_short_int[jc ])+(float)(timf1_short_int[jd ]);
2227 r4=(float)(timf1_short_int[jc+1])+(float)(timf1_short_int[jd+1]);
2228
2229 t5=(float)(timf1_short_int[ia ])-(float)(timf1_short_int[ib ]);
2230 t7=(float)(timf1_short_int[ia+1])-(float)(timf1_short_int[ib+1]);
2231 r5=(float)(timf1_short_int[ja ])-(float)(timf1_short_int[jb ]);
2232 r7=(float)(timf1_short_int[ja+1])-(float)(timf1_short_int[jb+1]);
2233
2234 t10=(float)(timf1_short_int[ic ])-(float)(timf1_short_int[id ]);
2235 t6= (float)(timf1_short_int[ic+1])-(float)(timf1_short_int[id+1]);
2236 r10=(float)(timf1_short_int[jc ])-(float)(timf1_short_int[jd ]);
2237 r6= (float)(timf1_short_int[jc+1])-(float)(timf1_short_int[jd+1]);
2238
2239 out[4*j ]=t1+t3;
2240 out[4*j+1]=t2+t4;
2241 out[4*j+2]=r1+r3;
2242 out[4*j+3]=r2+r4;
2243
2244 out[4*j+8]=t1-t3;
2245 out[4*j+9]=t2-t4;
2246 out[4*j+10]=r1-r3;
2247 out[4*j+11]=r2-r4;
2248
2249 t11=t5-t6;
2250 t8=t7-t10;
2251 r11=r5-r6;
2252 r8=r7-r10;
2253
2254 t12=t5+t6;
2255 t9=t7+t10;
2256 r12=r5+r6;
2257 r9=r7+r10;
2258
2259 out[4*j+4]=t12;
2260 out[4*j+5]=t8;
2261 out[4*j+6]=r12;
2262 out[4*j+7]=r8;
2263
2264 out[4*j+12]=t11;
2265 out[4*j+13]=t9;
2266 out[4*j+14]=r11;
2267 out[4*j+15]=r9;
2268 }
2269 }
2270 else
2271 {
2272 for(j=0; j<n; j+=4)
2273 {
2274 ja=fft1_permute[j ];
2275 jb=fft1_permute[j+1];
2276 jc=fft1_permute[j+2];
2277 jd=fft1_permute[j+3];
2278
2279 ia=(p0+2*ja)&m;
2280 ib=(p0+2*jb)&m;
2281 ic=(p0+2*jc)&m;
2282 id=(p0+2*jd)&m;
2283
2284 ka=(nn+p0+2*ja)&m;
2285 kb=(nn+p0+2*jb)&m;
2286 kc=(nn+p0+2*jc)&m;
2287 kd=(nn+p0+2*jd)&m;
2288
2289 a1=fft1_window[ja]*timf1_short_int[ia ];
2290 a2=fft1_window[ja]*timf1_short_int[ia+1];
2291 a3=fft1_window[ja]*timf1_short_int[ka ];
2292 a4=fft1_window[ja]*timf1_short_int[ka+1];
2293
2294 b1=fft1_window[jb]*timf1_short_int[ib ];
2295 b2=fft1_window[jb]*timf1_short_int[ib+1];
2296 b3=fft1_window[jb]*timf1_short_int[kb ];
2297 b4=fft1_window[jb]*timf1_short_int[kb+1];
2298
2299 c1=fft1_window[jc]*timf1_short_int[ic ];
2300 c2=fft1_window[jc]*timf1_short_int[ic+1];
2301 c3=fft1_window[jc]*timf1_short_int[kc ];
2302 c4=fft1_window[jc]*timf1_short_int[kc+1];
2303
2304 d1=fft1_window[jd]*timf1_short_int[id ];
2305 d2=fft1_window[jd]*timf1_short_int[id+1];
2306 d3=fft1_window[jd]*timf1_short_int[kd ];
2307 d4=fft1_window[jd]*timf1_short_int[kd+1];
2308
2309 t1=a1+b1;
2310 t2=a2+b2;
2311 r1=a3+b3;
2312 r2=a4+b4;
2313
2314 t3=c1+d1;
2315 t4=c2+d2;
2316 r3=c3+d3;
2317 r4=c4+d4;
2318
2319 t5=a1-b1;
2320 t7=a2-b2;
2321 r5=a3-b3;
2322 r7=a4-b4;
2323
2324 t10=c1-d1;
2325 t6= c2-d2;
2326 r10=c3-d3;
2327 r6= c4-d4;
2328
2329 out[4*j ]=t1+t3;
2330 out[4*j+1]=t2+t4;
2331 out[4*j+2]=r1+r3;
2332 out[4*j+3]=r2+r4;
2333
2334 out[4*j+8]=t1-t3;
2335 out[4*j+9]=t2-t4;
2336 out[4*j+10]=r1-r3;
2337 out[4*j+11]=r2-r4;
2338
2339 t11=t5-t6;
2340 t8=t7-t10;
2341 r11=r5-r6;
2342 r8=r7-r10;
2343
2344 t12=t5+t6;
2345 t9=t7+t10;
2346 r12=r5+r6;
2347 r9=r7+r10;
2348
2349 out[4*j+4]=t12;
2350 out[4*j+5]=t8;
2351 out[4*j+6]=r12;
2352 out[4*j+7]=r8;
2353
2354 out[4*j+12]=t11;
2355 out[4*j+13]=t9;
2356 out[4*j+14]=r11;
2357 out[4*j+15]=r9;
2358 }
2359 }
2360 }
2361 else
2362 {
2363 m=timf1_bytemask/sizeof(int);
2364 p0=timf1p_ref/sizeof(int);
2365 nn=timf1_blockbytes/(2*sizeof(int));
2366 p0=(p0-fft1_interleave_points*4+m+1)&m;
2367 if(genparm[FIRST_FFT_SINPOW] == 0)
2368 {
2369 for(j=0; j<n; j+=4)
2370 {
2371 ia=(p0+2*fft1_permute[j ])&m;
2372 ib=(p0+2*fft1_permute[j+1])&m;
2373 ic=(p0+2*fft1_permute[j+2])&m;
2374 id=(p0+2*fft1_permute[j+3])&m;
2375
2376 ja=(nn+p0+2*fft1_permute[j ])&m;
2377 jb=(nn+p0+2*fft1_permute[j+1])&m;
2378 jc=(nn+p0+2*fft1_permute[j+2])&m;
2379 jd=(nn+p0+2*fft1_permute[j+3])&m;
2380
2381 t1=(float)(timf1_int[ia ])+(float)(timf1_int[ib ]);
2382 t2=(float)(timf1_int[ia+1])+(float)(timf1_int[ib+1]);
2383 r1=(float)(timf1_int[ja ])+(float)(timf1_int[jb ]);
2384 r2=(float)(timf1_int[ja+1])+(float)(timf1_int[jb+1]);
2385
2386 t3=(float)(timf1_int[ic ])+(float)(timf1_int[id ]);
2387 t4=(float)(timf1_int[ic+1])+(float)(timf1_int[id+1]);
2388 r3=(float)(timf1_int[jc ])+(float)(timf1_int[jd ]);
2389 r4=(float)(timf1_int[jc+1])+(float)(timf1_int[jd+1]);
2390
2391 t5=(float)(timf1_int[ia ])-(float)(timf1_int[ib ]);
2392 t7=(float)(timf1_int[ia+1])-(float)(timf1_int[ib+1]);
2393 r5=(float)(timf1_int[ja ])-(float)(timf1_int[jb ]);
2394 r7=(float)(timf1_int[ja+1])-(float)(timf1_int[jb+1]);
2395
2396 t10=(float)(timf1_int[ic ])-(float)(timf1_int[id ]);
2397 t6= (float)(timf1_int[ic+1])-(float)(timf1_int[id+1]);
2398 r10=(float)(timf1_int[jc ])-(float)(timf1_int[jd ]);
2399 r6= (float)(timf1_int[jc+1])-(float)(timf1_int[jd+1]);
2400
2401 out[4*j ]=t1+t3;
2402 out[4*j+1]=t2+t4;
2403 out[4*j+2]=r1+r3;
2404 out[4*j+3]=r2+r4;
2405
2406 out[4*j+8]=t1-t3;
2407 out[4*j+9]=t2-t4;
2408 out[4*j+10]=r1-r3;
2409 out[4*j+11]=r2-r4;
2410
2411 t11=t5-t6;
2412 t8=t7-t10;
2413 r11=r5-r6;
2414 r8=r7-r10;
2415
2416 t12=t5+t6;
2417 t9=t7+t10;
2418 r12=r5+r6;
2419 r9=r7+r10;
2420
2421 out[4*j+4]=t12;
2422 out[4*j+5]=t8;
2423 out[4*j+6]=r12;
2424 out[4*j+7]=r8;
2425
2426 out[4*j+12]=t11;
2427 out[4*j+13]=t9;
2428 out[4*j+14]=r11;
2429 out[4*j+15]=r9;
2430 }
2431 }
2432 else
2433 {
2434 for(j=0; j<n; j+=4)
2435 {
2436 ja=fft1_permute[j ];
2437 jb=fft1_permute[j+1];
2438 jc=fft1_permute[j+2];
2439 jd=fft1_permute[j+3];
2440
2441 ia=(p0+2*ja)&m;
2442 ib=(p0+2*jb)&m;
2443 ic=(p0+2*jc)&m;
2444 id=(p0+2*jd)&m;
2445
2446 ka=(nn+p0+2*ja)&m;
2447 kb=(nn+p0+2*jb)&m;
2448 kc=(nn+p0+2*jc)&m;
2449 kd=(nn+p0+2*jd)&m;
2450
2451 a1=fft1_window[ja]*timf1_int[ia ];
2452 a2=fft1_window[ja]*timf1_int[ia+1];
2453 a3=fft1_window[ja]*timf1_int[ka ];
2454 a4=fft1_window[ja]*timf1_int[ka+1];
2455
2456 b1=fft1_window[jb]*timf1_int[ib ];
2457 b2=fft1_window[jb]*timf1_int[ib+1];
2458 b3=fft1_window[jb]*timf1_int[kb ];
2459 b4=fft1_window[jb]*timf1_int[kb+1];
2460
2461 c1=fft1_window[jc]*timf1_int[ic ];
2462 c2=fft1_window[jc]*timf1_int[ic+1];
2463 c3=fft1_window[jc]*timf1_int[kc ];
2464 c4=fft1_window[jc]*timf1_int[kc+1];
2465
2466 d1=fft1_window[jd]*timf1_int[id ];
2467 d2=fft1_window[jd]*timf1_int[id+1];
2468 d3=fft1_window[jd]*timf1_int[kd ];
2469 d4=fft1_window[jd]*timf1_int[kd+1];
2470
2471 t1=a1+b1;
2472 t2=a2+b2;
2473 r1=a3+b3;
2474 r2=a4+b4;
2475
2476 t3=c1+d1;
2477 t4=c2+d2;
2478 r3=c3+d3;
2479 r4=c4+d4;
2480
2481 t5=a1-b1;
2482 t7=a2-b2;
2483 r5=a3-b3;
2484 r7=a4-b4;
2485
2486 t10=c1-d1;
2487 t6= c2-d2;
2488 r10=c3-d3;
2489 r6= c4-d4;
2490
2491 out[4*j ]=t1+t3;
2492 out[4*j+1]=t2+t4;
2493 out[4*j+2]=r1+r3;
2494 out[4*j+3]=r2+r4;
2495
2496 out[4*j+8]=t1-t3;
2497 out[4*j+9]=t2-t4;
2498 out[4*j+10]=r1-r3;
2499 out[4*j+11]=r2-r4;
2500
2501 t11=t5-t6;
2502 t8=t7-t10;
2503 r11=r5-r6;
2504 r8=r7-r10;
2505
2506 t12=t5+t6;
2507 t9=t7+t10;
2508 r12=r5+r6;
2509 r9=r7+r10;
2510
2511 out[4*j+4]=t12;
2512 out[4*j+5]=t8;
2513 out[4*j+6]=r12;
2514 out[4*j+7]=r8;
2515
2516 out[4*j+12]=t11;
2517 out[4*j+13]=t9;
2518 out[4*j+14]=r11;
2519 out[4*j+15]=r9;
2520 }
2521 }
2522 }
2523 }
2524
2525
fft1_b(int timf1p_ref,float * out,float * tmp)2526 void fft1_b(int timf1p_ref, float *out, float *tmp)
2527 {
2528 int i,j;
2529 int chan, k, m, ia, ib, ic;
2530 float t1,t2,t3,t4;
2531 //float *z;
2532 int pc;
2533 if(ui.rx_rf_channels==1)
2534 {
2535 switch (FFT1_CURMODE)
2536 {
2537 case 0:
2538 // Twin Radix 4 DIT SIMD
2539 #if CPU == CPU_INTEL
2540 fft1win_dit_one_dual(timf1p_ref, tmp);
2541 /*
2542 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
2543 {
2544 if(genparm[FIRST_FFT_SINPOW] == 0)
2545 {
2546 simd1_16_nowin_dual();
2547 }
2548 else
2549 {
2550 simd1_16_win_dual();
2551 }
2552 }
2553 else
2554 {
2555 if(genparm[FIRST_FFT_SINPOW] == 0)
2556 {
2557 simd1_32_nowin_dual();
2558 }
2559 else
2560 {
2561 simd1_32_win_dual();
2562 }
2563 }
2564 */
2565 simdbulk_of_dual_dit(fft1_size, fft1_n, tmp, fft1tab);
2566 for(i=0; i<fft1_size; i++)
2567 {
2568 out[2*i ]=tmp[4*i ];
2569 out[2*i+1]=tmp[4*i+1];
2570 out[2*fft1_size+2*i ]=tmp[4*i+2];
2571 out[2*fft1_size+2*i+1]=tmp[4*i+3];
2572 }
2573 #else
2574 lirerr(998546);
2575 #endif
2576 break;
2577
2578 case 1:
2579 // Twin Radix 4 DIT C real
2580 fft1win_dit_one_real(timf1p_ref, tmp);
2581 bulk_of_dit(2*fft1_size, fft1_n+1, tmp, fft1tab, yieldflag_wdsp_fft1);
2582 for(i=1; i<fft1_size; i++)
2583 {
2584 j=2*fft1_size-i;
2585 out[2*fft1_size-2*i ]=(tmp[2*i ]+tmp[2*j ]);
2586 out[2*fft1_size-2*i+1]=-(tmp[2*i+1]-tmp[2*j+1]);
2587 out[2*fft1_size+fft1_block-2*i ]=-(tmp[2*i+1]+tmp[2*j+1]);
2588 out[2*fft1_size+fft1_block-2*i+1]=-(tmp[2*i ]-tmp[2*j ]);
2589 }
2590 out[0]=tmp[2*fft1_size];
2591 out[1]=tmp[0];
2592 out[fft1_block ]=-tmp[2*fft1_size+1];
2593 out[fft1_block+1]=tmp[1];
2594 break;
2595
2596 case 2:
2597 // Split radix DIT C real
2598 fft1_reherm_dit_one(timf1p_ref, out, tmp);
2599 goto fft_done;
2600
2601 case 3:
2602 // Quad Radix 4 DIT C real
2603 fft1win_dit_one_dual_real(timf1p_ref,tmp);
2604 bulk_of_dual_dit(2*fft1_size, fft1_n+1, tmp, fft1tab, yieldflag_wdsp_fft1);
2605 for(i=1; i<fft1_size; i++)
2606 {
2607 j=2*fft1_size-i;
2608 out[2*fft1_size-2*i ]= (tmp[4*i ]+tmp[4*j ]);
2609 out[2*fft1_size-2*i+1]= -(tmp[4*i+1]-tmp[4*j+1]);
2610 out[2*fft1_size+fft1_block-2*i ]= -(tmp[4*i+1]+tmp[4*j+1]);
2611 out[2*fft1_size+fft1_block-2*i+1]= -(tmp[4*i ]-tmp[4*j ]);
2612 out[2*fft1_size+2*fft1_block-2*i ]= (tmp[4*i+2]+tmp[4*j+2]);
2613 out[2*fft1_size+2*fft1_block-2*i+1]=-(tmp[4*i+3]-tmp[4*j+3]);
2614 out[2*fft1_size+3*fft1_block-2*i ]=-(tmp[4*i+3]+tmp[4*j+3]);
2615 out[2*fft1_size+3*fft1_block-2*i+1]=-(tmp[4*i+2]-tmp[4*j+2]);
2616 }
2617 out[0]=tmp[4*fft1_size];
2618 out[1]=tmp[0];
2619 out[fft1_block ]=-tmp[4*fft1_size+1];
2620 out[fft1_block+1]=tmp[1];
2621 out[2*fft1_block ]=tmp[4*fft1_size+2];
2622 out[2*fft1_block+1]=tmp[2];
2623 out[3*fft1_block ]=-tmp[4*fft1_size+3];
2624 out[3*fft1_block+1]=tmp[3];
2625 break;
2626
2627 case 4:
2628 // Quad Radix 4 DIT SIMD real
2629 // Use qt0(0) and qt3() to get average timing for code sections
2630 // Press Z to clear averages.
2631 #if CPU == CPU_INTEL
2632 // Do real to complex for a single channel by computing four
2633 // transforms in parallel.
2634 //qt0();
2635 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
2636 {
2637 if(genparm[FIRST_FFT_SINPOW] == 0)
2638 {
2639 // The SIMD assembly routine is just a little faster than the C routine
2640 // so we use it - but only on 32 bit systems.
2641 #if IA64 == 0
2642 simd1_16_nowin_real(timf1p_ref, tmp);
2643 #else
2644 fft1win_dit_one_dual_real(timf1p_ref, tmp);
2645 #endif
2646 }
2647 else
2648 {
2649 // The difference between SIMD assembly and plain C is very small here!!!
2650 // it seems SIMD is just a little faster than C.
2651 #if IA64 == 0
2652 simd1_16_win_real(timf1p_ref, tmp);
2653 #else
2654 fft1win_dit_one_dual_real(timf1p_ref, tmp);
2655 #endif
2656 }
2657 }
2658 else
2659 {
2660 if(genparm[FIRST_FFT_SINPOW] == 0)
2661 {
2662 // Assembly not properly implemented. High speed 32 bit hardware will most
2663 // probably not be available in a very long time.
2664 fft1win_dit_one_dual_real(timf1p_ref, tmp);
2665 // simd1_32_nowin_real();
2666 }
2667 else
2668 {
2669 // Assembly not properly implemented. High speed 32 bit hardware will most
2670 // probably not be available in a very long time.
2671 fft1win_dit_one_dual_real(timf1p_ref, tmp);
2672 // simd1_32_win_real();
2673 }
2674 }
2675 simdbulk_of_dual_dit(2*fft1_size, fft1_n+1, tmp, fft1tab);
2676 #else
2677 lirerr(988546);
2678 #endif
2679 j=2*fft1_size-1;
2680 for(i=1; i<fft1_size; i++)
2681 {
2682 out[2*fft1_size-2*i ]= (tmp[4*i ]+tmp[4*j ]);
2683 out[2*fft1_size-2*i+1]= -(tmp[4*i+1]-tmp[4*j+1]);
2684 out[2*fft1_size+fft1_block-2*i ]= -(tmp[4*i+1]+tmp[4*j+1]);
2685 out[2*fft1_size+fft1_block-2*i+1]= -(tmp[4*i ]-tmp[4*j ]);
2686 out[2*fft1_size+2*fft1_block-2*i ]= (tmp[4*i+2]+tmp[4*j+2]);
2687 out[2*fft1_size+2*fft1_block-2*i+1]=-(tmp[4*i+3]-tmp[4*j+3]);
2688 out[2*fft1_size+3*fft1_block-2*i ]=-(tmp[4*i+3]+tmp[4*j+3]);
2689 out[2*fft1_size+3*fft1_block-2*i+1]=-(tmp[4*i+2]-tmp[4*j+2]);
2690 j--;
2691 }
2692 out[0]=tmp[4*fft1_size];
2693 out[1]=tmp[0];
2694 out[fft1_block ]=-tmp[4*fft1_size+1];
2695 out[fft1_block+1]=tmp[1];
2696 out[2*fft1_block ]=tmp[4*fft1_size+2];
2697 out[2*fft1_block+1]=tmp[2];
2698 out[3*fft1_block ]=-tmp[4*fft1_size+3];
2699 out[3*fft1_block+1]=tmp[3];
2700 //qt3();
2701 break;
2702
2703 case 5:
2704 // Twin Radix 4 DIT
2705 fft1win_dit_one_dual(timf1p_ref, tmp);
2706 bulk_of_dual_dit(fft1_size, fft1_n, tmp, fft1tab, yieldflag_wdsp_fft1);
2707 for(i=0; i<fft1_size; i++)
2708 {
2709 out[2*i ]=tmp[4*i ];
2710 out[2*i+1]=tmp[4*i+1];
2711 out[2*fft1_size+2*i ]=tmp[4*i+2];
2712 out[2*fft1_size+2*i+1]=tmp[4*i+3];
2713 }
2714 break;
2715
2716 case 6:
2717 // Radix 4 DIT C
2718 fft1win_dit_one(timf1p_ref, out);
2719 bulk_of_dit(fft1_size, fft1_n, out, fft1tab, yieldflag_wdsp_fft1);
2720 break;
2721
2722 case 7:
2723 // Radix 2 DIF C
2724 fft1win_dif_one(timf1p_ref, tmp);
2725 bulk_of_dif(fft1_size, fft1_n, tmp, fft1tab, yieldflag_wdsp_fft1);
2726 dif_permute_one(out, tmp);
2727 break;
2728
2729 case 8:
2730 // Radix 2 DIF ASM
2731 fft1win_dif_one(timf1p_ref, tmp);
2732 #if IA64 == 0 && CPU == CPU_INTEL
2733 asmbulk_of_dif(fft1_size, fft1_n, tmp, fft1tab, yieldflag_wdsp_fft1);
2734 #else
2735 lirerr(1232345);
2736 #endif
2737 dif_permute_one(out, tmp);
2738 break;
2739
2740 default:
2741 fprintf( stderr,"\nFFT1_CURMODE= %d",FFT1_CURMODE);
2742 return;
2743 }
2744 if( (ui.network_flag & NET_RXIN_TIMF2) != 0)
2745 {
2746 if(ui.rx_addev_no != NETWORK_DEVICE_CODE)
2747 {
2748 lirerr(1319);
2749 return;
2750 }
2751 // The timf2 mode is only for testing networks. The spectrum could
2752 // be rearranged by use of a different set of permute tables, but there
2753 // are several fft implementations so doing it here was easier.
2754 k=fft1_size/2;
2755 for(ia=0; ia < k; ia++)
2756 {
2757 t1=out[2*ia ];
2758 t2=out[2*ia+1];
2759 out[2*ia ]=out[2*(ia+k) ];
2760 out[2*ia+1]=out[2*(ia+k)+1];
2761 out[2*(ia+k) ]=t1;
2762 out[2*(ia+k)+1]=t2;
2763 }
2764 }
2765 pc=0;
2766 m=fft1_first_sym_point;
2767 if(m==0)m=1;
2768 ib=m;
2769 ic=fft1_size-m;
2770 k=fft1_size/2;
2771 if( (fft1_calibrate_flag&CALIQ)==CALIQ)
2772 {
2773 // In direct conversion mode it is not possible to get perfect amplitude
2774 // and phase relations between the two channels in the analog circuitry.
2775 // As a result the signal has a mirror image that can be expected in the
2776 // -40dB region for 1% analog filter components.
2777 // The image is removed by the below section that orthogonalises the
2778 // signal and it's mirror using data obtained in a hardware calibration
2779 // process.
2780 if(fft1_direction > 0)
2781 {
2782 for(ia=m; ia < k; ia++)
2783 {
2784 t1= out[2*ib ] * fft1_foldcorr[2*ia ]
2785 - out[2*ib+1] * fft1_foldcorr[2*ia+1];
2786 t2= out[2*ib ] * fft1_foldcorr[2*ia+1]
2787 + out[2*ib+1] * fft1_foldcorr[2*ia ];
2788 out[2*ib ] -= out[2*ic ] * fft1_foldcorr[2*ic ]
2789 + out[2*ic+1] * fft1_foldcorr[2*ic+1];
2790 out[2*ib+1] -= out[2*ic ] * fft1_foldcorr[2*ic+1]
2791 - out[2*ic+1] * fft1_foldcorr[2*ic ];
2792 out[2*ic ]-=t1;
2793 out[2*ic+1]+=t2;
2794 ib++;
2795 ic--;
2796 }
2797 }
2798 else
2799 {
2800 for(ia=m; ia < k; ia++)
2801 {
2802 t1= out[2*ic ] -
2803 out[2*ib ] * fft1_foldcorr[2*ia ] +
2804 out[2*ib+1] * fft1_foldcorr[2*ia+1];
2805 t2= out[2*ic+1] +
2806 out[2*ib ] * fft1_foldcorr[2*ia+1] +
2807 out[2*ib+1] * fft1_foldcorr[2*ia ];
2808 t3= out[2*ib ] -
2809 out[2*ic ] * fft1_foldcorr[2*ic ] -
2810 out[2*ic+1] * fft1_foldcorr[2*ic+1];
2811 t4= out[2*ib+1] -
2812 out[2*ic ] * fft1_foldcorr[2*ic+1] +
2813 out[2*ic+1] * fft1_foldcorr[2*ic ];
2814 out[2*ib+1]=t1;
2815 out[2*ib ]=t2;
2816 out[2*ic+1]=t3;
2817 out[2*ic ]=t4;
2818 ib++;
2819 ic--;
2820 }
2821 t1=out[2*ib ];
2822 t2=out[2*pc ];
2823 out[2*ib ]=out[2*ib+1];
2824 out[2*pc ]=out[2*pc+1];
2825 out[2*ib+1]=t1;
2826 out[2*pc+1]=t2;
2827 }
2828 }
2829 else
2830 {
2831 if(fft1_direction < 0)
2832 {
2833 for(ia=m; ia < k; ia++)
2834 {
2835 t1= out[2*ic ];
2836 t2= out[2*ic+1];
2837 out[2*ic+1]=out[2*ib ];
2838 out[2*ic ]=out[2*ib+1];
2839 out[2*ib+1]=t1;
2840 out[2*ib ]=t2;
2841 ib++;
2842 ic--;
2843 }
2844 t1=out[2*ib ];
2845 t2=out[2*pc ];
2846 out[2*ib ]=out[2*ib+1];
2847 out[2*pc ]=out[2*pc+1];
2848 out[2*ib+1]=t1;
2849 out[2*pc+1]=t2;
2850 }
2851 }
2852 }
2853 else
2854 {
2855 switch (FFT1_CURMODE)
2856 {
2857 case 2:
2858 // Split radix DIT C real
2859 fft1_reherm_dit_two(timf1p_ref, out, tmp);
2860 goto fft_done;
2861
2862 case 6:
2863 // Radix 4 DIT C
2864 for(chan=0; chan<2; chan++)
2865 {
2866 fft1win_dit_chan(chan,timf1p_ref, tmp);
2867 bulk_of_dit(fft1_size, fft1_n, tmp, fft1tab, yieldflag_wdsp_fft1);
2868 dit_finish_chan (chan, out, tmp);
2869 }
2870 break;
2871
2872 case 7:
2873 // Radix 2 DIF C
2874 for(chan=0; chan<2; chan++)
2875 {
2876 fft1win_dif_chan(chan,timf1p_ref, tmp);
2877 bulk_of_dif(fft1_size, fft1_n, tmp, fft1tab, yieldflag_wdsp_fft1);
2878 dif_permute_chan (chan, out, tmp);
2879 }
2880 break;
2881
2882 case 8:
2883 // Radix 2 DIF ASM
2884 #if IA64 == 0 && CPU == CPU_INTEL
2885 for(chan=0; chan<2; chan++)
2886 {
2887 fft1win_dif_chan(chan, timf1p_ref, tmp);
2888 asmbulk_of_dif(fft1_size, fft1_n, tmp, fft1tab, yieldflag_wdsp_fft1);
2889 dif_permute_chan (chan, out, tmp);
2890 }
2891 #else
2892 lirerr(126577);
2893 #endif
2894 break;
2895
2896 case 9:
2897 // Twin radix 2 DIF ASM
2898 fft1win_dif_two(timf1p_ref, tmp);
2899 #if IA64 == 0 && CPU == CPU_INTEL
2900 asmbulk_of_dual_dif(fft1_size, fft1_n,
2901 tmp, fft1tab, yieldflag_wdsp_fft1);
2902 #else
2903 bulk_of_dual_dif(fft1_size, fft1_n,
2904 tmp, fft1tab, yieldflag_wdsp_fft1);
2905 #endif
2906 dif_permute_two(out, tmp);
2907 break;
2908
2909 case 10:
2910 // Twin Radix 4 DIT C
2911 fft1win_dit_two(timf1p_ref, out);
2912 bulk_of_dual_dit(fft1_size, fft1_n, out, fft1tab, yieldflag_wdsp_fft1);
2913 break;
2914
2915 case 11:
2916 // Twin Radix 4 DIT SIMD
2917 #if CPU == CPU_INTEL
2918 #if IA64 == 0
2919 if( (ui.rx_input_mode&DWORD_INPUT) == 0)
2920 {
2921 if(genparm[FIRST_FFT_SINPOW] == 0)
2922 {
2923 simd1_16_nowin(timf1p_ref,out);
2924 }
2925 else
2926 {
2927 simd1_16_win(timf1p_ref,out);
2928 }
2929 }
2930 else
2931 {
2932 if(genparm[FIRST_FFT_SINPOW] == 0)
2933 {
2934 simd1_32_nowin(timf1p_ref,out);
2935 }
2936 else
2937 {
2938 simd1_32_win(timf1p_ref,out);
2939 }
2940 }
2941 #else
2942 fft1win_dit_two(timf1p_ref, out);
2943 #endif
2944 simdbulk_of_dual_dit(fft1_size, fft1_n, out, fft1tab);
2945 #else
2946 lirerr(998546);
2947 #endif
2948 break;
2949
2950 default:
2951 fprintf( stderr,"\nFFT1_CURMODE= %d",FFT1_CURMODE);
2952 return;
2953 }
2954 if( (ui.network_flag & NET_RXIN_TIMF2) != 0)
2955 {
2956 if(ui.rx_addev_no != NETWORK_DEVICE_CODE)
2957 {
2958 lirerr(1319);
2959 return;
2960 }
2961 k=fft1_size/2;
2962 for(ia=0; ia < k; ia++)
2963 {
2964 t1=out[4*ia ];
2965 t2=out[4*ia+1];
2966 t3=out[4*ia+2];
2967 t4=out[4*ia+3];
2968 out[4*ia ]=out[4*(ia+k) ];
2969 out[4*ia+1]=out[4*(ia+k)+1];
2970 out[4*ia+2]=out[4*(ia+k)+2];
2971 out[4*ia+3]=out[4*(ia+k)+3];
2972 out[4*(ia+k) ]=t1;
2973 out[4*(ia+k)+1]=t2;
2974 out[4*(ia+k)+2]=t3;
2975 out[4*(ia+k)+3]=t4;
2976 }
2977 }
2978 pc=0;
2979 m=fft1_first_sym_point;
2980 if(m==0)m=1;
2981 ib=m;
2982 ic=fft1_size-m;
2983 k=fft1_size/2;
2984 if( (fft1_calibrate_flag&CALIQ)==CALIQ)
2985 {
2986 // In direct conversion mode it is not possible to get perfect amplitude
2987 // and phase relations between the two channels in the analog circuitry.
2988 // As a result the signal has a mirror image that can be expected in the
2989 // -40dB region for 1% analog filter components.
2990 // The image is removed by the below section that orthogonalises the
2991 // signal and it's mirror using data obtained in a hardware calibration
2992 // process.
2993 if(fft1_direction > 0)
2994 {
2995 for(ia=m; ia < k; ia++)
2996 {
2997 t1= out[4*ib ] * fft1_foldcorr[4*ia ]
2998 - out[4*ib+1] * fft1_foldcorr[4*ia+1];
2999 t2= out[4*ib ] * fft1_foldcorr[4*ia+1]
3000 + out[4*ib+1] * fft1_foldcorr[4*ia ];
3001 out[4*ib ] -= out[4*ic ] * fft1_foldcorr[4*ic ]
3002 + out[4*ic+1] * fft1_foldcorr[4*ic+1];
3003 out[4*ib+1] -= out[4*ic ] * fft1_foldcorr[4*ic+1]
3004 - out[4*ic+1] * fft1_foldcorr[4*ic ];
3005 out[4*ic ]-=t1;
3006 out[4*ic+1]+=t2;
3007 t1= out[4*ib+2] * fft1_foldcorr[4*ia+2]
3008 - out[4*ib+3] * fft1_foldcorr[4*ia+3];
3009 t2= out[4*ib+2] * fft1_foldcorr[4*ia+3]
3010 + out[4*ib+3] * fft1_foldcorr[4*ia+2];
3011 out[4*ib+2] -= out[4*ic+2] * fft1_foldcorr[4*ic+2]
3012 + out[4*ic+3] * fft1_foldcorr[4*ic+3];
3013 out[4*ib+3] -= out[4*ic+2] * fft1_foldcorr[4*ic+3]
3014 - out[4*ic+3] * fft1_foldcorr[4*ic+2];
3015 out[4*ic+2]-=t1;
3016 out[4*ic+3]+=t2;
3017 ib++;
3018 ic--;
3019 }
3020 }
3021 else
3022 {
3023 for(ia=m; ia < k; ia++)
3024 {
3025 t1= out[4*ic ] -
3026 out[4*ib ] * fft1_foldcorr[4*ia ] +
3027 out[4*ib+1] * fft1_foldcorr[4*ia+1];
3028 t2= out[4*ic+1] +
3029 out[4*ib ] * fft1_foldcorr[4*ia+1] +
3030 out[4*ib+1] * fft1_foldcorr[4*ia ];
3031 t3= out[4*ib ] -
3032 out[4*ic ] * fft1_foldcorr[4*ic ] -
3033 out[4*ic+1] * fft1_foldcorr[4*ic+1];
3034 t4= out[4*ib+1] -
3035 out[4*ic ] * fft1_foldcorr[4*ic+1] +
3036 out[4*ic+1] * fft1_foldcorr[4*ic ];
3037 out[4*ib+1]=t1;
3038 out[4*ib ]=t2;
3039 out[4*ic+1]=t3;
3040 out[4*ic ]=t4;
3041 t1= out[4*ic+2] -
3042 out[4*ib+2] * fft1_foldcorr[4*ia+2] +
3043 out[4*ib+3] * fft1_foldcorr[4*ia+3];
3044 t2= out[4*ic+3] +
3045 out[4*ib+2] * fft1_foldcorr[4*ia+3] +
3046 out[4*ib+3] * fft1_foldcorr[4*ia+2];
3047 t3= out[4*ib+2] -
3048 out[4*ic+2] * fft1_foldcorr[4*ic+2] -
3049 out[4*ic+3] * fft1_foldcorr[4*ic+3];
3050 t4= out[4*ib+3] -
3051 out[4*ic+2] * fft1_foldcorr[4*ic+3] +
3052 out[4*ic+3] * fft1_foldcorr[4*ic+2];
3053 out[4*ib+3]=t1;
3054 out[4*ib+2]=t2;
3055 out[4*ic+3]=t3;
3056 out[4*ic+2]=t4;
3057 ib++;
3058 ic--;
3059 }
3060 t1=out[4*ib ];
3061 t2=out[4*pc ];
3062 t3=out[4*ib+2];
3063 t4=out[4*pc+2];
3064 out[4*ib ]=out[4*ib+1];
3065 out[4*ib+2]=out[4*ib+3];
3066 out[4*pc ]=out[4*pc+1];
3067 out[4*pc+2]=out[4*pc+3];
3068 out[4*ib+1]=t1;
3069 out[4*pc+1]=t2;
3070 out[4*ib+3]=t3;
3071 out[4*pc+3]=t4;
3072 }
3073 }
3074 else
3075 {
3076 if(fft1_direction < 0)
3077 {
3078 for(ia=m; ia < k; ia++)
3079 {
3080 t1= out[4*ic ];
3081 t2= out[4*ic+1];
3082 t3= out[4*ic+2];
3083 t4= out[4*ic+3];
3084 out[4*ic+1]=out[4*ib ];
3085 out[4*ic ]=out[4*ib+1];
3086 out[4*ic+3]=out[4*ib+2];
3087 out[4*ic+2]=out[4*ib+3];
3088 out[4*ib+1]=t1;
3089 out[4*ib ]=t2;
3090 out[4*ib+3]=t3;
3091 out[4*ib+2]=t4;
3092 ib++;
3093 ic--;
3094 }
3095 t1=out[4*ib ];
3096 t2=out[4*pc ];
3097 t3=out[4*ib+2];
3098 t4=out[4*pc+2];
3099 out[4*ib ]=out[4*ib+1];
3100 out[4*ib+2]=out[4*ib+3];
3101 out[4*pc ]=out[4*pc+1];
3102 out[4*pc+2]=out[4*pc+3];
3103 out[4*ib+1]=t1;
3104 out[4*pc+1]=t2;
3105 out[4*ib+3]=t3;
3106 out[4*pc+3]=t4;
3107 }
3108 }
3109 }
3110 fft_done:;
3111 }
3112
fft1_c(void)3113 void fft1_c(void)
3114 {
3115 int i, ia, ib, ic, pa, ix;
3116 float *pwr;
3117 TWOCHAN_POWER *pxy;
3118 float t1,t2;
3119 float *z, *sum;
3120 // The total filter chain of the hardware, is normally not
3121 // very flat, nor has it a good pulse response.
3122 // Add one extra filter here so the total filter response becomes what
3123 // the user has asked for.
3124 // At the same time the data becomes normalised to an amplitude that
3125 // is independent of the processes up to this point.
3126 // Normalisation is for the noise floor to be around 0dB in the
3127 // full dynamic range graph.
3128 // To save memory accesses, calculate fft1_sumsq at the same time.
3129 // In case AFC is run from fft1 we are probably using a slow
3130 // computer and large fft1 sizes. Then summed powers are
3131 // calculated elsewhere.
3132
3133
3134 pa=fft1_nb*fft1_block;
3135 z=&fft1_float[pa];
3136 sum=&fft1_sumsq[fft1_sumsq_pa];
3137 ix=fft1_last_point;
3138 ic=fft1_sumsq_pa+fft1_first_point;
3139 if(fft1afc_flag <= 0)
3140 {
3141 // We want fft1_sumsq to contain summed power spectra calculated from fft1
3142 // over wg.fft_avg1num individual spectra.
3143 if(fft1_sumsq_counter == 0)
3144 {
3145 if(sw_onechan)
3146 {
3147 for(ia=fft1_first_point; ia <= ix; ia++)
3148 {
3149 t1=z[2*ia ]*fft1_filtercorr[2*ia ]-
3150 z[2*ia+1]*fft1_filtercorr[2*ia+1];
3151 z[2*ia+1]=z[2*ia+1]*fft1_filtercorr[2*ia ]+
3152 z[2*ia ]*fft1_filtercorr[2*ia+1];
3153 z[2*ia]=t1;
3154 sum[ia]=t1*t1+z[2*ia+1]*z[2*ia+1];
3155 }
3156 }
3157 else
3158 {
3159 ib=pa/4+fft1_first_point;
3160 for(ia=fft1_first_point; ia <= ix; ia++)
3161 {
3162 t1=fft1_float[4*ib ]*fft1_filtercorr[4*ia ]-
3163 fft1_float[4*ib+1]*fft1_filtercorr[4*ia+1];
3164 fft1_float[4*ib+1]=fft1_float[4*ib+1]*fft1_filtercorr[4*ia ]+
3165 fft1_float[4*ib ]*fft1_filtercorr[4*ia+1];
3166 fft1_float[4*ib ]=t1;
3167 t1=t1*t1+fft1_float[4*ib+1]*fft1_float[4*ib+1];
3168 t2=fft1_float[4*ib+2]*fft1_filtercorr[4*ia+2]-
3169 fft1_float[4*ib+3]*fft1_filtercorr[4*ia+3];
3170 fft1_float[4*ib+3]=fft1_float[4*ib+3]*fft1_filtercorr[4*ia+2]+
3171 fft1_float[4*ib+2]*fft1_filtercorr[4*ia+3];
3172 fft1_float[4*ib+2]=t2;
3173 fft1_sumsq[ic]=t1+t2*t2+fft1_float[4*ib+3]*fft1_float[4*ib+3];
3174 if(fft1_correlation_flag)
3175 {
3176 fft1_corrsum[2*ic ]=2*(fft1_float[4*ib ]*fft1_float[4*ib+2]+
3177 fft1_float[4*ib+1]*fft1_float[4*ib+3]);
3178 fft1_corrsum[2*ic+1]=2*(fft1_float[4*ib+1]*fft1_float[4*ib+2]-
3179 fft1_float[4*ib ]*fft1_float[4*ib+3]);
3180 }
3181 ib++;
3182 ic++;
3183 }
3184 }
3185
3186 }
3187 else
3188 {
3189 if(sw_onechan)
3190 {
3191 for(ia=fft1_first_point; ia <= ix; ia++)
3192 {
3193 t1=z[2*ia ]*fft1_filtercorr[2*ia ]-
3194 z[2*ia+1]*fft1_filtercorr[2*ia+1];
3195 z[2*ia+1]=z[2*ia+1]*fft1_filtercorr[2*ia ]+
3196 z[2*ia ]*fft1_filtercorr[2*ia+1];
3197 z[2*ia]=t1;
3198 sum[ia]+=t1*t1+z[2*ia+1]*z[2*ia+1];
3199 }
3200 }
3201 else
3202 {
3203 ib=pa/4+fft1_first_point;
3204 for(ia=fft1_first_point; ia <= ix; ia++)
3205 {
3206 t1=fft1_float[4*ib ]*fft1_filtercorr[4*ia ]-
3207 fft1_float[4*ib+1]*fft1_filtercorr[4*ia+1];
3208 fft1_float[4*ib+1]=fft1_float[4*ib+1]*fft1_filtercorr[4*ia ]+
3209 fft1_float[4*ib ]*fft1_filtercorr[4*ia+1];
3210 fft1_float[4*ib ]=t1;
3211 t1=t1*t1+fft1_float[4*ib+1]*fft1_float[4*ib+1];
3212 t2=fft1_float[4*ib+2]*fft1_filtercorr[4*ia+2]-
3213 fft1_float[4*ib+3]*fft1_filtercorr[4*ia+3];
3214 fft1_float[4*ib+3]=fft1_float[4*ib+3]*fft1_filtercorr[4*ia+2]+
3215 fft1_float[4*ib+2]*fft1_filtercorr[4*ia+3];
3216 fft1_float[4*ib+2]=t2;
3217 fft1_sumsq[ic]+=t1+t2*t2+fft1_float[4*ib+3]*fft1_float[4*ib+3];
3218 if(fft1_correlation_flag)
3219 {
3220 fft1_corrsum[2*ic ]+=2*(fft1_float[4*ib ]*fft1_float[4*ib+2]+
3221 fft1_float[4*ib+1]*fft1_float[4*ib+3]);
3222 fft1_corrsum[2*ic+1]+=2*(fft1_float[4*ib+1]*fft1_float[4*ib+2]-
3223 fft1_float[4*ib ]*fft1_float[4*ib+3]);
3224 }
3225 ib++;
3226 ic++;
3227 }
3228 }
3229 }
3230 }
3231 else
3232 {
3233 // This code is executed to make the last step of fft1 in case
3234 // fft2 is not selected and AFC is in use.
3235 ffts_na=fft1_nb;
3236 ffts_nm=fft1_nm;
3237 if(no_of_spurs > 0)
3238 {
3239 if(sw_onechan)
3240 {
3241 ib=pa/2+fft1_first_point;
3242 for(ia=fft1_first_point; ia <= ix; ia++)
3243 {
3244 t1=fft1_float[2*ib ]*fft1_filtercorr[2*ia ]-
3245 fft1_float[2*ib+1]*fft1_filtercorr[2*ia+1];
3246 fft1_float[2*ib+1]=fft1_float[2*ib+1]*fft1_filtercorr[2*ia ]+
3247 fft1_float[2*ib ]*fft1_filtercorr[2*ia+1];
3248 fft1_float[2*ib]=t1;
3249 ib++;
3250 }
3251 }
3252 else
3253 {
3254 ib=pa/4+fft1_first_point;
3255 for(ia=fft1_first_point; ia <= ix; ia++)
3256 {
3257 t1=fft1_float[4*ib ]*fft1_filtercorr[4*ia ]-
3258 fft1_float[4*ib+1]*fft1_filtercorr[4*ia+1];
3259 fft1_float[4*ib+1]=fft1_float[4*ib+1]*fft1_filtercorr[4*ia ]+
3260 fft1_float[4*ib ]*fft1_filtercorr[4*ia+1];
3261 fft1_float[4*ib ]=t1;
3262 t2=fft1_float[4*ib+2]*fft1_filtercorr[4*ia+2]-
3263 fft1_float[4*ib+3]*fft1_filtercorr[4*ia+3];
3264 fft1_float[4*ib+3]=fft1_float[4*ib+3]*fft1_filtercorr[4*ia+2]+
3265 fft1_float[4*ib+2]*fft1_filtercorr[4*ia+3];
3266 fft1_float[4*ib+2]=t2;
3267 ib++;
3268 }
3269 }
3270 fftx_na=fft1_nb;
3271 eliminate_spurs();
3272 if(fft1_sumsq_counter == 0)
3273 {
3274 if(sw_onechan)
3275 {
3276 ib=pa/2+fft1_first_point;
3277 pwr=&fft1_power[fft1_nb*fft1_size];
3278 for(ia=fft1_first_point; ia <= ix; ia++)
3279 {
3280 pwr[ia]=fft1_float[2*ib]*fft1_float[2*ib]+
3281 fft1_float[2*ib+1]*fft1_float[2*ib+1];
3282 fft1_sumsq[ic]=pwr[ia];
3283 ib++;
3284 ic++;
3285 }
3286 }
3287 else
3288 {
3289 ib=pa/4+fft1_first_point;
3290 pxy=&fft1_xypower[fft1_nb*fft1_size];
3291 for(ia=fft1_first_point; ia <= ix; ia++)
3292 {
3293 pxy[ia].x2=fft1_float[4*ib ]*fft1_float[4*ib ]+
3294 fft1_float[4*ib+1]*fft1_float[4*ib+1];
3295 pxy[ia].y2=fft1_float[4*ib+2]*fft1_float[4*ib+2]+
3296 fft1_float[4*ib+3]*fft1_float[4*ib+3];
3297 pxy[ia].im_xy=-fft1_float[4*ib ]*fft1_float[4*ib+3]+
3298 fft1_float[4*ib+2]*fft1_float[4*ib+1];
3299 pxy[ia].re_xy= fft1_float[4*ib ]*fft1_float[4*ib+2]+
3300 fft1_float[4*ib+1]*fft1_float[4*ib+3];
3301 fft1_sumsq[ic]=pxy[ia].x2+pxy[ia].y2;
3302 if(fft1_correlation_flag)
3303 {
3304 fft1_corrsum[2*ic ]=2*pxy[ia].re_xy;
3305 fft1_corrsum[2*ic+1]=2*pxy[ia].im_xy;
3306 }
3307 ic++;
3308 ib++;
3309 }
3310 }
3311 }
3312 else
3313 {
3314 if(sw_onechan)
3315 {
3316 ib=pa/2+fft1_first_point;
3317 pwr=&fft1_power[fft1_nb*fft1_size];
3318 for(ia=fft1_first_point; ia <= ix; ia++)
3319 {
3320 pwr[ia]=fft1_float[2*ib]*fft1_float[2*ib]+
3321 fft1_float[2*ib+1]*fft1_float[2*ib+1];
3322 fft1_sumsq[ic]+=pwr[ia];
3323 ic++;
3324 ib++;
3325 }
3326 }
3327 else
3328 {
3329 ib=pa/4+fft1_first_point;
3330 pxy=&fft1_xypower[fft1_nb*fft1_size];
3331 for(ia=fft1_first_point; ia <= ix; ia++)
3332 {
3333 pxy[ia].x2=fft1_float[4*ib ]*fft1_float[4*ib ]+
3334 fft1_float[4*ib+1]*fft1_float[4*ib+1];
3335 pxy[ia].y2=fft1_float[4*ib+2]*fft1_float[4*ib+2]+
3336 fft1_float[4*ib+3]*fft1_float[4*ib+3];
3337 pxy[ia].im_xy=-fft1_float[4*ib ]*fft1_float[4*ib+3]+
3338 fft1_float[4*ib+2]*fft1_float[4*ib+1];
3339 pxy[ia].re_xy= fft1_float[4*ib ]*fft1_float[4*ib+2]+
3340 fft1_float[4*ib+1]*fft1_float[4*ib+3];
3341 fft1_sumsq[ic]+=pxy[ia].x2+pxy[ia].y2;
3342 if(fft1_correlation_flag)
3343 {
3344 fft1_corrsum[2*ic ]+=2*pxy[ia].re_xy;
3345 fft1_corrsum[2*ic+1]+=2*pxy[ia].im_xy;
3346 }
3347 ic++;
3348 ib++;
3349 }
3350 }
3351 }
3352 }
3353 else
3354 {
3355 if(fft1_sumsq_counter == 0)
3356 {
3357 if(sw_onechan)
3358 {
3359 ib=pa/2+fft1_first_point;
3360 pwr=&fft1_power[fft1_nb*fft1_size];
3361 for(ia=fft1_first_point; ia <= ix; ia++)
3362 {
3363 t1=fft1_float[2*ib ]*fft1_filtercorr[2*ia ]-
3364 fft1_float[2*ib+1]*fft1_filtercorr[2*ia+1];
3365 fft1_float[2*ib+1]=fft1_float[2*ib+1]*fft1_filtercorr[2*ia ]+
3366 fft1_float[2*ib ]*fft1_filtercorr[2*ia+1];
3367 fft1_float[2*ib]=t1;
3368 pwr[ia]=t1*t1+fft1_float[2*ib+1]*fft1_float[2*ib+1];
3369 fft1_sumsq[ic]=pwr[ia];
3370 ib++;
3371 ic++;
3372 }
3373 }
3374 else
3375 {
3376 ib=pa/4+fft1_first_point;
3377 pxy=&fft1_xypower[fft1_nb*fft1_size];
3378 for(ia=fft1_first_point; ia <= ix; ia++)
3379 {
3380 t1=fft1_float[4*ib ]*fft1_filtercorr[4*ia ]-
3381 fft1_float[4*ib+1]*fft1_filtercorr[4*ia+1];
3382 fft1_float[4*ib+1]=fft1_float[4*ib+1]*fft1_filtercorr[4*ia ]+
3383 fft1_float[4*ib ]*fft1_filtercorr[4*ia+1];
3384 fft1_float[4*ib ]=t1;
3385 t2=fft1_float[4*ib+2]*fft1_filtercorr[4*ia+2]-
3386 fft1_float[4*ib+3]*fft1_filtercorr[4*ia+3];
3387 fft1_float[4*ib+3]=fft1_float[4*ib+3]*fft1_filtercorr[4*ia+2]+
3388 fft1_float[4*ib+2]*fft1_filtercorr[4*ia+3];
3389 fft1_float[4*ib+2]=t2;
3390 pxy[ia].x2=t1*t1+fft1_float[4*ib+1]*fft1_float[4*ib+1];
3391 pxy[ia].y2=t2*t2+fft1_float[4*ib+3]*fft1_float[4*ib+3];
3392 pxy[ia].im_xy=-t1*fft1_float[4*ib+3]+t2*fft1_float[4*ib+1];
3393 pxy[ia].re_xy=t1*t2+fft1_float[4*ib+1]*fft1_float[4*ib+3];
3394 fft1_sumsq[ic]=pxy[ia].x2+pxy[ia].y2;
3395 if(fft1_correlation_flag)
3396 {
3397 fft1_corrsum[2*ic ]=2*pxy[ia].re_xy;
3398 fft1_corrsum[2*ic+1]=2*pxy[ia].im_xy;
3399 }
3400 ic++;
3401 ib++;
3402 }
3403 }
3404 }
3405 else
3406 {
3407 if(sw_onechan)
3408 {
3409 ib=pa/2+fft1_first_point;
3410 pwr=&fft1_power[fft1_nb*fft1_size];
3411 for(ia=fft1_first_point; ia <= ix; ia++)
3412 {
3413 t1=fft1_float[2*ib ]*fft1_filtercorr[2*ia ]-
3414 fft1_float[2*ib+1]*fft1_filtercorr[2*ia+1];
3415 fft1_float[2*ib+1]=fft1_float[2*ib+1]*fft1_filtercorr[2*ia ]+
3416 fft1_float[2*ib ]*fft1_filtercorr[2*ia+1];
3417 fft1_float[2*ib]=t1;
3418 pwr[ia]=t1*t1+fft1_float[2*ib+1]*fft1_float[2*ib+1];
3419 fft1_sumsq[ic]+=pwr[ia];
3420 ic++;
3421 ib++;
3422 }
3423 }
3424 else
3425 {
3426 ib=pa/4+fft1_first_point;
3427 pxy=&fft1_xypower[fft1_nb*fft1_size];
3428 for(ia=fft1_first_point; ia <= ix; ia++)
3429 {
3430 t1=fft1_float[4*ib ]*fft1_filtercorr[4*ia ]-
3431 fft1_float[4*ib+1]*fft1_filtercorr[4*ia+1];
3432 fft1_float[4*ib+1]=fft1_float[4*ib+1]*fft1_filtercorr[4*ia ]+
3433 fft1_float[4*ib ]*fft1_filtercorr[4*ia+1];
3434 fft1_float[4*ib ]=t1;
3435 t2=fft1_float[4*ib+2]*fft1_filtercorr[4*ia+2]-
3436 fft1_float[4*ib+3]*fft1_filtercorr[4*ia+3];
3437 fft1_float[4*ib+3]=fft1_float[4*ib+3]*fft1_filtercorr[4*ia+2]+
3438 fft1_float[4*ib+2]*fft1_filtercorr[4*ia+3];
3439 fft1_float[4*ib+2]=t2;
3440 pxy[ia].x2=t1*t1+fft1_float[4*ib+1]*fft1_float[4*ib+1];
3441 pxy[ia].y2=t2*t2+fft1_float[4*ib+3]*fft1_float[4*ib+3];
3442 pxy[ia].im_xy=-t1*fft1_float[4*ib+3]+t2*fft1_float[4*ib+1];
3443 pxy[ia].re_xy=t1*t2+fft1_float[4*ib+1]*fft1_float[4*ib+3];
3444 fft1_sumsq[ic]+=pxy[ia].x2+pxy[ia].y2;
3445 if(fft1_correlation_flag)
3446 {
3447 fft1_corrsum[2*ic ]+=2*pxy[ia].re_xy;
3448 fft1_corrsum[2*ic+1]+=2*pxy[ia].im_xy;
3449 }
3450 ic++;
3451 ib++;
3452 }
3453 }
3454 }
3455 }
3456 if(genparm[MAX_NO_OF_SPURS] > 0)
3457 {
3458 if(sw_onechan)
3459 {
3460 pwr=&fft1_power[fft1_nb*fft1_size];
3461 if(spursearch_sum_counter > 3*spur_speknum)
3462 {
3463 spursearch_sum_counter=0;
3464 for(i=spur_search_first_point; i <= spur_search_last_point; i++)
3465 {
3466 spursearch_spectrum[i]=spursearch_powersum[i]+pwr[i];
3467 }
3468 spursearch_spectrum_cleanup();
3469 }
3470 else
3471 {
3472 if(spursearch_sum_counter == 0)
3473 {
3474 for(i=spur_search_first_point; i <= spur_search_last_point; i++)
3475 {
3476 spursearch_powersum[i]=pwr[i];
3477 }
3478 }
3479 else
3480 {
3481 for(i=spur_search_first_point; i <= spur_search_last_point; i++)
3482 {
3483 spursearch_powersum[i]+=pwr[i];
3484 }
3485 }
3486 spursearch_sum_counter++;
3487 }
3488 }
3489 else
3490 {
3491 pxy=&fft1_xypower[fft1_nb*fft1_size];
3492 if(spursearch_sum_counter > 3*spur_speknum)
3493 {
3494 spursearch_sum_counter=0;
3495 for(i=wg_first_point; i <= wg_last_point; i++)
3496 {
3497 spursearch_xysum[i].x2+=pxy[i].x2;
3498 spursearch_xysum[i].y2+=pxy[i].y2;
3499 spursearch_xysum[i].re_xy+=pxy[i].re_xy;
3500 spursearch_xysum[i].im_xy+=pxy[i].im_xy;
3501 t1=spursearch_xysum[i].x2+spursearch_xysum[i].y2;
3502 spursearch_spectrum[i]=t1+
3503 2*(spursearch_xysum[i].re_xy*spursearch_xysum[i].re_xy+
3504 spursearch_xysum[i].im_xy*spursearch_xysum[i].im_xy-
3505 spursearch_xysum[i].x2*spursearch_xysum[i].y2)/t1;
3506 }
3507 spursearch_spectrum_cleanup();
3508 }
3509 else
3510 {
3511 if(spursearch_sum_counter == 0)
3512 {
3513 for(i=wg_first_point; i <= wg_last_point; i++)
3514 {
3515 spursearch_xysum[i].x2=pxy[i].x2;
3516 spursearch_xysum[i].y2=pxy[i].y2;
3517 spursearch_xysum[i].re_xy=pxy[i].re_xy;
3518 spursearch_xysum[i].im_xy=pxy[i].im_xy;
3519 }
3520 }
3521 else
3522 {
3523 for(i=wg_first_point; i <= wg_last_point; i++)
3524 {
3525 spursearch_xysum[i].x2+=pxy[i].x2;
3526 spursearch_xysum[i].y2+=pxy[i].y2;
3527 spursearch_xysum[i].re_xy+=pxy[i].re_xy;
3528 spursearch_xysum[i].im_xy+=pxy[i].im_xy;
3529 }
3530 }
3531 spursearch_sum_counter++;
3532 }
3533 }
3534 }
3535 }
3536 fft1_sumsq_counter++;
3537 if(fft1_sumsq_counter >= wg.fft_avg1num)
3538 {
3539 fft1_sumsq_counter=0;
3540 update_fft1_slowsum();
3541 // We have a new average power spectrum.
3542 // In case the second fft is enabled we have to set up information
3543 // for the selective limiter.
3544 if(genparm[SECOND_FFT_ENABLE] != 0)
3545 {
3546 fft1_update_liminfo();
3547 }
3548 fft1_sumsq_pa=(fft1_sumsq_pa+fft1_size)&fft1_sumsq_mask;
3549 }
3550 fft1_nb=(fft1_nb+1)&fft1n_mask;
3551 fft1_pb=fft1_nb*fft1_block;
3552 if(genparm[SECOND_FFT_ENABLE] == 0)ag_pa=(ag_pa+1)&ag_mask;
3553 }
3554
update_fft1_slowsum(void)3555 void update_fft1_slowsum(void)
3556 {
3557 int i,ia,pa,pb;
3558 int fresh_recalc;
3559 // Now that we have a new power spectrum in fft1_sumsq, update the
3560 // average of the spectra in fft1_slowsum by adding it's power and
3561 // subtracting the power of the old one that should no longer
3562 // contribute to the sum.
3563 // This way of calculating an average may cause errors after a long
3564 // time since bits may be lost occasionally due to rounding errors.
3565 // Calculate a few points from scratch each time to eliminate this
3566 // problem.
3567 lir_mutex_lock(MUTEX_FFT1SLOWSUM);
3568 pa=fft1_sumsq_pa;
3569 if(change_fft1_flag)
3570 {
3571 new_fft1_averages(pa, wg_first_point, wg_last_point);
3572 lir_mutex_unlock(MUTEX_FFT1SLOWSUM);
3573 return;
3574 }
3575 if(genparm[FIRST_FFT_BANDWIDTH] > 200)
3576 {
3577 if(wg_fft_avg2num < 100)
3578 {
3579 fresh_recalc=4;
3580 }
3581 else
3582 {
3583 fresh_recalc=8;
3584 }
3585 }
3586 else
3587 {
3588 if(wg_fft_avg2num < 20)
3589 {
3590 fresh_recalc=2;
3591 }
3592 else
3593 {
3594 fresh_recalc=2;
3595 }
3596 }
3597 pb=(pa-wg_fft_avg2num*fft1_size+fft1_sumsq_bufsize)&fft1_sumsq_mask;
3598 if(fft1_sumsq_recalc == fft1_last_point) fft1_sumsq_recalc=fft1_first_point;
3599 ia=fft1_sumsq_recalc;
3600 fft1_sumsq_recalc+=wg.xpoints/fresh_recalc;
3601 if(fft1_sumsq_recalc>fft1_last_point)fft1_sumsq_recalc=fft1_last_point;
3602 new_fft1_averages(pa, ia, fft1_sumsq_recalc);
3603 for(i=fft1_first_point; i < ia; i++)
3604 {
3605 fft1_slowsum[i]+=fft1_sumsq[pa+i]-fft1_sumsq[pb+i];
3606 if(fft1_slowsum[i]<0)fft1_slowsum[i]=0;
3607 }
3608 for(i=fft1_sumsq_recalc+1; i <= fft1_last_point; i++)
3609 {
3610 fft1_slowsum[i]+=fft1_sumsq[pa+i]-fft1_sumsq[pb+i];
3611 if(fft1_slowsum[i]<0.0000001F)fft1_slowsum[i]=0.0000001F;
3612 }
3613 if(fft1_correlation_flag)
3614 {
3615 for(i=fft1_first_point; i < ia; i++)
3616 {
3617 fft1_slowcorr[2*i ]+=fft1_corrsum[2*(pa+i) ]-fft1_corrsum[2*(pb+i) ];
3618 fft1_slowcorr[2*i+1]+=fft1_corrsum[2*(pa+i)+1]-fft1_corrsum[2*(pb+i)+1];
3619 }
3620 for(i=fft1_sumsq_recalc+1; i <= fft1_last_point; i++)
3621 {
3622 fft1_slowcorr[2*i ]+=fft1_corrsum[2*(pa+i) ]-fft1_corrsum[2*(pb+i) ];
3623 fft1_slowcorr[2*i+1]+=fft1_corrsum[2*(pa+i)+1]-fft1_corrsum[2*(pb+i)+1];
3624 }
3625 }
3626 lir_mutex_unlock(MUTEX_FFT1SLOWSUM);
3627 }
3628
set_fft1_endpoints(void)3629 void set_fft1_endpoints(void)
3630 {
3631 int i;
3632 float t1;
3633 // Set all pointers for a non-inverted spectrum.
3634 wg_first_point=wg.first_xpoint;
3635 wg_last_point=wg.first_xpoint+wg.xpoints;
3636 if(wg_last_point >= fft1_size)wg_last_point=fft1_size-1;
3637 fft1_first_point=0;
3638 fft1_first_inband=0;
3639 fft1_last_point=fft1_size-1;
3640 fft1_last_inband=fft1_size-1;
3641 liminfo_amplitude_factor=1;
3642 if( (ui.network_flag&NET_RXOUT_FFT1) == 0 &&
3643 genparm[SECOND_FFT_ENABLE] == 0 )
3644 {
3645 // In case second fft is not enabled, there is no reason to calculate
3646 // the spectrum outside the range that we use on the display when
3647 // we do not need fft1 transforms for the network.
3648 fft1_first_point=wg_first_point;
3649 fft1_last_point=wg_last_point;
3650 }
3651 else
3652 {
3653 if( (fft1_calibrate_flag&CALAMP)==CALAMP)
3654 {
3655 while(fft1_desired[fft1_first_inband]<0.5 &&
3656 fft1_first_inband<fft1_size-1) fft1_first_inband++;
3657 while(fft1_desired[fft1_last_inband]<0.5 &&
3658 fft1_last_inband > 0) fft1_last_inband--;
3659 if(fft1_last_inband-fft1_first_inband<fft1_size/32)lirerr(1057);
3660 t1=0;
3661 for(i=0;i<fft1_size; i++)
3662 {
3663 t1+=fft1_desired[i]*fft1_desired[i];
3664 }
3665 fft1_desired_totsum=t1;
3666 }
3667 }
3668 fft1_sumsq_recalc=fft1_first_point;
3669 fft1_first_sym_point=fft1_size-1-fft1_last_point;
3670 if(fft1_first_sym_point > fft1_first_point)
3671 fft1_first_sym_point=fft1_first_point;
3672 fft1_last_sym_point=fft1_size-1-fft1_first_sym_point;
3673 }
3674
make_filcorrstart(void)3675 void make_filcorrstart(void)
3676 {
3677 fft1_filtercorr_start=150*(float)fft1_size*(float)pow((double)(fft1_size),-0.4);
3678 if( (ui.rx_input_mode&DWORD_INPUT) != 0)
3679 {
3680 fft1_filtercorr_start*=4096;
3681 if( fft_cntrl[FFT1_CURMODE].permute == 2)fft1_filtercorr_start*=16;
3682 if( (ui.rx_input_mode&IQ_DATA) != 0)
3683 {
3684 fft1_filtercorr_start*=12;
3685 }
3686 if( fft_cntrl[FFT1_CURMODE].real2complex != 0)fft1_filtercorr_start*=32 ;
3687 }
3688 else
3689 {
3690 if( fft_cntrl[FFT1_CURMODE].real2complex != 0)fft1_filtercorr_start*=2;
3691 }
3692 fft1_filtercorr_start=(float)genparm[FIRST_FFT_GAIN]/fft1_filtercorr_start;
3693 }
3694
clear_fft1_filtercorr(void)3695 void clear_fft1_filtercorr(void)
3696 {
3697 float t1, t2, t3;
3698 int i, j, k, mm;
3699 fft1_calibrate_flag&=CALIQ;
3700 settextcolor(8);
3701 if(ui.operator_skil != OPERATOR_SKIL_NEWCOMER)
3702 {
3703 for(i=3; i<20; i++)lir_text(40,i,"FILTERS NOT CALIBRATED!!");
3704 }
3705 make_filcorrstart();
3706 settextcolor(7);
3707 mm=twice_rxchan;
3708 for(i=0; i<fft1_size; i++)
3709 {
3710 fft1_desired[i]=1;
3711 for(j=0; j<mm; j+=2)
3712 {
3713 fft1_filtercorr[mm*i+j ]=fft1_filtercorr_start;
3714 fft1_filtercorr[mm*i+j+1]=0;
3715 }
3716 }
3717 // A DC offset on the A/D converters cause signals
3718 // at frequency=0 and at frequency=fft1_size/2.
3719 // These frequencies are not properly separated
3720 // by the backwards fft in case a window N other
3721 // than 0 or 2 is used.
3722 // Signals very close to the Nyquist frequency
3723 // are artifacts anyway so we set the desired response
3724 // to filter them out.
3725 {
3726 t1=0.125F*(float)PI_L;
3727 t2=0;
3728 i=0;
3729 k=fft1_size-1;
3730 while(t2 < 0.5*PI_L)
3731 {
3732 t3=(float)(sin(t2)*sin(t2));
3733 if(t2<0)t3=0;
3734 if( (ui.rx_input_mode&IQ_DATA) != 0)
3735 {
3736 fft1_desired[i]=t3;
3737 for(j=0; j<mm; j+=2)fft1_filtercorr[mm*i+j ]=t3*fft1_filtercorr_start;
3738 }
3739 fft1_desired[k]=t3;
3740 for(j=0; j<mm; j+=2)fft1_filtercorr[mm*k+j ]=t3*fft1_filtercorr_start;
3741 t2+=t1;
3742 i++;
3743 k--;
3744 }
3745 }
3746 }
3747
clear_iq_foldcorr(void)3748 void clear_iq_foldcorr(void)
3749 {
3750 int i, mm;
3751 settextcolor(8);
3752 if(ui.operator_skil != OPERATOR_SKIL_NEWCOMER)
3753 {
3754 for(i=3; i<20; i++)lir_text(10,i,"I/Q PHASE NOT CALIBRATED!!");
3755 }
3756 mm=fft1_size*twice_rxchan;
3757 for(i=0; i<mm; i++)fft1_foldcorr[i]=0;
3758 fft1_calibrate_flag&=CALAMP;
3759 settextcolor(7);
3760 bal_updflag=1;
3761 }
3762
use_iqcorr(void)3763 void use_iqcorr(void)
3764 {
3765 cal_table=malloc((unsigned int)fft1_size*sizeof(COSIN_TABLE )/2);
3766 cal_permute=malloc((unsigned int)fft1_size*sizeof(short int));
3767 if( cal_table == NULL || cal_permute == NULL)
3768 {
3769 lirerr(1110);
3770 return;
3771 }
3772 init_fft(0,fft1_n, fft1_size, cal_table, cal_permute);
3773 expand_foldcorr(fft1_foldcorr,fftw_tmp);
3774 free(cal_table);
3775 free(cal_permute);
3776 if(DISREGARD_RAWFILE_IQCORR)
3777 {
3778 fft1_calibrate_flag&=CALAMP;
3779 }
3780 else
3781 {
3782 fft1_calibrate_flag|=CALIQ;
3783 }
3784 }
3785
init_foldcorr(void)3786 void init_foldcorr(void)
3787 {
3788 int rdbuf[10],chkbuf[10];
3789 int i, kk;
3790 FILE *file;
3791 char s[80];
3792 #if SAVE_RAWFILE_IQCORR == TRUE
3793 FILE *new_corr_file;
3794 new_corr_file=NULL;
3795 #endif
3796 if( (ui.rx_input_mode&DIGITAL_IQ) != 0 || (ui.rx_input_mode&IQ_DATA) == 0)
3797 {
3798 return;
3799 }
3800 make_iqcorr_filename(s);
3801 if(diskread_flag == 2 && (save_init_flag&2) == 2)
3802 {
3803 file=save_rd_file;
3804 #if SAVE_RAWFILE_IQCORR == TRUE
3805 new_corr_file=fopen(s, "wb");
3806 if(new_corr_file == NULL)
3807 {
3808 lirerr(594222);
3809 return;
3810 }
3811 #endif
3812 }
3813 else
3814 {
3815 file = fopen(s, "rb");
3816 }
3817 if (file == NULL)
3818 {
3819 clear_iq_foldcorr();
3820 return;
3821 }
3822 else
3823 {
3824 i=(int)fread(rdbuf, sizeof(int),10,file);
3825 if(i != 10)goto corrupt;
3826 #if SAVE_RAWFILE_IQCORR == TRUE
3827 if(new_corr_file != NULL)
3828 {
3829 i=fwrite(rdbuf, sizeof(int),10,new_corr_file);
3830 if(i != 10)
3831 {
3832 new_corrfile_errx:;
3833 fclose(new_corr_file);
3834 lirerr(497326);
3835 return;
3836 }
3837 }
3838 #endif
3839 if( rdbuf[1] != (ui.rx_input_mode&IQ_DATA) ||
3840 rdbuf[2] != ui.rx_ad_speed ||
3841 rdbuf[3] != ui.rx_rf_channels ||
3842 rdbuf[4] != FOLDCORR_VERNR )
3843 {
3844 if(diskread_flag == 2 && (save_init_flag&2) == 2)
3845 {
3846 corrupt:;
3847 lirerr(1060);
3848 return;
3849 }
3850 clear_iq_foldcorr();
3851 }
3852 else
3853 {
3854 bal_segments=rdbuf[0];
3855 kk=twice_rxchan*4*bal_segments;
3856 contracted_iq_foldcorr=malloc((unsigned int)kk*sizeof(float));
3857 if(contracted_iq_foldcorr == NULL)
3858 {
3859 lirerr(1171);
3860 return;
3861 }
3862 if(kk != (int)fread(contracted_iq_foldcorr, sizeof(float),
3863 (unsigned int)kk, file))goto err;
3864 for(i=0; i<kk; i++)
3865 {
3866 if(contracted_iq_foldcorr[i] > BIG || contracted_iq_foldcorr[i] < -BIG)
3867 {
3868 lirerr(1202);
3869 return;
3870 }
3871 }
3872 #if SAVE_RAWFILE_IQCORR == TRUE
3873 if(new_corr_file != NULL)
3874 {
3875 if(kk != (int)fwrite(contracted_iq_foldcorr, 1, kk, new_corr_file))
3876 goto new_corrfile_errx;
3877 }
3878 #endif
3879 if(10 != fread(chkbuf, sizeof(int),10,file))goto err;
3880 #if SAVE_RAWFILE_IQCORR == TRUE
3881 if(new_corr_file != NULL)
3882 {
3883 if(10 != fwrite(chkbuf, sizeof(int),10, new_corr_file))
3884 goto new_corrfile_errx;
3885 }
3886 #endif
3887 for(i=0; i<10; i++)
3888 {
3889 if(rdbuf[i]!=chkbuf[i])
3890 {
3891 err:;
3892 lirerr(1053);
3893 goto exx;
3894 }
3895 }
3896 #if SAVE_RAWFILE_IQCORR == TRUE
3897 if(new_corr_file != NULL)fclose(new_corr_file);
3898 #endif
3899 if(diskread_flag != 2 || (save_init_flag&2) == 0)fclose(file);
3900 use_iqcorr();
3901 exx:;
3902 free(contracted_iq_foldcorr);
3903 }
3904 }
3905 }
3906
3907
resize_filtercorr_td_to_fd(int to_fd,int size_in,float * buf_in,int n_out,int size_out,float * buf_out)3908 void resize_filtercorr_td_to_fd(int to_fd, int size_in, float *buf_in,
3909 int n_out, int size_out, float *buf_out)
3910 {
3911 int ka, kb;
3912 int i, j, k, mm;
3913 int mask, ia, ib;
3914 double sum[4],isum[4];
3915 D_COSIN_TABLE *out_ffttab;
3916 unsigned short int *out_permute;
3917 double *ww;
3918 double dt3, dt4;
3919 double dt1, dt2, dr1, dr2;
3920 if(size_in < 8)lirerr(1161);
3921 mm=twice_rxchan;
3922 out_ffttab=malloc((unsigned int)size_out*sizeof(D_COSIN_TABLE )/2);
3923 if( out_ffttab == NULL)
3924 {
3925 mem_err1:;
3926 lirerr(1141);
3927 return;
3928 }
3929 out_permute=malloc((unsigned int)size_out*sizeof(short int));
3930 if(out_permute == NULL)
3931 {
3932 mem_err2:;
3933 free(out_ffttab);
3934 goto mem_err1;
3935 }
3936 ww=malloc((unsigned int)(mm*size_out)*sizeof(double));
3937 if(ww == NULL)
3938 {
3939 free(out_permute);
3940 goto mem_err2;
3941 }
3942 init_d_fft(0, n_out, size_out, out_ffttab, out_permute);
3943 for(j=0; j<mm; j+=2)
3944 {
3945 if(size_out > size_in)
3946 {
3947 // Increase the number of points from size_in to size_out.
3948 // Store the impulse response at buf_out[0]
3949 // Fill zeroes in the undefined points.
3950 for(i=0; i<size_in/2; i++)
3951 {
3952 ww[2*i ]=buf_in[mm*i+j ];
3953 ww[2*i+1]=buf_in[mm*i+j+1];
3954 }
3955 for(i=size_in/2; i<size_in; i++)
3956 {
3957 k=i+size_out-size_in;
3958 ww[2*k ]=buf_in[mm*i+j ];
3959 ww[2*k+1]=buf_in[mm*i+j+1];
3960 }
3961 for(i=size_in/2; i<size_out-size_in/2; i++)
3962 {
3963 ww[2*i ]=0;
3964 ww[2*i+1]=0;
3965 }
3966 // The fourier transform has to be periodic. We have now introduced
3967 // two discontinuities in case the pulse response is long enough
3968 // to not have fallen off completely at the midpoint of the input waveform.
3969 // To remove the discontinuity, make a smooth transition to
3970 // the zero region using the periodicity of the transform.
3971 ia=size_in/2-1;
3972 ib=ia+1;
3973 ka=size_out-size_in/2;
3974 kb=ka-1;
3975 dt3=0.25*PI_L;
3976 dt4=10*dt3/size_in;
3977 while(dt3 >0 && ia >= 0)
3978 {
3979 dt1=ww[2*ia];
3980 dt2=ww[2*ka];
3981 dr1=pow(sin(dt3),2.0);
3982 dr2=pow(cos(dt3),2.0);
3983 ww[2*ib]=dr1*dt2;
3984 ww[2*kb]=dr1*dt1;
3985 ww[2*ia]=dr2*dt1+dr1*dt2;
3986 ww[2*ka]=dr1*dt1+dr2*dt2;
3987 dt1=ww[2*ia+1];
3988 dt2=ww[2*ka+1];
3989 ww[2*ib+1]=dr1*dt2;
3990 ww[2*kb+1]=dr1*dt1;
3991 ww[2*ia+1]=dr2*dt1+dr1*dt2;
3992 ww[2*ka+1]=dr1*dt1+dr2*dt2;
3993 ia--;
3994 ka++;
3995 ib++;
3996 kb--;
3997 dt3-=dt4;
3998 }
3999 }
4000 else
4001 {
4002 for(i=0; i<size_out/2; i++)
4003 {
4004 ww[2*i ]=buf_in[mm*i+j ];
4005 ww[2*i+1]=buf_in[mm*i+j+1];
4006 }
4007 for(i=size_out/2; i<size_out; i++)
4008 {
4009 k=size_in-size_out+i;
4010 ww[2*i ]=buf_in[mm*k+j ];
4011 ww[2*i+1]=buf_in[mm*k+j+1];
4012 }
4013 // When limiting the pulse response in the time domain, we may
4014 // introduce a discontinuity. It will occur between size_out/2 and
4015 // fft1/size/2-1.
4016 // Differentiate the pulse response starting at the discontinuity:
4017 mask=size_out-1;
4018 ia=size_out/2;
4019 ib=ia+1;
4020 for(i=1; i<size_out; i++)
4021 {
4022 ww[ia*2 ]=ww[2*ia ]-ww[2*ib ];
4023 ww[ia*2+1]=ww[2*ia+1]-ww[2*ib+1];
4024 ia=(ia+1)&mask;
4025 ib=(ib+1)&mask;
4026 }
4027 ww[ia*2 ]=0;
4028 ww[ia*2+1]=0;
4029 sum[j ]=0;
4030 sum[j+1]=0;
4031 // Get the DC component so we can remove it from the derivative
4032 for(i=0; i<size_out; i++)
4033 {
4034 sum[j ]+=ww[2*i ];
4035 sum[j+1]+=ww[2*i+1];
4036 }
4037 sum[j]/=size_out;
4038 isum[j]=0;
4039 sum[j+1]/=size_out;
4040 isum[j+1]=0;
4041 // Integrate the pulse response:
4042 for(i=0; i<size_out; i++)
4043 {
4044 isum[j]+=ww[2*ia ]-sum[j];
4045 ww[2*ia ]=isum[j];
4046 isum[j+1]+=ww[2*ia+1]-sum[j+1];
4047 ww[2*ia+1]=isum[j+1];
4048 ia=(ia+mask)&mask;
4049 }
4050 }
4051 // Take the back transform to get the calibration function in
4052 // size_out points in the frequency domain.
4053 if(to_fd)d_fftback(size_out, n_out, ww, out_ffttab, out_permute);
4054 for(i=0; i<size_out; i++)
4055 {
4056 buf_out[mm*i+j ]=(float)ww[2*i ];
4057 buf_out[mm*i+j+1]=(float)ww[2*i+1];
4058 }
4059 }
4060 free(out_ffttab);
4061 free(out_permute);
4062 free(ww);
4063 }
4064
resize_fft1_desired(int siz_in,float * buf_in,int siz_out,float * buf_out)4065 void resize_fft1_desired(int siz_in, float *buf_in,
4066 int siz_out, float *buf_out)
4067 {
4068 int i, j, k, m;
4069 float t1, t2;
4070 if(siz_out > siz_in)
4071 {
4072 m=siz_out/siz_in;
4073 t2=0;
4074 for(j=siz_in; j>0; j--)
4075 {
4076 t1=t2;
4077 t2=buf_in[j-1];
4078 for(i=0; i<m; i++)
4079 {
4080 buf_out[m*j-i-1]=t1+(float)i*(t2-t1)/(float)m;
4081 }
4082 }
4083 buf_out[0]=0;
4084 }
4085 else
4086 {
4087 // Reduce buf_out.
4088 m=siz_in/siz_out;
4089 i=m/2;
4090 buf_out[0]=0;
4091 for(j=1; j<siz_out; j++)
4092 {
4093 buf_out[j]=0;
4094 for(k=0; k<m; k++)
4095 {
4096 buf_out[j]+=buf_in[i];
4097 i++;
4098 }
4099 buf_out[j]/=(float)m;
4100 }
4101 }
4102 }
4103
4104
use_filtercorr_td(int cal_size,float * corr,float * desired)4105 void use_filtercorr_td(int cal_size, float *corr, float *desired)
4106 {
4107 int i, j, k, mm;
4108 mm=twice_rxchan;
4109 resize_filtercorr_td_to_fd(TRUE,
4110 cal_size, corr, fft1_n, fft1_size, fft1_filtercorr);
4111 resize_fft1_desired(cal_size, desired, fft1_size, fft1_desired);
4112 i=0;
4113 while(fft1_desired[i] == 0 && i<fft1_size)
4114 {
4115 for(j=0; j<mm; j++) fft1_filtercorr[mm*i+j]=0;
4116 i++;
4117 }
4118 k=fft1_size-1;
4119 while(fft1_desired[k] == 0 && k>=0)
4120 {
4121 for(j=0; j<mm; j++) fft1_filtercorr[mm*k+j]=0;
4122 k--;
4123 }
4124 if(k-i < fft1_size/16+16)
4125 {
4126 lirerr(1259);
4127 return;
4128 }
4129 normalise_fft1_filtercorr(fft1_filtercorr);
4130 make_filcorrstart();
4131 for(i=0; i<mm*fft1_size; i++)
4132 {
4133 fft1_filtercorr[i]*=fft1_filtercorr_start;
4134 }
4135 for(i=0; i<fft1_size; i++)wg_waterf_sum[i]=0.00001F;
4136 fft1_calibrate_flag|=CALAMP;
4137 }
4138
convert_filtercorr_fd_to_td(int n,int siz,float * buf)4139 void convert_filtercorr_fd_to_td(int n, int siz, float *buf)
4140 {
4141 int i, j, mm;
4142 D_COSIN_TABLE *out_ffttab;
4143 unsigned short int *out_permute;
4144 double *ww;
4145 mm=twice_rxchan;
4146 out_ffttab=malloc((unsigned int)siz*sizeof(D_COSIN_TABLE )/2);
4147 if( out_ffttab == NULL)
4148 {
4149 mem_err1:;
4150 lirerr(1142);
4151 return;
4152 }
4153 out_permute=malloc((unsigned int)siz*sizeof(short int));
4154 if(out_permute == NULL)
4155 {
4156 mem_err2:;
4157 free(out_ffttab);
4158 goto mem_err1;
4159 }
4160 ww=malloc((unsigned int)(mm*siz)*sizeof(double));
4161 if(ww == NULL)
4162 {
4163 free(out_permute);
4164 goto mem_err2;
4165 }
4166 init_d_fft(0, n, siz, out_ffttab, out_permute);
4167 for(j=0; j<mm; j+=2)
4168 {
4169 for(i=0; i<siz; i++)
4170 {
4171 ww[2*i ]=buf[mm*i+j ];
4172 ww[2*i+1]=buf[mm*i+j+1];
4173 }
4174 d_fftforward(siz, n, ww, out_ffttab, out_permute);
4175 for(i=0; i<siz; i++)
4176 {
4177 buf[mm*i+j ]=(float)ww[2*i ];
4178 buf[mm*i+j+1]=(float)ww[2*i+1];
4179 }
4180 }
4181 }
4182
4183
4184
use_filtercorr_fd(int cal_n,int cal_size,float * cal_corr,float * cal_desired)4185 void use_filtercorr_fd(int cal_n, int cal_size,
4186 float *cal_corr, float *cal_desired)
4187 {
4188 convert_filtercorr_fd_to_td( cal_n, cal_size, cal_corr);
4189 use_filtercorr_td(cal_size, cal_corr, cal_desired);
4190 }
4191
init_fft1_filtercorr(void)4192 void init_fft1_filtercorr(void)
4193 {
4194 float *tmpbuf;
4195 int rdbuf[10], chkbuf[10];
4196 int i, mm;
4197 FILE *file;
4198 char s[80];
4199 float t1;
4200 #if DISREGARD_RAWFILE_CORR == TRUE
4201 int disregard_flag;
4202 #endif
4203 #if SAVE_RAWFILE_CORR == TRUE
4204 FILE *new_corr_file;
4205 new_corr_file=NULL;
4206 #endif
4207 #if DISREGARD_RAWFILE_CORR == TRUE
4208 #if SAVE_RAWFILE_CORR == TRUE
4209 lirerr(713126);
4210 #endif
4211 disregard_flag=0;
4212 #endif
4213 file=NULL;
4214 fft1_filtercorr_direction=1;
4215 if( ui.rx_addev_no == NETWORK_DEVICE_CODE &&
4216 (ui.network_flag & NET_RXIN_TIMF2) != 0)
4217 {
4218 clear_fft1_filtercorr();
4219 return;
4220 }
4221 mm=twice_rxchan;
4222 make_filfunc_filename(s);
4223 if(diskread_flag == 2 && (save_init_flag&1) == 1)
4224 {
4225 file=save_rd_file;
4226 #if SAVE_RAWFILE_CORR == TRUE
4227 new_corr_file=fopen(s, "wb");
4228 if(new_corr_file == NULL)
4229 {
4230 lirerr(594221);
4231 return;
4232 }
4233 #endif
4234 }
4235 else
4236 {
4237 file = fopen(s, "rb");
4238 }
4239 if (file == NULL)
4240 {
4241 #if DISREGARD_RAWFILE_CORR == TRUE
4242 disregard:;
4243 #endif
4244 clear_fft1_filtercorr();
4245 return;
4246 }
4247 i=(int)fread(rdbuf, sizeof(int),10,file);
4248 if(i != 10)
4249 {
4250 goto calerr;
4251 }
4252 #if SAVE_RAWFILE_CORR == TRUE
4253 if(new_corr_file != NULL)
4254 {
4255 i=fwrite(rdbuf, sizeof(int),10,new_corr_file);
4256 if(i != 10)
4257 {
4258 new_corrfile_errx:;
4259 fclose(new_corr_file);
4260 lirerr(497325);
4261 return;
4262 }
4263 }
4264 #endif
4265 t1=(float)(rdbuf[5]-ui.rx_ad_speed);
4266 t1=(float)fabs(200.0F*t1/(float)(rdbuf[5]+ui.rx_ad_speed));
4267 // t1 is now the speed error in %.
4268 if( rdbuf[2] <0 ||
4269 rdbuf[2] >= MAX_RX_MODE ||
4270 (rdbuf[3]&IQ_DATA) != (ui.rx_input_mode&IQ_DATA) ||
4271 t1 > 0.05 ||
4272 rdbuf[6] != ui.rx_rf_channels ||
4273 rdbuf[8] != 0 ||
4274 rdbuf[9] != 0 )
4275 {
4276 calerr:;
4277 if(diskread_flag == 2 && (save_init_flag&1) == 1)
4278 {
4279 lirerr(1059);
4280 return;
4281 }
4282 fclose(file);
4283 clear_fft1_filtercorr();
4284 #if SAVE_RAWFILE_CORR == TRUE
4285 if(new_corr_file != NULL)fclose(new_corr_file);
4286 #endif
4287 return;
4288 }
4289 if(rdbuf[7] == 0)
4290 {
4291 cal_fft1_n=rdbuf[0];
4292 cal_fft1_size=rdbuf[1];
4293 // The filtercorr function is saved in the frequency domain in
4294 // rdbuf[1] points.
4295 // This format is used during the initialisation procedures and
4296 // it may be kept for normal operation in case the number of points
4297 // will not be reduced by saving in the time domain.
4298 tmpbuf=malloc((unsigned int)(rdbuf[1]*(mm+1))*sizeof(float));
4299 if( tmpbuf == NULL )
4300 {
4301 lirerr(1143);
4302 return;
4303 }
4304 i=(int)fread(tmpbuf, (unsigned int)mm*sizeof(float),
4305 (unsigned int)rdbuf[1], file);
4306 if(i != rdbuf[1])
4307 {
4308 goto calerr;
4309 }
4310 #if SAVE_RAWFILE_CORR == TRUE
4311 if(new_corr_file != NULL)
4312 {
4313 i=fwrite(tmpbuf, mm*sizeof(float), rdbuf[1], new_corr_file);
4314 if(i != rdbuf[1])goto new_corrfile_errx;
4315 }
4316 #endif
4317 i=(int)fread(&tmpbuf[mm*rdbuf[1]], sizeof(float), (unsigned int)rdbuf[1], file);
4318 if(i != rdbuf[1])
4319 {
4320 goto calerr;
4321 }
4322 #if SAVE_RAWFILE_CORR == TRUE
4323 if(new_corr_file != NULL)
4324 {
4325 i=fwrite(&tmpbuf[mm*rdbuf[1]], sizeof(float), rdbuf[1], new_corr_file);
4326 if(i != rdbuf[1])goto new_corrfile_errx;
4327 }
4328 #endif
4329 use_filtercorr_fd(rdbuf[0], rdbuf[1], tmpbuf, &tmpbuf[mm*rdbuf[1]]);
4330 if(kill_all_flag)return;
4331 }
4332 else
4333 {
4334 // The correction function was stored in the time domain in rdbuf[7] points
4335 tmpbuf=malloc((unsigned int)(rdbuf[7]*(mm+1))*sizeof(float));
4336 if( tmpbuf == NULL )
4337 {
4338 lirerr(1292);
4339 return;
4340 }
4341 cal_fft1_size=rdbuf[7];
4342 cal_fft1_n=make_power_of_two(&cal_fft1_size);
4343 i=(int)fread(tmpbuf, (unsigned int)mm*sizeof(float), (unsigned int)rdbuf[7], file);
4344 if(i != rdbuf[7])
4345 {
4346 goto calerr;
4347 }
4348 #if SAVE_RAWFILE_CORR == TRUE
4349 if(new_corr_file != NULL)
4350 {
4351 i=fwrite(tmpbuf, mm*sizeof(float), rdbuf[7], new_corr_file);
4352 if(i != rdbuf[7])goto new_corrfile_errx;
4353 }
4354 #endif
4355 i=(int)fread(&tmpbuf[mm*rdbuf[7]], sizeof(float), (unsigned int)rdbuf[7], file);
4356 if(i != rdbuf[7])
4357 {
4358 goto calerr;
4359 }
4360 #if SAVE_RAWFILE_CORR == TRUE
4361 if(new_corr_file != NULL)
4362 {
4363 i=fwrite(&tmpbuf[mm*rdbuf[7]], sizeof(float), rdbuf[7], new_corr_file);
4364 if(i != rdbuf[7])goto new_corrfile_errx;
4365 }
4366 #endif
4367 use_filtercorr_td(rdbuf[7], tmpbuf, &tmpbuf[mm*rdbuf[7]]);
4368 if(kill_all_flag)return;
4369 }
4370 if(10 != fread(chkbuf, sizeof(int),10,file))goto exx;
4371 #if SAVE_RAWFILE_CORR == TRUE
4372 if(new_corr_file != NULL)
4373 {
4374 i=fwrite(chkbuf, sizeof(int),10, new_corr_file);
4375 if(i != 10)goto new_corrfile_errx;
4376 }
4377 #endif
4378 for(i=0; i<10; i++)
4379 {
4380 if(rdbuf[i]!=chkbuf[i])
4381 {
4382 exx:;
4383 if(diskread_flag==2)lirerr(1198); else lirerr(1052);
4384 return;
4385 }
4386 }
4387 #if SAVE_RAWFILE_CORR == TRUE
4388 if(new_corr_file != NULL)fclose(new_corr_file);
4389 #endif
4390 if(diskread_flag == 2 && (save_init_flag&1) == 1)
4391 {
4392 #if DISREGARD_RAWFILE_CORR == TRUE
4393 disregard_flag++;
4394 if(disregard_flag < 2)
4395 {
4396 file = fopen(s, "rb");
4397 goto disregard;
4398 }
4399 fclose(file);
4400 #endif
4401 return;
4402 }
4403 fclose(file);
4404 }
4405
4406