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