SDRAngel  4.11.5
Developer docs for <a href="https://github.com/f4exb/sdrangel">SDRangel<\a>, an Open Source Qt5 / OpenGL 3.0+ SDR and signal analyzer frontend to various hardware.
decimatorsff.cpp
Go to the documentation of this file.
1 // Copyright (C) 2018 Edouard Griffiths, F4EXB //
3 // //
4 // This program is free software; you can redistribute it and/or modify //
5 // it under the terms of the GNU General Public License as published by //
6 // the Free Software Foundation as version 3 of the License, or //
7 // (at your option) any later version. //
8 // //
9 // This program is distributed in the hope that it will be useful, //
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of //
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
12 // GNU General Public License V3 for more details. //
13 // //
14 // You should have received a copy of the GNU General Public License //
15 // along with this program. If not, see <http://www.gnu.org/licenses/>. //
17 
18 #include "decimatorsff.h"
19 
20 void DecimatorsFF::decimate1(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
21 {
22  float xreal, yimag;
23 
24  for (int pos = 0; pos < nbIAndQ - 1; pos += 2)
25  {
26  xreal = buf[pos+0];
27  yimag = buf[pos+1];
28  (**it).setReal(xreal);
29  (**it).setImag(yimag);
30  ++(*it); // Valgrind optim (comment not repeated)
31  }
32 }
33 
34 void DecimatorsFF::decimate2_cen(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
35 {
36  float intbuf[2];
37 
38  for (int pos = 0; pos < nbIAndQ - 3; pos += 4)
39  {
40  intbuf[0] = buf[pos+2];
41  intbuf[1] = buf[pos+3];
42 
44  buf[pos+0],
45  buf[pos+1],
46  &intbuf[0],
47  &intbuf[1]);
48 
49  (**it).setReal(intbuf[0]);
50  (**it).setImag(intbuf[1]);
51 
52  ++(*it);
53  }
54 }
55 
56 void DecimatorsFF::decimate2_inf(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
57 {
58  float xreal, yimag;
59 
60  for (int pos = 0; pos < nbIAndQ - 7; pos += 8)
61  {
62  xreal = (buf[pos+0] - buf[pos+3]);
63  yimag = (buf[pos+1] + buf[pos+2]);
64  (**it).setReal(xreal);
65  (**it).setImag(yimag);
66  ++(*it);
67 
68  xreal = (buf[pos+7] - buf[pos+4]);
69  yimag = (- buf[pos+5] - buf[pos+6]);
70  (**it).setReal(xreal);
71  (**it).setImag(yimag);
72  ++(*it);
73  }
74 }
75 
76 void DecimatorsFF::decimate2_sup(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
77 {
78  float xreal, yimag;
79 
80  for (int pos = 0; pos < nbIAndQ - 7; pos += 8)
81  {
82  xreal = (buf[pos+1] - buf[pos+2]);
83  yimag = (- buf[pos+0] - buf[pos+3]);
84  (**it).setReal(xreal);
85  (**it).setImag(yimag);
86  ++(*it);
87 
88  xreal = (buf[pos+6] - buf[pos+5]);
89  yimag = (buf[pos+4] + buf[pos+7]);
90  (**it).setReal(xreal);
91  (**it).setImag(yimag);
92  ++(*it);
93  }
94 }
95 
96 void DecimatorsFF::decimate4_inf(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
97 {
98  float xreal, yimag;
99 
100  for (int pos = 0; pos < nbIAndQ - 7; pos += 8)
101  {
102  xreal = (buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]);
103  yimag = (buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]);
104 
105  (**it).setReal(xreal);
106  (**it).setImag(yimag);
107 
108  ++(*it);
109  }
110 }
111 
112 void DecimatorsFF::decimate4_sup(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
113 {
114  // Sup (USB):
115  // x y x y x y x y / x -> 1,-2,-5,6 / y -> -0,-3,4,7
116  // [ rotate: 1, 0, -2, 3, -5, -4, 6, -7]
117  // Inf (LSB):
118  // x y x y x y x y / x -> 0,-3,-4,7 / y -> 1,2,-5,-6
119  // [ rotate: 0, 1, -3, 2, -4, -5, 7, -6]
120  float xreal, yimag;
121 
122  for (int pos = 0; pos < nbIAndQ - 7; pos += 8)
123  {
124  xreal = (buf[pos+1] - buf[pos+2] - buf[pos+5] + buf[pos+6]);
125  yimag = (- buf[pos+0] - buf[pos+3] + buf[pos+4] + buf[pos+7]);
126 
127  (**it).setReal(xreal);
128  (**it).setImag(yimag);
129 
130  ++(*it);
131  }
132 }
133 
134 void DecimatorsFF::decimate8_inf(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
135 {
136  float xreal[2], yimag[2];
137 
138  for (int pos = 0; pos < nbIAndQ - 15; pos += 8)
139  {
140  xreal[0] = (buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]);
141  yimag[0] = (buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]);
142  pos += 8;
143 
144  xreal[1] = (buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]);
145  yimag[1] = (buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]);
146 
147  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
148 
149  (**it).setReal(xreal[1]);
150  (**it).setImag(yimag[1]);
151 
152  ++(*it);
153  }
154 }
155 
156 void DecimatorsFF::decimate8_sup(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
157 {
158  float xreal[2], yimag[2];
159 
160  for (int pos = 0; pos < nbIAndQ - 15; pos += 8)
161  {
162  xreal[0] = (buf[pos+1] - buf[pos+2] - buf[pos+5] + buf[pos+6]);
163  yimag[0] = (- buf[pos+0] - buf[pos+3] + buf[pos+4] + buf[pos+7]);
164  pos += 8;
165 
166  xreal[1] = (buf[pos+1] - buf[pos+2] - buf[pos+5] + buf[pos+6]);
167  yimag[1] = (- buf[pos+0] - buf[pos+3] + buf[pos+4] + buf[pos+7]);
168 
169  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
170 
171  (**it).setReal(xreal[1]);
172  (**it).setImag(yimag[1]);
173 
174  ++(*it);
175  }
176 }
177 
178 void DecimatorsFF::decimate16_inf(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
179 {
180  // Offset tuning: 4x downsample and rotate, then
181  // downsample 4x more. [ rotate: 0, 1, -3, 2, -4, -5, 7, -6]
182  float xreal[4], yimag[4];
183 
184  for (int pos = 0; pos < nbIAndQ - 31; )
185  {
186  for (int i = 0; i < 4; i++)
187  {
188  xreal[i] = (buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]);
189  yimag[i] = (buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]);
190  pos += 8;
191  }
192 
193  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
194  m_decimator2.myDecimate(xreal[2], yimag[2], &xreal[3], &yimag[3]);
195 
196  m_decimator4.myDecimate(xreal[1], yimag[1], &xreal[3], &yimag[3]);
197 
198  (**it).setReal(xreal[3]);
199  (**it).setImag(yimag[3]);
200 
201  ++(*it);
202  }
203 }
204 
205 void DecimatorsFF::decimate16_sup(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
206 {
207  // Offset tuning: 4x downsample and rotate, then
208  // downsample 4x more. [ rotate: 1, 0, -2, 3, -5, -4, 6, -7]
209  float xreal[4], yimag[4];
210 
211  for (int pos = 0; pos < nbIAndQ - 31; )
212  {
213  for (int i = 0; i < 4; i++)
214  {
215  xreal[i] = (buf[pos+1] - buf[pos+2] - buf[pos+5] + buf[pos+6]);
216  yimag[i] = (buf[pos+4] + buf[pos+7] - buf[pos+0] - buf[pos+3]);
217  pos += 8;
218  }
219 
220  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
221  m_decimator2.myDecimate(xreal[2], yimag[2], &xreal[3], &yimag[3]);
222 
223  m_decimator4.myDecimate(xreal[1], yimag[1], &xreal[3], &yimag[3]);
224 
225  (**it).setReal(xreal[3]);
226  (**it).setImag(yimag[3]);
227 
228  ++(*it);
229  }
230 }
231 
232 void DecimatorsFF::decimate32_inf(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
233 {
234  float xreal[8], yimag[8];
235 
236  for (int pos = 0; pos < nbIAndQ - 63; )
237  {
238  for (int i = 0; i < 8; i++)
239  {
240  xreal[i] = (buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]);
241  yimag[i] = (buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]);
242  pos += 8;
243  }
244 
245  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
246  m_decimator2.myDecimate(xreal[2], yimag[2], &xreal[3], &yimag[3]);
247  m_decimator2.myDecimate(xreal[4], yimag[4], &xreal[5], &yimag[5]);
248  m_decimator2.myDecimate(xreal[6], yimag[6], &xreal[7], &yimag[7]);
249 
250  m_decimator4.myDecimate(xreal[1], yimag[1], &xreal[3], &yimag[3]);
251  m_decimator4.myDecimate(xreal[5], yimag[5], &xreal[7], &yimag[7]);
252 
253  m_decimator8.myDecimate(xreal[3], yimag[3], &xreal[7], &yimag[7]);
254 
255  (**it).setReal(xreal[7]);
256  (**it).setImag(yimag[7]);
257 
258  ++(*it);
259  }
260 }
261 
262 void DecimatorsFF::decimate32_sup(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
263 {
264  float xreal[8], yimag[8];
265 
266  for (int pos = 0; pos < nbIAndQ - 63; )
267  {
268  for (int i = 0; i < 8; i++)
269  {
270  xreal[i] = (buf[pos+1] - buf[pos+2] - buf[pos+5] + buf[pos+6]);
271  yimag[i] = (buf[pos+4] + buf[pos+7] - buf[pos+0] - buf[pos+3]);
272  pos += 8;
273  }
274 
275  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
276  m_decimator2.myDecimate(xreal[2], yimag[2], &xreal[3], &yimag[3]);
277  m_decimator2.myDecimate(xreal[4], yimag[4], &xreal[5], &yimag[5]);
278  m_decimator2.myDecimate(xreal[6], yimag[6], &xreal[7], &yimag[7]);
279 
280  m_decimator4.myDecimate(xreal[1], yimag[1], &xreal[3], &yimag[3]);
281  m_decimator4.myDecimate(xreal[5], yimag[5], &xreal[7], &yimag[7]);
282 
283  m_decimator8.myDecimate(xreal[3], yimag[3], &xreal[7], &yimag[7]);
284 
285  (**it).setReal(xreal[7]);
286  (**it).setImag(yimag[7]);
287 
288  ++(*it);
289  }
290 }
291 
292 void DecimatorsFF::decimate64_inf(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
293 {
294  float xreal[16], yimag[16];
295 
296  for (int pos = 0; pos < nbIAndQ - 127; )
297  {
298  for (int i = 0; i < 16; i++)
299  {
300  xreal[i] = (buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]);
301  yimag[i] = (buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]);
302  pos += 8;
303  }
304 
305  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
306  m_decimator2.myDecimate(xreal[2], yimag[2], &xreal[3], &yimag[3]);
307  m_decimator2.myDecimate(xreal[4], yimag[4], &xreal[5], &yimag[5]);
308  m_decimator2.myDecimate(xreal[6], yimag[6], &xreal[7], &yimag[7]);
309  m_decimator2.myDecimate(xreal[8], yimag[8], &xreal[9], &yimag[9]);
310  m_decimator2.myDecimate(xreal[10], yimag[10], &xreal[11], &yimag[11]);
311  m_decimator2.myDecimate(xreal[12], yimag[12], &xreal[13], &yimag[13]);
312  m_decimator2.myDecimate(xreal[14], yimag[14], &xreal[15], &yimag[15]);
313 
314  m_decimator4.myDecimate(xreal[1], yimag[1], &xreal[3], &yimag[3]);
315  m_decimator4.myDecimate(xreal[5], yimag[5], &xreal[7], &yimag[7]);
316  m_decimator4.myDecimate(xreal[9], yimag[9], &xreal[11], &yimag[11]);
317  m_decimator4.myDecimate(xreal[13], yimag[13], &xreal[15], &yimag[15]);
318 
319  m_decimator8.myDecimate(xreal[3], yimag[3], &xreal[7], &yimag[7]);
320  m_decimator8.myDecimate(xreal[11], yimag[11], &xreal[15], &yimag[15]);
321 
322  m_decimator16.myDecimate(xreal[7], yimag[7], &xreal[15], &yimag[15]);
323 
324  (**it).setReal(xreal[15]);
325  (**it).setImag(yimag[15]);
326 
327  ++(*it);
328  }
329 }
330 
331 void DecimatorsFF::decimate64_sup(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
332 {
333  float xreal[16], yimag[16];
334 
335  for (int pos = 0; pos < nbIAndQ - 127; )
336  {
337  for (int i = 0; i < 16; i++)
338  {
339  xreal[i] = (buf[pos+1] - buf[pos+2] - buf[pos+5] + buf[pos+6]);
340  yimag[i] = (buf[pos+4] + buf[pos+7] - buf[pos+0] - buf[pos+3]);
341  pos += 8;
342  }
343 
344  m_decimator2.myDecimate(xreal[0], yimag[0], &xreal[1], &yimag[1]);
345  m_decimator2.myDecimate(xreal[2], yimag[2], &xreal[3], &yimag[3]);
346  m_decimator2.myDecimate(xreal[4], yimag[4], &xreal[5], &yimag[5]);
347  m_decimator2.myDecimate(xreal[6], yimag[6], &xreal[7], &yimag[7]);
348  m_decimator2.myDecimate(xreal[8], yimag[8], &xreal[9], &yimag[9]);
349  m_decimator2.myDecimate(xreal[10], yimag[10], &xreal[11], &yimag[11]);
350  m_decimator2.myDecimate(xreal[12], yimag[12], &xreal[13], &yimag[13]);
351  m_decimator2.myDecimate(xreal[14], yimag[14], &xreal[15], &yimag[15]);
352 
353  m_decimator4.myDecimate(xreal[1], yimag[1], &xreal[3], &yimag[3]);
354  m_decimator4.myDecimate(xreal[5], yimag[5], &xreal[7], &yimag[7]);
355  m_decimator4.myDecimate(xreal[9], yimag[9], &xreal[11], &yimag[11]);
356  m_decimator4.myDecimate(xreal[13], yimag[13], &xreal[15], &yimag[15]);
357 
358  m_decimator8.myDecimate(xreal[3], yimag[3], &xreal[7], &yimag[7]);
359  m_decimator8.myDecimate(xreal[11], yimag[11], &xreal[15], &yimag[15]);
360 
361  m_decimator16.myDecimate(xreal[7], yimag[7], &xreal[15], &yimag[15]);
362 
363  (**it).setReal(xreal[15]);
364  (**it).setImag(yimag[15]);
365 
366  ++(*it);
367  }
368 }
369 
370 void DecimatorsFF::decimate4_cen(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
371 {
372  float intbuf[4];
373 
374  for (int pos = 0; pos < nbIAndQ - 7; pos += 8)
375  {
376  intbuf[0] = buf[pos+2];
377  intbuf[1] = buf[pos+3];
378  intbuf[2] = buf[pos+6];
379  intbuf[3] = buf[pos+7];
380 
382  buf[pos+0],
383  buf[pos+1],
384  &intbuf[0],
385  &intbuf[1]);
387  buf[pos+4],
388  buf[pos+5],
389  &intbuf[2],
390  &intbuf[3]);
391 
393  intbuf[0],
394  intbuf[1],
395  &intbuf[2],
396  &intbuf[3]);
397 
398  (**it).setReal(intbuf[2]);
399  (**it).setImag(intbuf[3]);
400  ++(*it);
401  }
402 }
403 
404 void DecimatorsFF::decimate8_cen(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
405 {
406  float intbuf[8];
407 
408  for (int pos = 0; pos < nbIAndQ - 15; pos += 16)
409  {
410  intbuf[0] = buf[pos+2];
411  intbuf[1] = buf[pos+3];
412  intbuf[2] = buf[pos+6];
413  intbuf[3] = buf[pos+7];
414  intbuf[4] = buf[pos+10];
415  intbuf[5] = buf[pos+11];
416  intbuf[6] = buf[pos+14];
417  intbuf[7] = buf[pos+15];
418 
420  buf[pos+0],
421  buf[pos+1],
422  &intbuf[0],
423  &intbuf[1]);
425  buf[pos+4],
426  buf[pos+5],
427  &intbuf[2],
428  &intbuf[3]);
430  buf[pos+8],
431  buf[pos+9],
432  &intbuf[4],
433  &intbuf[5]);
435  buf[pos+12],
436  buf[pos+13],
437  &intbuf[6],
438  &intbuf[7]);
439 
441  intbuf[0],
442  intbuf[1],
443  &intbuf[2],
444  &intbuf[3]);
446  intbuf[4],
447  intbuf[5],
448  &intbuf[6],
449  &intbuf[7]);
450 
452  intbuf[2],
453  intbuf[3],
454  &intbuf[6],
455  &intbuf[7]);
456 
457  (**it).setReal(intbuf[6]);
458  (**it).setImag(intbuf[7]);
459  ++(*it);
460  }
461 }
462 
463 void DecimatorsFF::decimate16_cen(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
464 {
465  float intbuf[16];
466 
467  for (int pos = 0; pos < nbIAndQ - 31; pos += 32)
468  {
469  intbuf[0] = buf[pos+2];
470  intbuf[1] = buf[pos+3];
471  intbuf[2] = buf[pos+6];
472  intbuf[3] = buf[pos+7];
473  intbuf[4] = buf[pos+10];
474  intbuf[5] = buf[pos+11];
475  intbuf[6] = buf[pos+14];
476  intbuf[7] = buf[pos+15];
477  intbuf[8] = buf[pos+18];
478  intbuf[9] = buf[pos+19];
479  intbuf[10] = buf[pos+22];
480  intbuf[11] = buf[pos+23];
481  intbuf[12] = buf[pos+26];
482  intbuf[13] = buf[pos+27];
483  intbuf[14] = buf[pos+30];
484  intbuf[15] = buf[pos+31];
485 
487  buf[pos+0],
488  buf[pos+1],
489  &intbuf[0],
490  &intbuf[1]);
492  buf[pos+4],
493  buf[pos+5],
494  &intbuf[2],
495  &intbuf[3]);
497  buf[pos+8],
498  buf[pos+9],
499  &intbuf[4],
500  &intbuf[5]);
502  buf[pos+12],
503  buf[pos+13],
504  &intbuf[6],
505  &intbuf[7]);
507  buf[pos+16],
508  buf[pos+17],
509  &intbuf[8],
510  &intbuf[9]);
512  buf[pos+20],
513  buf[pos+21],
514  &intbuf[10],
515  &intbuf[11]);
517  buf[pos+24],
518  buf[pos+25],
519  &intbuf[12],
520  &intbuf[13]);
522  buf[pos+28],
523  buf[pos+29],
524  &intbuf[14],
525  &intbuf[15]);
526 
528  intbuf[0],
529  intbuf[1],
530  &intbuf[2],
531  &intbuf[3]);
533  intbuf[4],
534  intbuf[5],
535  &intbuf[6],
536  &intbuf[7]);
538  intbuf[8],
539  intbuf[9],
540  &intbuf[10],
541  &intbuf[11]);
543  intbuf[12],
544  intbuf[13],
545  &intbuf[14],
546  &intbuf[15]);
547 
549  intbuf[2],
550  intbuf[3],
551  &intbuf[6],
552  &intbuf[7]);
554  intbuf[10],
555  intbuf[11],
556  &intbuf[14],
557  &intbuf[15]);
558 
560  intbuf[6],
561  intbuf[7],
562  &intbuf[14],
563  &intbuf[15]);
564 
565  (**it).setReal(intbuf[14]);
566  (**it).setImag(intbuf[15]);
567  ++(*it);
568  }
569 }
570 
571 void DecimatorsFF::decimate32_cen(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
572 {
573  float intbuf[32];
574 
575  for (int pos = 0; pos < nbIAndQ - 63; pos += 64)
576  {
577  intbuf[0] = buf[pos+2];
578  intbuf[1] = buf[pos+3];
579  intbuf[2] = buf[pos+6];
580  intbuf[3] = buf[pos+7];
581  intbuf[4] = buf[pos+10];
582  intbuf[5] = buf[pos+11];
583  intbuf[6] = buf[pos+14];
584  intbuf[7] = buf[pos+15];
585  intbuf[8] = buf[pos+18];
586  intbuf[9] = buf[pos+19];
587  intbuf[10] = buf[pos+22];
588  intbuf[11] = buf[pos+23];
589  intbuf[12] = buf[pos+26];
590  intbuf[13] = buf[pos+27];
591  intbuf[14] = buf[pos+30];
592  intbuf[15] = buf[pos+31];
593  intbuf[16] = buf[pos+34];
594  intbuf[17] = buf[pos+35];
595  intbuf[18] = buf[pos+38];
596  intbuf[19] = buf[pos+39];
597  intbuf[20] = buf[pos+42];
598  intbuf[21] = buf[pos+43];
599  intbuf[22] = buf[pos+46];
600  intbuf[23] = buf[pos+47];
601  intbuf[24] = buf[pos+50];
602  intbuf[25] = buf[pos+51];
603  intbuf[26] = buf[pos+54];
604  intbuf[27] = buf[pos+55];
605  intbuf[28] = buf[pos+58];
606  intbuf[29] = buf[pos+59];
607  intbuf[30] = buf[pos+62];
608  intbuf[31] = buf[pos+63];
609 
611  buf[pos+0],
612  buf[pos+1],
613  &intbuf[0],
614  &intbuf[1]);
616  buf[pos+4],
617  buf[pos+5],
618  &intbuf[2],
619  &intbuf[3]);
621  buf[pos+8],
622  buf[pos+9],
623  &intbuf[4],
624  &intbuf[5]);
626  buf[pos+12],
627  buf[pos+13],
628  &intbuf[6],
629  &intbuf[7]);
631  buf[pos+16],
632  buf[pos+17],
633  &intbuf[8],
634  &intbuf[9]);
636  buf[pos+20],
637  buf[pos+21],
638  &intbuf[10],
639  &intbuf[11]);
641  buf[pos+24],
642  buf[pos+25],
643  &intbuf[12],
644  &intbuf[13]);
646  buf[pos+28],
647  buf[pos+29],
648  &intbuf[14],
649  &intbuf[15]);
651  buf[pos+32],
652  buf[pos+33],
653  &intbuf[16],
654  &intbuf[17]);
656  buf[pos+36],
657  buf[pos+37],
658  &intbuf[18],
659  &intbuf[19]);
661  buf[pos+40],
662  buf[pos+41],
663  &intbuf[20],
664  &intbuf[21]);
666  buf[pos+44],
667  buf[pos+45],
668  &intbuf[22],
669  &intbuf[23]);
671  buf[pos+48],
672  buf[pos+49],
673  &intbuf[24],
674  &intbuf[25]);
676  buf[pos+52],
677  buf[pos+53],
678  &intbuf[26],
679  &intbuf[27]);
681  buf[pos+56],
682  buf[pos+57],
683  &intbuf[28],
684  &intbuf[29]);
686  buf[pos+60],
687  buf[pos+61],
688  &intbuf[30],
689  &intbuf[31]);
690 
692  intbuf[0],
693  intbuf[1],
694  &intbuf[2],
695  &intbuf[3]);
697  intbuf[4],
698  intbuf[5],
699  &intbuf[6],
700  &intbuf[7]);
702  intbuf[8],
703  intbuf[9],
704  &intbuf[10],
705  &intbuf[11]);
707  intbuf[12],
708  intbuf[13],
709  &intbuf[14],
710  &intbuf[15]);
712  intbuf[16],
713  intbuf[17],
714  &intbuf[18],
715  &intbuf[19]);
717  intbuf[20],
718  intbuf[21],
719  &intbuf[22],
720  &intbuf[23]);
722  intbuf[24],
723  intbuf[25],
724  &intbuf[26],
725  &intbuf[27]);
727  intbuf[28],
728  intbuf[29],
729  &intbuf[30],
730  &intbuf[31]);
731 
733  intbuf[2],
734  intbuf[3],
735  &intbuf[6],
736  &intbuf[7]);
738  intbuf[10],
739  intbuf[11],
740  &intbuf[14],
741  &intbuf[15]);
743  intbuf[18],
744  intbuf[19],
745  &intbuf[22],
746  &intbuf[23]);
748  intbuf[26],
749  intbuf[27],
750  &intbuf[30],
751  &intbuf[31]);
752 
754  intbuf[6],
755  intbuf[7],
756  &intbuf[14],
757  &intbuf[15]);
759  intbuf[22],
760  intbuf[23],
761  &intbuf[30],
762  &intbuf[31]);
763 
765  intbuf[14],
766  intbuf[15],
767  &intbuf[30],
768  &intbuf[31]);
769 
770  (**it).setReal(intbuf[30]);
771  (**it).setImag(intbuf[31]);
772  ++(*it);
773  }
774 }
775 
776 void DecimatorsFF::decimate64_cen(FSampleVector::iterator* it, const float* buf, qint32 nbIAndQ)
777 {
778  float intbuf[64];
779 
780  for (int pos = 0; pos < nbIAndQ - 127; pos += 128)
781  {
782  intbuf[0] = buf[pos+2];
783  intbuf[1] = buf[pos+3];
784  intbuf[2] = buf[pos+6];
785  intbuf[3] = buf[pos+7];
786  intbuf[4] = buf[pos+10];
787  intbuf[5] = buf[pos+11];
788  intbuf[6] = buf[pos+14];
789  intbuf[7] = buf[pos+15];
790  intbuf[8] = buf[pos+18];
791  intbuf[9] = buf[pos+19];
792  intbuf[10] = buf[pos+22];
793  intbuf[11] = buf[pos+23];
794  intbuf[12] = buf[pos+26];
795  intbuf[13] = buf[pos+27];
796  intbuf[14] = buf[pos+30];
797  intbuf[15] = buf[pos+31];
798  intbuf[16] = buf[pos+34];
799  intbuf[17] = buf[pos+35];
800  intbuf[18] = buf[pos+38];
801  intbuf[19] = buf[pos+39];
802  intbuf[20] = buf[pos+42];
803  intbuf[21] = buf[pos+43];
804  intbuf[22] = buf[pos+46];
805  intbuf[23] = buf[pos+47];
806  intbuf[24] = buf[pos+50];
807  intbuf[25] = buf[pos+51];
808  intbuf[26] = buf[pos+54];
809  intbuf[27] = buf[pos+55];
810  intbuf[28] = buf[pos+58];
811  intbuf[29] = buf[pos+59];
812  intbuf[30] = buf[pos+62];
813  intbuf[31] = buf[pos+63];
814 
815  intbuf[32] = buf[pos+66];
816  intbuf[33] = buf[pos+67];
817  intbuf[34] = buf[pos+70];
818  intbuf[35] = buf[pos+71];
819  intbuf[36] = buf[pos+74];
820  intbuf[37] = buf[pos+75];
821  intbuf[38] = buf[pos+78];
822  intbuf[39] = buf[pos+79];
823  intbuf[40] = buf[pos+82];
824  intbuf[41] = buf[pos+83];
825  intbuf[42] = buf[pos+86];
826  intbuf[43] = buf[pos+87];
827  intbuf[44] = buf[pos+90];
828  intbuf[45] = buf[pos+91];
829  intbuf[46] = buf[pos+94];
830  intbuf[47] = buf[pos+95];
831  intbuf[48] = buf[pos+98];
832  intbuf[49] = buf[pos+99];
833  intbuf[50] = buf[pos+102];
834  intbuf[51] = buf[pos+103];
835  intbuf[52] = buf[pos+106];
836  intbuf[53] = buf[pos+107];
837  intbuf[54] = buf[pos+110];
838  intbuf[55] = buf[pos+111];
839  intbuf[56] = buf[pos+114];
840  intbuf[57] = buf[pos+115];
841  intbuf[58] = buf[pos+118];
842  intbuf[59] = buf[pos+119];
843  intbuf[60] = buf[pos+122];
844  intbuf[61] = buf[pos+123];
845  intbuf[62] = buf[pos+126];
846  intbuf[63] = buf[pos+127];
847 
849  buf[pos+0],
850  buf[pos+1],
851  &intbuf[0],
852  &intbuf[1]);
854  buf[pos+4],
855  buf[pos+5],
856  &intbuf[2],
857  &intbuf[3]);
859  buf[pos+8],
860  buf[pos+9],
861  &intbuf[4],
862  &intbuf[5]);
864  buf[pos+12],
865  buf[pos+13],
866  &intbuf[6],
867  &intbuf[7]);
869  buf[pos+16],
870  buf[pos+17],
871  &intbuf[8],
872  &intbuf[9]);
874  buf[pos+20],
875  buf[pos+21],
876  &intbuf[10],
877  &intbuf[11]);
879  buf[pos+24],
880  buf[pos+25],
881  &intbuf[12],
882  &intbuf[13]);
884  buf[pos+28],
885  buf[pos+29],
886  &intbuf[14],
887  &intbuf[15]);
889  buf[pos+32],
890  buf[pos+33],
891  &intbuf[16],
892  &intbuf[17]);
894  buf[pos+36],
895  buf[pos+37],
896  &intbuf[18],
897  &intbuf[19]);
899  buf[pos+40],
900  buf[pos+41],
901  &intbuf[20],
902  &intbuf[21]);
904  buf[pos+44],
905  buf[pos+45],
906  &intbuf[22],
907  &intbuf[23]);
909  buf[pos+48],
910  buf[pos+49],
911  &intbuf[24],
912  &intbuf[25]);
914  buf[pos+52],
915  buf[pos+53],
916  &intbuf[26],
917  &intbuf[27]);
919  buf[pos+56],
920  buf[pos+57],
921  &intbuf[28],
922  &intbuf[29]);
924  buf[pos+60],
925  buf[pos+61],
926  &intbuf[30],
927  &intbuf[31]);
929  buf[pos+64],
930  buf[pos+65],
931  &intbuf[32],
932  &intbuf[33]);
934  buf[pos+68],
935  buf[pos+69],
936  &intbuf[34],
937  &intbuf[35]);
939  buf[pos+72],
940  buf[pos+73],
941  &intbuf[36],
942  &intbuf[37]);
944  buf[pos+76],
945  buf[pos+77],
946  &intbuf[38],
947  &intbuf[39]);
949  buf[pos+80],
950  buf[pos+81],
951  &intbuf[40],
952  &intbuf[41]);
954  buf[pos+84],
955  buf[pos+85],
956  &intbuf[42],
957  &intbuf[43]);
959  buf[pos+88],
960  buf[pos+89],
961  &intbuf[44],
962  &intbuf[45]);
964  buf[pos+92],
965  buf[pos+93],
966  &intbuf[46],
967  &intbuf[47]);
969  buf[pos+96],
970  buf[pos+97],
971  &intbuf[48],
972  &intbuf[49]);
974  buf[pos+100],
975  buf[pos+101],
976  &intbuf[50],
977  &intbuf[51]);
979  buf[pos+104],
980  buf[pos+105],
981  &intbuf[52],
982  &intbuf[53]);
984  buf[pos+108],
985  buf[pos+109],
986  &intbuf[54],
987  &intbuf[55]);
989  buf[pos+112],
990  buf[pos+113],
991  &intbuf[56],
992  &intbuf[57]);
994  buf[pos+116],
995  buf[pos+117],
996  &intbuf[58],
997  &intbuf[59]);
999  buf[pos+120],
1000  buf[pos+121],
1001  &intbuf[60],
1002  &intbuf[61]);
1004  buf[pos+124],
1005  buf[pos+125],
1006  &intbuf[62],
1007  &intbuf[63]);
1008 
1010  intbuf[0],
1011  intbuf[1],
1012  &intbuf[2],
1013  &intbuf[3]);
1015  intbuf[4],
1016  intbuf[5],
1017  &intbuf[6],
1018  &intbuf[7]);
1020  intbuf[8],
1021  intbuf[9],
1022  &intbuf[10],
1023  &intbuf[11]);
1025  intbuf[12],
1026  intbuf[13],
1027  &intbuf[14],
1028  &intbuf[15]);
1030  intbuf[16],
1031  intbuf[17],
1032  &intbuf[18],
1033  &intbuf[19]);
1035  intbuf[20],
1036  intbuf[21],
1037  &intbuf[22],
1038  &intbuf[23]);
1040  intbuf[24],
1041  intbuf[25],
1042  &intbuf[26],
1043  &intbuf[27]);
1045  intbuf[28],
1046  intbuf[29],
1047  &intbuf[30],
1048  &intbuf[31]);
1050  intbuf[32],
1051  intbuf[33],
1052  &intbuf[34],
1053  &intbuf[35]);
1055  intbuf[36],
1056  intbuf[37],
1057  &intbuf[38],
1058  &intbuf[39]);
1060  intbuf[40],
1061  intbuf[41],
1062  &intbuf[42],
1063  &intbuf[43]);
1065  intbuf[44],
1066  intbuf[45],
1067  &intbuf[46],
1068  &intbuf[47]);
1070  intbuf[48],
1071  intbuf[49],
1072  &intbuf[50],
1073  &intbuf[51]);
1075  intbuf[52],
1076  intbuf[53],
1077  &intbuf[54],
1078  &intbuf[55]);
1080  intbuf[56],
1081  intbuf[57],
1082  &intbuf[58],
1083  &intbuf[59]);
1085  intbuf[60],
1086  intbuf[61],
1087  &intbuf[62],
1088  &intbuf[63]);
1089 
1091  intbuf[2],
1092  intbuf[3],
1093  &intbuf[6],
1094  &intbuf[7]);
1096  intbuf[10],
1097  intbuf[11],
1098  &intbuf[14],
1099  &intbuf[15]);
1101  intbuf[18],
1102  intbuf[19],
1103  &intbuf[22],
1104  &intbuf[23]);
1106  intbuf[26],
1107  intbuf[27],
1108  &intbuf[30],
1109  &intbuf[31]);
1111  intbuf[34],
1112  intbuf[35],
1113  &intbuf[38],
1114  &intbuf[39]);
1116  intbuf[42],
1117  intbuf[43],
1118  &intbuf[46],
1119  &intbuf[47]);
1121  intbuf[50],
1122  intbuf[51],
1123  &intbuf[54],
1124  &intbuf[55]);
1126  intbuf[58],
1127  intbuf[59],
1128  &intbuf[62],
1129  &intbuf[63]);
1130 
1132  intbuf[6],
1133  intbuf[7],
1134  &intbuf[14],
1135  &intbuf[15]);
1137  intbuf[22],
1138  intbuf[23],
1139  &intbuf[30],
1140  &intbuf[31]);
1142  intbuf[38],
1143  intbuf[39],
1144  &intbuf[46],
1145  &intbuf[47]);
1147  intbuf[54],
1148  intbuf[55],
1149  &intbuf[62],
1150  &intbuf[63]);
1151 
1153  intbuf[14],
1154  intbuf[15],
1155  &intbuf[30],
1156  &intbuf[31]);
1158  intbuf[46],
1159  intbuf[47],
1160  &intbuf[62],
1161  &intbuf[63]);
1162 
1164  intbuf[30],
1165  intbuf[31],
1166  &intbuf[62],
1167  &intbuf[63]);
1168 
1169  (**it).setReal(intbuf[62]);
1170  (**it).setImag(intbuf[63]);
1171  ++(*it);
1172  }
1173 }
1174 
void decimate16_sup(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate32_inf(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate64_inf(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
IntHalfbandFilterEOF< DECIMATORSFF_HB_FILTER_ORDER > m_decimator16
Definition: decimatorsff.h:53
IntHalfbandFilterEOF< DECIMATORSFF_HB_FILTER_ORDER > m_decimator4
Definition: decimatorsff.h:51
void decimate4_cen(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate8_sup(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate16_inf(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate64_cen(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
IntHalfbandFilterEOF< DECIMATORSFF_HB_FILTER_ORDER > m_decimator32
Definition: decimatorsff.h:54
void decimate4_inf(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
IntHalfbandFilterEOF< DECIMATORSFF_HB_FILTER_ORDER > m_decimator2
Definition: decimatorsff.h:50
void decimate32_cen(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate8_inf(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate2_cen(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
int32_t i
Definition: decimators.h:244
void decimate64_sup(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate2_inf(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate4_sup(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate16_cen(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
IntHalfbandFilterEOF< DECIMATORSFF_HB_FILTER_ORDER > m_decimator64
Definition: decimatorsff.h:55
void decimate8_cen(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate32_sup(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void decimate2_sup(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
void myDecimate(float x1, float y1, float *x2, float *y2)
void decimate1(FSampleVector::iterator *it, const float *buf, qint32 nbIAndQ)
IntHalfbandFilterEOF< DECIMATORSFF_HB_FILTER_ORDER > m_decimator8
Definition: decimatorsff.h:52