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.
interpolators.h
Go to the documentation of this file.
1 // Copyright (C) 2016-2017 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 #ifndef INCLUDE_GPL_DSP_INTERPOLATORS_H_
19 #define INCLUDE_GPL_DSP_INTERPOLATORS_H_
20 
21 #include "dsp/dsptypes.h"
22 #ifdef USE_SSE4_1
24 #else
26 #endif
27 
28 #define INTERPOLATORS_HB_FILTER_ORDER_FIRST 64
29 #define INTERPOLATORS_HB_FILTER_ORDER_SECOND 32
30 #define INTERPOLATORS_HB_FILTER_ORDER_NEXT 16
31 
32 template<uint SdrBits, uint OutputBits>
34 {
35  static const uint post1 = 0;
36  static const uint pre2 = 0;
37  static const uint post2 = 0;
38  static const uint pre4 = 0;
39  static const uint post4 = 0;
40  static const uint pre8 = 0;
41  static const uint post8 = 0;
42  static const uint pre16 = 0;
43  static const uint post16 = 0;
44  static const uint pre32 = 0;
45  static const uint post32 = 0;
46  static const uint pre64 = 0;
47  static const uint post64 = 0;
48 };
49 
50 template<>
51 struct interpolation_shifts<16, 16>
52 {
53  static const uint post1 = 0;
54  static const uint pre2 = 1;
55  static const uint post2 = 1;
56  static const uint pre4 = 2;
57  static const uint post4 = 2;
58  static const uint pre8 = 3;
59  static const uint post8 = 3;
60  static const uint pre16 = 3;
61  static const uint post16 = 3;
62  static const uint pre32 = 3;
63  static const uint post32 = 3;
64  static const uint pre64 = 3;
65  static const uint post64 = 3;
66 };
67 
68 template<>
69 struct interpolation_shifts<16, 12>
70 {
71  static const uint post1 = 4;
72  static const uint pre2 = 1;
73  static const uint post2 = 5;
74  static const uint pre4 = 2;
75  static const uint post4 = 6;
76  static const uint pre8 = 3;
77  static const uint post8 = 7;
78  static const uint pre16 = 3;
79  static const uint post16 = 7;
80  static const uint pre32 = 3;
81  static const uint post32 = 7;
82  static const uint pre64 = 3;
83  static const uint post64 = 7;
84 };
85 
86 template<>
87 struct interpolation_shifts<16, 8>
88 {
89  static const uint post1 = 8;
90  static const uint pre2 = 1;
91  static const uint post2 = 9;
92  static const uint pre4 = 2;
93  static const uint post4 = 10;
94  static const uint pre8 = 3;
95  static const uint post8 = 11;
96  static const uint pre16 = 3;
97  static const uint post16 = 11;
98  static const uint pre32 = 3;
99  static const uint post32 = 11;
100  static const uint pre64 = 3;
101  static const uint post64 = 11;
102 };
103 
104 template<typename T, uint SdrBits, uint OutputBits>
106 {
107 public:
108  // interleaved I/Q input buffer
109  void interpolate1(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
110 
111  void interpolate2_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
112  void interpolate2_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
113  void interpolate2_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
114 
115  void interpolate4_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
116  void interpolate4_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
117  void interpolate4_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
118 
119  void interpolate8_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
120  void interpolate8_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
121  void interpolate8_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
122 
123  void interpolate16_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
124  void interpolate16_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
125  void interpolate16_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
126 
127  void interpolate32_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
128  void interpolate32_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
129  void interpolate32_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
130 
131  void interpolate64_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
132  void interpolate64_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
133  void interpolate64_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ = false);
134 
135 private:
136 #ifdef USE_SSE4_1
137  IntHalfbandFilterEO1<INTERPOLATORS_HB_FILTER_ORDER_FIRST> m_interpolator2; // 1st stages
139  IntHalfbandFilterEO1<INTERPOLATORS_HB_FILTER_ORDER_NEXT> m_interpolator8; // 3rd stages
140  IntHalfbandFilterEO1<INTERPOLATORS_HB_FILTER_ORDER_NEXT> m_interpolator16; // 4th stages
141  IntHalfbandFilterEO1<INTERPOLATORS_HB_FILTER_ORDER_NEXT> m_interpolator32; // 5th stages
142  IntHalfbandFilterEO1<INTERPOLATORS_HB_FILTER_ORDER_NEXT> m_interpolator64; // 6th stages
143 #else
150 #endif
151 };
152 
153 template<typename T, uint SdrBits, uint OutputBits>
154 void Interpolators<T, SdrBits, OutputBits>::interpolate1(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
155 {
156  if (invertIQ)
157  {
158  for (int pos = 0; pos < len - 1; pos += 2)
159  {
160  buf[pos+1] = (**it).m_real >> interpolation_shifts<SdrBits, OutputBits>::post1;
161  buf[pos+0] = (**it).m_imag >> interpolation_shifts<SdrBits, OutputBits>::post1;
162  ++(*it);
163  }
164  }
165  else
166  {
167  for (int pos = 0; pos < len - 1; pos += 2)
168  {
169  buf[pos+0] = (**it).m_real >> interpolation_shifts<SdrBits, OutputBits>::post1;
170  buf[pos+1] = (**it).m_imag >> interpolation_shifts<SdrBits, OutputBits>::post1;
171  ++(*it);
172  }
173  }
174 }
175 
176 template<typename T, uint SdrBits, uint OutputBits>
177 void Interpolators<T, SdrBits, OutputBits>::interpolate2_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
178 {
179  qint32 intbuf[4];
180  qint32 *bufI, *bufQ;
181 
182  if (invertIQ)
183  {
184  bufI = &intbuf[1];
185  bufQ = &intbuf[0];
186  }
187  else
188  {
189  bufI = &intbuf[0];
190  bufQ = &intbuf[1];
191  }
192 
193  for (int pos = 0; pos < len - 3; pos += 4)
194  {
195  *bufI = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre2;
196  *bufQ = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre2;
197 // intbuf[2] = 0;
198 // intbuf[3] = 0;
199 
200  m_interpolator2.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3]);
201 
202  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post2;
203  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post2;
204  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post2;
205  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post2;
206 
207  ++(*it);
208  }
209 }
210 
211 template<typename T, uint SdrBits, uint OutputBits>
212 void Interpolators<T, SdrBits, OutputBits>::interpolate2_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
213 {
214  qint32 intbuf[8];
215  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
216 
217  if (invertIQ)
218  {
219  bufI0 = &intbuf[1];
220  bufQ0 = &intbuf[0];
221  bufI1 = &intbuf[5];
222  bufQ1 = &intbuf[4];
223  }
224  else
225  {
226  bufI0 = &intbuf[0];
227  bufQ0 = &intbuf[1];
228  bufI1 = &intbuf[4];
229  bufQ1 = &intbuf[5];
230  }
231 
232  for (int pos = 0; pos < len - 7; pos += 8)
233  {
234  memset(intbuf, 0, 8*sizeof(qint32));
235 
236  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre2;
237  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre2;
238  ++(*it);
239  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre2;
240  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre2;
241  ++(*it);
242 
243  m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
244 
245  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post2;
246  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post2;
247  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post2;
248  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post2;
249  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post2;
250  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post2;
251  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post2;
252  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post2;
253  }
254 }
255 
256 template<typename T, uint SdrBits, uint OutputBits>
257 void Interpolators<T, SdrBits, OutputBits>::interpolate2_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
258 {
259  qint32 intbuf[8];
260  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
261 
262  if (invertIQ)
263  {
264  bufI0 = &intbuf[1];
265  bufQ0 = &intbuf[0];
266  bufI1 = &intbuf[5];
267  bufQ1 = &intbuf[4];
268  }
269  else
270  {
271  bufI0 = &intbuf[0];
272  bufQ0 = &intbuf[1];
273  bufI1 = &intbuf[4];
274  bufQ1 = &intbuf[5];
275  }
276 
277  for (int pos = 0; pos < len - 7; pos += 8)
278  {
279  memset(intbuf, 0, 8*sizeof(qint32));
280 
281  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre2;
282  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre2;
283  ++(*it);
284  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre2;
285  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre2;
286  ++(*it);
287 
288  m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
289 
290  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post2;
291  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post2;
292  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post2;
293  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post2;
294  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post2;
295  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post2;
296  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post2;
297  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post2;
298  }
299 }
300 
301 template<typename T, uint SdrBits, uint OutputBits>
302 void Interpolators<T, SdrBits, OutputBits>::interpolate4_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
303 {
304  qint32 intbuf[8];
305  qint32 *bufI, *bufQ;
306 
307  if (invertIQ)
308  {
309  bufI = &intbuf[1];
310  bufQ = &intbuf[0];
311  }
312  else
313  {
314  bufI = &intbuf[0];
315  bufQ = &intbuf[1];
316  }
317 
318  for (int pos = 0; pos < len - 7; pos += 8)
319  {
320  memset(intbuf, 0, 8*sizeof(qint32));
321  *bufI = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre4;
322  *bufQ = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre4;
323 
324  m_interpolator2.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5]);
325 
326  m_interpolator4.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3]);
327  m_interpolator4.myInterpolate(&intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
328 
329  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post4;
330  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post4;
331  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post4;
332  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post4;
333  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post4;
334  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post4;
335  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post4;
336  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post4;
337 
338  ++(*it);
339  }
340 }
341 
342 template<typename T, uint SdrBits, uint OutputBits>
343 void Interpolators<T, SdrBits, OutputBits>::interpolate4_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
344 {
345  qint32 intbuf[16];
346  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
347 
348  if (invertIQ)
349  {
350  bufI0 = &intbuf[1];
351  bufQ0 = &intbuf[0];
352  bufI1 = &intbuf[9];
353  bufQ1 = &intbuf[8];
354  }
355  else
356  {
357  bufI0 = &intbuf[0];
358  bufQ0 = &intbuf[1];
359  bufI1 = &intbuf[8];
360  bufQ1 = &intbuf[9];
361  }
362 
363  for (int pos = 0; pos < len - 15; pos += 16)
364  {
365  memset(intbuf, 0, 16*sizeof(qint32));
366  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre4;
367  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre4;
368  ++(*it);
369  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre4;
370  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre4;
371  ++(*it);
372 
373  m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
374 
375  m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
376  m_interpolator4.myInterpolateInf(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
377 
378  for (int i = 0; i < 16; i++) {
380  }
381  }
382 }
383 
384 template<typename T, uint SdrBits, uint OutputBits>
385 void Interpolators<T, SdrBits, OutputBits>::interpolate4_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
386 {
387  qint32 intbuf[16];
388  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
389 
390  if (invertIQ)
391  {
392  bufI0 = &intbuf[1];
393  bufQ0 = &intbuf[0];
394  bufI1 = &intbuf[9];
395  bufQ1 = &intbuf[8];
396  }
397  else
398  {
399  bufI0 = &intbuf[0];
400  bufQ0 = &intbuf[1];
401  bufI1 = &intbuf[8];
402  bufQ1 = &intbuf[9];
403  }
404 
405  for (int pos = 0; pos < len - 15; pos += 16)
406  {
407  memset(intbuf, 0, 16*sizeof(qint32));
408  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre4;
409  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre4;
410  ++(*it);
411  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre4;
412  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre4;
413  ++(*it);
414 
415  m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
416 
417  m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
418  m_interpolator4.myInterpolateSup(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
419 
420  for (int i = 0; i < 16; i++) {
422  }
423  }
424 }
425 
426 template<typename T, uint SdrBits, uint OutputBits>
427 void Interpolators<T, SdrBits, OutputBits>::interpolate8_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
428 {
429  qint32 intbuf[16];
430  qint32 *bufI, *bufQ;
431 
432  if (invertIQ)
433  {
434  bufI = &intbuf[1];
435  bufQ = &intbuf[0];
436  }
437  else
438  {
439  bufI = &intbuf[0];
440  bufQ = &intbuf[1];
441  }
442 
443  for (int pos = 0; pos < len - 15; pos += 16)
444  {
445  memset(intbuf, 0, 16*sizeof(qint32));
446  *bufI = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre8;
447  *bufQ = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre8;
448 
449  m_interpolator2.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9]);
450 
451  m_interpolator4.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5]);
452  m_interpolator4.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
453 
454  m_interpolator8.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3]);
455  m_interpolator8.myInterpolate(&intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
456  m_interpolator8.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11]);
457  m_interpolator8.myInterpolate(&intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
458 
459  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post8;
460  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post8;
461  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post8;
462  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post8;
463  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post8;
464  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post8;
465  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post8;
466  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post8;
467  buf[pos+8] = intbuf[8] >> interpolation_shifts<SdrBits, OutputBits>::post8;
468  buf[pos+9] = intbuf[9] >> interpolation_shifts<SdrBits, OutputBits>::post8;
469  buf[pos+10] = intbuf[10] >> interpolation_shifts<SdrBits, OutputBits>::post8;
470  buf[pos+11] = intbuf[11] >> interpolation_shifts<SdrBits, OutputBits>::post8;
471  buf[pos+12] = intbuf[12] >> interpolation_shifts<SdrBits, OutputBits>::post8;
472  buf[pos+13] = intbuf[13] >> interpolation_shifts<SdrBits, OutputBits>::post8;
473  buf[pos+14] = intbuf[14] >> interpolation_shifts<SdrBits, OutputBits>::post8;
474  buf[pos+15] = intbuf[15] >> interpolation_shifts<SdrBits, OutputBits>::post8;
475 
476  ++(*it);
477  }
478 }
479 
480 template<typename T, uint SdrBits, uint OutputBits>
481 void Interpolators<T, SdrBits, OutputBits>::interpolate8_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
482 {
483  qint32 intbuf[32];
484  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
485 
486  if (invertIQ)
487  {
488  bufI0 = &intbuf[1];
489  bufQ0 = &intbuf[0];
490  bufI1 = &intbuf[17];
491  bufQ1 = &intbuf[16];
492  }
493  else
494  {
495  bufI0 = &intbuf[0];
496  bufQ0 = &intbuf[1];
497  bufI1 = &intbuf[16];
498  bufQ1 = &intbuf[17];
499  }
500 
501  for (int pos = 0; pos < len - 31; pos += 32)
502  {
503  memset(intbuf, 0, 32*sizeof(qint32));
504  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre8;
505  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre8;
506  ++(*it);
507  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre8;
508  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre8;
509  ++(*it);
510 
511  m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
512 
513  m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
514  m_interpolator4.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
515 
516  m_interpolator8.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
517  m_interpolator8.myInterpolateInf(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
518  m_interpolator8.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19], &intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
519  m_interpolator8.myInterpolateInf(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27], &intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
520 
521  for (int i = 0; i < 32; i++) {
523  }
524  }
525 }
526 
527 template<typename T, uint SdrBits, uint OutputBits>
528 void Interpolators<T, SdrBits, OutputBits>::interpolate8_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
529 {
530  qint32 intbuf[32];
531  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
532 
533  if (invertIQ)
534  {
535  bufI0 = &intbuf[1];
536  bufQ0 = &intbuf[0];
537  bufI1 = &intbuf[17];
538  bufQ1 = &intbuf[16];
539  }
540  else
541  {
542  bufI0 = &intbuf[0];
543  bufQ0 = &intbuf[1];
544  bufI1 = &intbuf[16];
545  bufQ1 = &intbuf[17];
546  }
547 
548  for (int pos = 0; pos < len - 31; pos += 32)
549  {
550  memset(intbuf, 0, 32*sizeof(qint32));
551  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre8;
552  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre8;
553  ++(*it);
554  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre8;
555  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre8;
556  ++(*it);
557 
558  m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
559 
560  m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
561  m_interpolator4.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
562 
563  m_interpolator8.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
564  m_interpolator8.myInterpolateSup(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
565  m_interpolator8.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19], &intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
566  m_interpolator8.myInterpolateSup(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27], &intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
567 
568  for (int i = 0; i < 32; i++) {
570  }
571  }
572 }
573 
574 template<typename T, uint SdrBits, uint OutputBits>
575 void Interpolators<T, SdrBits, OutputBits>::interpolate16_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
576 {
577  qint32 intbuf[32];
578  qint32 *bufI, *bufQ;
579 
580  if (invertIQ)
581  {
582  bufI = &intbuf[1];
583  bufQ = &intbuf[0];
584  }
585  else
586  {
587  bufI = &intbuf[0];
588  bufQ = &intbuf[1];
589  }
590 
591  for (int pos = 0; pos < len - 31; pos += 32)
592  {
593  memset(intbuf, 0, 32*sizeof(qint32));
594  *bufI = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre16;
595  *bufQ = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre16;
596 
597  m_interpolator2.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17]);
598 
599  m_interpolator4.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9]);
600  m_interpolator4.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
601 
602  m_interpolator8.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5]);
603  m_interpolator8.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
604  m_interpolator8.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21]);
605  m_interpolator8.myInterpolate(&intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
606 
607  m_interpolator16.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3]);
608  m_interpolator16.myInterpolate(&intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
609  m_interpolator16.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11]);
610  m_interpolator16.myInterpolate(&intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
611  m_interpolator16.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19]);
612  m_interpolator16.myInterpolate(&intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
613  m_interpolator16.myInterpolate(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27]);
614  m_interpolator16.myInterpolate(&intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
615 
616  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post16;
617  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post16;
618  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post16;
619  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post16;
620  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post16;
621  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post16;
622  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post16;
623  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post16;
624  buf[pos+8] = intbuf[8] >> interpolation_shifts<SdrBits, OutputBits>::post16;
625  buf[pos+9] = intbuf[9] >> interpolation_shifts<SdrBits, OutputBits>::post16;
626  buf[pos+10] = intbuf[10] >> interpolation_shifts<SdrBits, OutputBits>::post16;
627  buf[pos+11] = intbuf[11] >> interpolation_shifts<SdrBits, OutputBits>::post16;
628  buf[pos+12] = intbuf[12] >> interpolation_shifts<SdrBits, OutputBits>::post16;
629  buf[pos+13] = intbuf[13] >> interpolation_shifts<SdrBits, OutputBits>::post16;
630  buf[pos+14] = intbuf[14] >> interpolation_shifts<SdrBits, OutputBits>::post16;
631  buf[pos+15] = intbuf[15] >> interpolation_shifts<SdrBits, OutputBits>::post16;
632  buf[pos+16] = intbuf[16] >> interpolation_shifts<SdrBits, OutputBits>::post16;
633  buf[pos+17] = intbuf[17] >> interpolation_shifts<SdrBits, OutputBits>::post16;
634  buf[pos+18] = intbuf[18] >> interpolation_shifts<SdrBits, OutputBits>::post16;
635  buf[pos+19] = intbuf[19] >> interpolation_shifts<SdrBits, OutputBits>::post16;
636  buf[pos+20] = intbuf[20] >> interpolation_shifts<SdrBits, OutputBits>::post16;
637  buf[pos+21] = intbuf[21] >> interpolation_shifts<SdrBits, OutputBits>::post16;
638  buf[pos+22] = intbuf[22] >> interpolation_shifts<SdrBits, OutputBits>::post16;
639  buf[pos+23] = intbuf[23] >> interpolation_shifts<SdrBits, OutputBits>::post16;
640  buf[pos+24] = intbuf[24] >> interpolation_shifts<SdrBits, OutputBits>::post16;
641  buf[pos+25] = intbuf[25] >> interpolation_shifts<SdrBits, OutputBits>::post16;
642  buf[pos+26] = intbuf[26] >> interpolation_shifts<SdrBits, OutputBits>::post16;
643  buf[pos+27] = intbuf[27] >> interpolation_shifts<SdrBits, OutputBits>::post16;
644  buf[pos+28] = intbuf[28] >> interpolation_shifts<SdrBits, OutputBits>::post16;
645  buf[pos+29] = intbuf[29] >> interpolation_shifts<SdrBits, OutputBits>::post16;
646  buf[pos+30] = intbuf[30] >> interpolation_shifts<SdrBits, OutputBits>::post16;
647  buf[pos+31] = intbuf[31] >> interpolation_shifts<SdrBits, OutputBits>::post16;
648 
649  ++(*it);
650  }
651 }
652 
653 template<typename T, uint SdrBits, uint OutputBits>
654 void Interpolators<T, SdrBits, OutputBits>::interpolate16_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
655 {
656  qint32 intbuf[64];
657  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
658 
659  if (invertIQ)
660  {
661  bufI0 = &intbuf[1];
662  bufQ0 = &intbuf[0];
663  bufI1 = &intbuf[33];
664  bufQ1 = &intbuf[32];
665  }
666  else
667  {
668  bufI0 = &intbuf[0];
669  bufQ0 = &intbuf[1];
670  bufI1 = &intbuf[32];
671  bufQ1 = &intbuf[33];
672  }
673 
674  for (int pos = 0; pos < len - 63; pos += 64)
675  {
676  memset(intbuf, 0, 64*sizeof(qint32));
677  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre16;
678  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre16;
679  ++(*it);
680  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre16;
681  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre16;
682  ++(*it);
683 
684  m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
685 
686  m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
687  m_interpolator4.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
688 
689  m_interpolator8.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
690  m_interpolator8.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
691  m_interpolator8.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[36], &intbuf[37], &intbuf[40], &intbuf[41], &intbuf[44], &intbuf[45]);
692  m_interpolator8.myInterpolateInf(&intbuf[48], &intbuf[49], &intbuf[52], &intbuf[53], &intbuf[56], &intbuf[57], &intbuf[60], &intbuf[61]);
693 
694  m_interpolator16.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
695  m_interpolator16.myInterpolateInf(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
696  m_interpolator16.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19], &intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
697  m_interpolator16.myInterpolateInf(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27], &intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
698  m_interpolator16.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[34], &intbuf[35], &intbuf[36], &intbuf[37], &intbuf[38], &intbuf[39]);
699  m_interpolator16.myInterpolateInf(&intbuf[40], &intbuf[41], &intbuf[42], &intbuf[43], &intbuf[44], &intbuf[45], &intbuf[46], &intbuf[47]);
700  m_interpolator16.myInterpolateInf(&intbuf[48], &intbuf[49], &intbuf[50], &intbuf[51], &intbuf[52], &intbuf[53], &intbuf[54], &intbuf[55]);
701  m_interpolator16.myInterpolateInf(&intbuf[56], &intbuf[57], &intbuf[58], &intbuf[59], &intbuf[60], &intbuf[61], &intbuf[62], &intbuf[63]);
702 
703  for (int i = 0; i < 64; i++) {
705  }
706  }
707 }
708 
709 template<typename T, uint SdrBits, uint OutputBits>
710 void Interpolators<T, SdrBits, OutputBits>::interpolate16_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
711 {
712  qint32 intbuf[64];
713  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
714 
715  if (invertIQ)
716  {
717  bufI0 = &intbuf[1];
718  bufQ0 = &intbuf[0];
719  bufI1 = &intbuf[33];
720  bufQ1 = &intbuf[32];
721  }
722  else
723  {
724  bufI0 = &intbuf[0];
725  bufQ0 = &intbuf[1];
726  bufI1 = &intbuf[32];
727  bufQ1 = &intbuf[33];
728  }
729 
730  for (int pos = 0; pos < len - 63; pos += 64)
731  {
732  memset(intbuf, 0, 64*sizeof(qint32));
733  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre16;
734  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre16;
735  ++(*it);
736  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre16;
737  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre16;
738  ++(*it);
739 
740  m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
741 
742  m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
743  m_interpolator4.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
744 
745  m_interpolator8.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
746  m_interpolator8.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
747  m_interpolator8.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[36], &intbuf[37], &intbuf[40], &intbuf[41], &intbuf[44], &intbuf[45]);
748  m_interpolator8.myInterpolateSup(&intbuf[48], &intbuf[49], &intbuf[52], &intbuf[53], &intbuf[56], &intbuf[57], &intbuf[60], &intbuf[61]);
749 
750  m_interpolator16.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
751  m_interpolator16.myInterpolateSup(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
752  m_interpolator16.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19], &intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
753  m_interpolator16.myInterpolateSup(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27], &intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
754  m_interpolator16.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[34], &intbuf[35], &intbuf[36], &intbuf[37], &intbuf[38], &intbuf[39]);
755  m_interpolator16.myInterpolateSup(&intbuf[40], &intbuf[41], &intbuf[42], &intbuf[43], &intbuf[44], &intbuf[45], &intbuf[46], &intbuf[47]);
756  m_interpolator16.myInterpolateSup(&intbuf[48], &intbuf[49], &intbuf[50], &intbuf[51], &intbuf[52], &intbuf[53], &intbuf[54], &intbuf[55]);
757  m_interpolator16.myInterpolateSup(&intbuf[56], &intbuf[57], &intbuf[58], &intbuf[59], &intbuf[60], &intbuf[61], &intbuf[62], &intbuf[63]);
758 
759  for (int i = 0; i < 64; i++) {
761  }
762  }
763 }
764 
765 template<typename T, uint SdrBits, uint OutputBits>
766 void Interpolators<T, SdrBits, OutputBits>::interpolate32_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
767 {
768  qint32 intbuf[64];
769  qint32 *bufI, *bufQ;
770 
771  if (invertIQ)
772  {
773  bufI = &intbuf[1];
774  bufQ = &intbuf[0];
775  }
776  else
777  {
778  bufI = &intbuf[0];
779  bufQ = &intbuf[1];
780  }
781 
782  for (int pos = 0; pos < len - 63; pos += 64)
783  {
784  memset(intbuf, 0, 64*sizeof(qint32));
785  *bufI = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre32;
786  *bufQ = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre32;
787  m_interpolator2.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33]);
788 
789  m_interpolator4.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17]);
790  m_interpolator4.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
791 
792  m_interpolator8.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9]);
793  m_interpolator8.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
794  m_interpolator8.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41]);
795  m_interpolator8.myInterpolate(&intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
796 
797  m_interpolator16.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5]);
798  m_interpolator16.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
799  m_interpolator16.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21]);
800  m_interpolator16.myInterpolate(&intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
801  m_interpolator16.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[36], &intbuf[37]);
802  m_interpolator16.myInterpolate(&intbuf[40], &intbuf[41], &intbuf[44], &intbuf[45]);
803  m_interpolator16.myInterpolate(&intbuf[48], &intbuf[49], &intbuf[52], &intbuf[53]);
804  m_interpolator16.myInterpolate(&intbuf[56], &intbuf[57], &intbuf[60], &intbuf[61]);
805 
806  m_interpolator32.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3]);
807  m_interpolator32.myInterpolate(&intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
808  m_interpolator32.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11]);
809  m_interpolator32.myInterpolate(&intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
810  m_interpolator32.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19]);
811  m_interpolator32.myInterpolate(&intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
812  m_interpolator32.myInterpolate(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27]);
813  m_interpolator32.myInterpolate(&intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
814  m_interpolator32.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[34], &intbuf[35]);
815  m_interpolator32.myInterpolate(&intbuf[36], &intbuf[37], &intbuf[38], &intbuf[39]);
816  m_interpolator32.myInterpolate(&intbuf[40], &intbuf[41], &intbuf[42], &intbuf[43]);
817  m_interpolator32.myInterpolate(&intbuf[44], &intbuf[45], &intbuf[46], &intbuf[47]);
818  m_interpolator32.myInterpolate(&intbuf[48], &intbuf[49], &intbuf[50], &intbuf[51]);
819  m_interpolator32.myInterpolate(&intbuf[52], &intbuf[53], &intbuf[54], &intbuf[55]);
820  m_interpolator32.myInterpolate(&intbuf[56], &intbuf[57], &intbuf[58], &intbuf[59]);
821  m_interpolator32.myInterpolate(&intbuf[60], &intbuf[61], &intbuf[62], &intbuf[63]);
822 
823  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post32;
824  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post32;
825  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post32;
826  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post32;
827  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post32;
828  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post32;
829  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post32;
830  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post32;
831  buf[pos+8] = intbuf[8] >> interpolation_shifts<SdrBits, OutputBits>::post32;
832  buf[pos+9] = intbuf[9] >> interpolation_shifts<SdrBits, OutputBits>::post32;
833  buf[pos+10] = intbuf[10] >> interpolation_shifts<SdrBits, OutputBits>::post32;
834  buf[pos+11] = intbuf[11] >> interpolation_shifts<SdrBits, OutputBits>::post32;
835  buf[pos+12] = intbuf[12] >> interpolation_shifts<SdrBits, OutputBits>::post32;
836  buf[pos+13] = intbuf[13] >> interpolation_shifts<SdrBits, OutputBits>::post32;
837  buf[pos+14] = intbuf[14] >> interpolation_shifts<SdrBits, OutputBits>::post32;
838  buf[pos+15] = intbuf[15] >> interpolation_shifts<SdrBits, OutputBits>::post32;
839  buf[pos+16] = intbuf[16] >> interpolation_shifts<SdrBits, OutputBits>::post32;
840  buf[pos+17] = intbuf[17] >> interpolation_shifts<SdrBits, OutputBits>::post32;
841  buf[pos+18] = intbuf[18] >> interpolation_shifts<SdrBits, OutputBits>::post32;
842  buf[pos+19] = intbuf[19] >> interpolation_shifts<SdrBits, OutputBits>::post32;
843  buf[pos+20] = intbuf[20] >> interpolation_shifts<SdrBits, OutputBits>::post32;
844  buf[pos+21] = intbuf[21] >> interpolation_shifts<SdrBits, OutputBits>::post32;
845  buf[pos+22] = intbuf[22] >> interpolation_shifts<SdrBits, OutputBits>::post32;
846  buf[pos+23] = intbuf[23] >> interpolation_shifts<SdrBits, OutputBits>::post32;
847  buf[pos+24] = intbuf[24] >> interpolation_shifts<SdrBits, OutputBits>::post32;
848  buf[pos+25] = intbuf[25] >> interpolation_shifts<SdrBits, OutputBits>::post32;
849  buf[pos+26] = intbuf[26] >> interpolation_shifts<SdrBits, OutputBits>::post32;
850  buf[pos+27] = intbuf[27] >> interpolation_shifts<SdrBits, OutputBits>::post32;
851  buf[pos+28] = intbuf[28] >> interpolation_shifts<SdrBits, OutputBits>::post32;
852  buf[pos+29] = intbuf[29] >> interpolation_shifts<SdrBits, OutputBits>::post32;
853  buf[pos+30] = intbuf[30] >> interpolation_shifts<SdrBits, OutputBits>::post32;
854  buf[pos+31] = intbuf[31] >> interpolation_shifts<SdrBits, OutputBits>::post32;
855  buf[pos+32] = intbuf[32] >> interpolation_shifts<SdrBits, OutputBits>::post32;
856  buf[pos+33] = intbuf[33] >> interpolation_shifts<SdrBits, OutputBits>::post32;
857  buf[pos+34] = intbuf[34] >> interpolation_shifts<SdrBits, OutputBits>::post32;
858  buf[pos+35] = intbuf[35] >> interpolation_shifts<SdrBits, OutputBits>::post32;
859  buf[pos+36] = intbuf[36] >> interpolation_shifts<SdrBits, OutputBits>::post32;
860  buf[pos+37] = intbuf[37] >> interpolation_shifts<SdrBits, OutputBits>::post32;
861  buf[pos+38] = intbuf[38] >> interpolation_shifts<SdrBits, OutputBits>::post32;
862  buf[pos+39] = intbuf[39] >> interpolation_shifts<SdrBits, OutputBits>::post32;
863  buf[pos+40] = intbuf[40] >> interpolation_shifts<SdrBits, OutputBits>::post32;
864  buf[pos+41] = intbuf[41] >> interpolation_shifts<SdrBits, OutputBits>::post32;
865  buf[pos+42] = intbuf[42] >> interpolation_shifts<SdrBits, OutputBits>::post32;
866  buf[pos+43] = intbuf[43] >> interpolation_shifts<SdrBits, OutputBits>::post32;
867  buf[pos+44] = intbuf[44] >> interpolation_shifts<SdrBits, OutputBits>::post32;
868  buf[pos+45] = intbuf[45] >> interpolation_shifts<SdrBits, OutputBits>::post32;
869  buf[pos+46] = intbuf[46] >> interpolation_shifts<SdrBits, OutputBits>::post32;
870  buf[pos+47] = intbuf[47] >> interpolation_shifts<SdrBits, OutputBits>::post32;
871  buf[pos+48] = intbuf[48] >> interpolation_shifts<SdrBits, OutputBits>::post32;
872  buf[pos+49] = intbuf[49] >> interpolation_shifts<SdrBits, OutputBits>::post32;
873  buf[pos+50] = intbuf[50] >> interpolation_shifts<SdrBits, OutputBits>::post32;
874  buf[pos+51] = intbuf[51] >> interpolation_shifts<SdrBits, OutputBits>::post32;
875  buf[pos+52] = intbuf[52] >> interpolation_shifts<SdrBits, OutputBits>::post32;
876  buf[pos+53] = intbuf[53] >> interpolation_shifts<SdrBits, OutputBits>::post32;
877  buf[pos+54] = intbuf[54] >> interpolation_shifts<SdrBits, OutputBits>::post32;
878  buf[pos+55] = intbuf[55] >> interpolation_shifts<SdrBits, OutputBits>::post32;
879  buf[pos+56] = intbuf[56] >> interpolation_shifts<SdrBits, OutputBits>::post32;
880  buf[pos+57] = intbuf[57] >> interpolation_shifts<SdrBits, OutputBits>::post32;
881  buf[pos+58] = intbuf[58] >> interpolation_shifts<SdrBits, OutputBits>::post32;
882  buf[pos+59] = intbuf[59] >> interpolation_shifts<SdrBits, OutputBits>::post32;
883  buf[pos+60] = intbuf[60] >> interpolation_shifts<SdrBits, OutputBits>::post32;
884  buf[pos+61] = intbuf[61] >> interpolation_shifts<SdrBits, OutputBits>::post32;
885  buf[pos+62] = intbuf[62] >> interpolation_shifts<SdrBits, OutputBits>::post32;
886  buf[pos+63] = intbuf[63] >> interpolation_shifts<SdrBits, OutputBits>::post32;
887 
888  ++(*it);
889  }
890 }
891 
892 template<typename T, uint SdrBits, uint OutputBits>
893 void Interpolators<T, SdrBits, OutputBits>::interpolate32_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
894 {
895  qint32 intbuf[128];
896  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
897 
898  if (invertIQ)
899  {
900  bufI0 = &intbuf[1];
901  bufQ0 = &intbuf[0];
902  bufI1 = &intbuf[65];
903  bufQ1 = &intbuf[64];
904  }
905  else
906  {
907  bufI0 = &intbuf[0];
908  bufQ0 = &intbuf[1];
909  bufI1 = &intbuf[64];
910  bufQ1 = &intbuf[65];
911  }
912 
913  for (int pos = 0; pos < len - 127; pos += 128)
914  {
915  memset(intbuf, 0, 128*sizeof(qint32));
916  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre32;
917  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre32;
918  ++(*it);
919  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre32;
920  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre32;
921  ++(*it);
922 
923  m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33], &intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]);
924 
925  m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
926  m_interpolator4.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81], &intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]);
927 
928  m_interpolator8.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
929  m_interpolator8.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
930  m_interpolator8.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73], &intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]);
931  m_interpolator8.myInterpolateSup(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105], &intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]);
932 
933  m_interpolator16.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
934  m_interpolator16.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
935  m_interpolator16.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[36], &intbuf[37], &intbuf[40], &intbuf[41], &intbuf[44], &intbuf[45]);
936  m_interpolator16.myInterpolateInf(&intbuf[48], &intbuf[49], &intbuf[52], &intbuf[53], &intbuf[56], &intbuf[57], &intbuf[60], &intbuf[61]);
937  m_interpolator16.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[68], &intbuf[69], &intbuf[72], &intbuf[73], &intbuf[76], &intbuf[77]);
938  m_interpolator16.myInterpolateInf(&intbuf[80], &intbuf[81], &intbuf[84], &intbuf[85], &intbuf[88], &intbuf[89], &intbuf[92], &intbuf[93]);
939  m_interpolator16.myInterpolateInf(&intbuf[96], &intbuf[97], &intbuf[100], &intbuf[101], &intbuf[104], &intbuf[105], &intbuf[108], &intbuf[109]);
940  m_interpolator16.myInterpolateInf(&intbuf[112], &intbuf[113], &intbuf[116], &intbuf[117], &intbuf[120], &intbuf[121], &intbuf[124], &intbuf[125]);
941 
942  m_interpolator32.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
943  m_interpolator32.myInterpolateInf(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
944  m_interpolator32.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19], &intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
945  m_interpolator32.myInterpolateInf(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27], &intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
946  m_interpolator32.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[34], &intbuf[35], &intbuf[36], &intbuf[37], &intbuf[38], &intbuf[39]);
947  m_interpolator32.myInterpolateInf(&intbuf[40], &intbuf[41], &intbuf[42], &intbuf[43], &intbuf[44], &intbuf[45], &intbuf[46], &intbuf[47]);
948  m_interpolator32.myInterpolateInf(&intbuf[48], &intbuf[49], &intbuf[50], &intbuf[51], &intbuf[52], &intbuf[53], &intbuf[54], &intbuf[55]);
949  m_interpolator32.myInterpolateInf(&intbuf[56], &intbuf[57], &intbuf[58], &intbuf[59], &intbuf[60], &intbuf[61], &intbuf[62], &intbuf[63]);
950  m_interpolator32.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[66], &intbuf[67], &intbuf[68], &intbuf[69], &intbuf[70], &intbuf[71]);
951  m_interpolator32.myInterpolateInf(&intbuf[72], &intbuf[73], &intbuf[74], &intbuf[75], &intbuf[76], &intbuf[77], &intbuf[78], &intbuf[79]);
952  m_interpolator32.myInterpolateInf(&intbuf[80], &intbuf[81], &intbuf[82], &intbuf[83], &intbuf[84], &intbuf[85], &intbuf[86], &intbuf[87]);
953  m_interpolator32.myInterpolateInf(&intbuf[88], &intbuf[89], &intbuf[90], &intbuf[91], &intbuf[92], &intbuf[93], &intbuf[94], &intbuf[95]);
954  m_interpolator32.myInterpolateInf(&intbuf[96], &intbuf[97], &intbuf[98], &intbuf[99], &intbuf[100], &intbuf[101], &intbuf[102], &intbuf[103]);
955  m_interpolator32.myInterpolateInf(&intbuf[104], &intbuf[105], &intbuf[106], &intbuf[107], &intbuf[108], &intbuf[109], &intbuf[110], &intbuf[111]);
956  m_interpolator32.myInterpolateInf(&intbuf[112], &intbuf[113], &intbuf[114], &intbuf[115], &intbuf[116], &intbuf[117], &intbuf[118], &intbuf[119]);
957  m_interpolator32.myInterpolateInf(&intbuf[120], &intbuf[121], &intbuf[122], &intbuf[123], &intbuf[124], &intbuf[125], &intbuf[126], &intbuf[127]);
958 
959  for (int i = 0; i < 128; i++) {
961  }
962  }
963 }
964 
965 template<typename T, uint SdrBits, uint OutputBits>
966 void Interpolators<T, SdrBits, OutputBits>::interpolate32_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
967 {
968  qint32 intbuf[128];
969  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
970 
971  if (invertIQ)
972  {
973  bufI0 = &intbuf[1];
974  bufQ0 = &intbuf[0];
975  bufI1 = &intbuf[65];
976  bufQ1 = &intbuf[64];
977  }
978  else
979  {
980  bufI0 = &intbuf[0];
981  bufQ0 = &intbuf[1];
982  bufI1 = &intbuf[64];
983  bufQ1 = &intbuf[65];
984  }
985 
986  for (int pos = 0; pos < len - 127; pos += 128)
987  {
988  memset(intbuf, 0, 128*sizeof(qint32));
989  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre32;
990  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre32;
991  ++(*it);
992  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre32;
993  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre32;
994  ++(*it);
995 
996  m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33], &intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]);
997 
998  m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
999  m_interpolator4.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81], &intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]);
1000 
1001  m_interpolator8.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
1002  m_interpolator8.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
1003  m_interpolator8.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73], &intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]);
1004  m_interpolator8.myInterpolateInf(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105], &intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]);
1005 
1006  m_interpolator16.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
1007  m_interpolator16.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
1008  m_interpolator16.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[36], &intbuf[37], &intbuf[40], &intbuf[41], &intbuf[44], &intbuf[45]);
1009  m_interpolator16.myInterpolateSup(&intbuf[48], &intbuf[49], &intbuf[52], &intbuf[53], &intbuf[56], &intbuf[57], &intbuf[60], &intbuf[61]);
1010  m_interpolator16.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[68], &intbuf[69], &intbuf[72], &intbuf[73], &intbuf[76], &intbuf[77]);
1011  m_interpolator16.myInterpolateSup(&intbuf[80], &intbuf[81], &intbuf[84], &intbuf[85], &intbuf[88], &intbuf[89], &intbuf[92], &intbuf[93]);
1012  m_interpolator16.myInterpolateSup(&intbuf[96], &intbuf[97], &intbuf[100], &intbuf[101], &intbuf[104], &intbuf[105], &intbuf[108], &intbuf[109]);
1013  m_interpolator16.myInterpolateSup(&intbuf[112], &intbuf[113], &intbuf[116], &intbuf[117], &intbuf[120], &intbuf[121], &intbuf[124], &intbuf[125]);
1014 
1015  m_interpolator32.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3], &intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
1016  m_interpolator32.myInterpolateSup(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11], &intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
1017  m_interpolator32.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19], &intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
1018  m_interpolator32.myInterpolateSup(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27], &intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
1019  m_interpolator32.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[34], &intbuf[35], &intbuf[36], &intbuf[37], &intbuf[38], &intbuf[39]);
1020  m_interpolator32.myInterpolateSup(&intbuf[40], &intbuf[41], &intbuf[42], &intbuf[43], &intbuf[44], &intbuf[45], &intbuf[46], &intbuf[47]);
1021  m_interpolator32.myInterpolateSup(&intbuf[48], &intbuf[49], &intbuf[50], &intbuf[51], &intbuf[52], &intbuf[53], &intbuf[54], &intbuf[55]);
1022  m_interpolator32.myInterpolateSup(&intbuf[56], &intbuf[57], &intbuf[58], &intbuf[59], &intbuf[60], &intbuf[61], &intbuf[62], &intbuf[63]);
1023  m_interpolator32.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[66], &intbuf[67], &intbuf[68], &intbuf[69], &intbuf[70], &intbuf[71]);
1024  m_interpolator32.myInterpolateSup(&intbuf[72], &intbuf[73], &intbuf[74], &intbuf[75], &intbuf[76], &intbuf[77], &intbuf[78], &intbuf[79]);
1025  m_interpolator32.myInterpolateSup(&intbuf[80], &intbuf[81], &intbuf[82], &intbuf[83], &intbuf[84], &intbuf[85], &intbuf[86], &intbuf[87]);
1026  m_interpolator32.myInterpolateSup(&intbuf[88], &intbuf[89], &intbuf[90], &intbuf[91], &intbuf[92], &intbuf[93], &intbuf[94], &intbuf[95]);
1027  m_interpolator32.myInterpolateSup(&intbuf[96], &intbuf[97], &intbuf[98], &intbuf[99], &intbuf[100], &intbuf[101], &intbuf[102], &intbuf[103]);
1028  m_interpolator32.myInterpolateSup(&intbuf[104], &intbuf[105], &intbuf[106], &intbuf[107], &intbuf[108], &intbuf[109], &intbuf[110], &intbuf[111]);
1029  m_interpolator32.myInterpolateSup(&intbuf[112], &intbuf[113], &intbuf[114], &intbuf[115], &intbuf[116], &intbuf[117], &intbuf[118], &intbuf[119]);
1030  m_interpolator32.myInterpolateSup(&intbuf[120], &intbuf[121], &intbuf[122], &intbuf[123], &intbuf[124], &intbuf[125], &intbuf[126], &intbuf[127]);
1031 
1032  for (int i = 0; i < 128; i++) {
1034  }
1035  }
1036 }
1037 
1038 template<typename T, uint SdrBits, uint OutputBits>
1039 void Interpolators<T, SdrBits, OutputBits>::interpolate64_cen(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
1040 {
1041  qint32 intbuf[128];
1042  qint32 *bufI, *bufQ;
1043 
1044  if (invertIQ)
1045  {
1046  bufI = &intbuf[1];
1047  bufQ = &intbuf[0];
1048  }
1049  else
1050  {
1051  bufI = &intbuf[0];
1052  bufQ = &intbuf[1];
1053  }
1054 
1055  for (int pos = 0; pos < len - 127; pos += 128)
1056  {
1057  memset(intbuf, 0, 128*sizeof(qint32));
1058  *bufI = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre64;
1059  *bufQ = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre64;
1060  m_interpolator2.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[64], &intbuf[65]);
1061 
1062  m_interpolator4.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33]);
1063  m_interpolator4.myInterpolate(&intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]);
1064 
1065  m_interpolator8.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17]);
1066  m_interpolator8.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
1067  m_interpolator8.myInterpolate(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81]);
1068  m_interpolator8.myInterpolate(&intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]);
1069 
1070  m_interpolator16.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9]);
1071  m_interpolator16.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
1072  m_interpolator16.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41]);
1073  m_interpolator16.myInterpolate(&intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
1074  m_interpolator16.myInterpolate(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73]);
1075  m_interpolator16.myInterpolate(&intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]);
1076  m_interpolator16.myInterpolate(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105]);
1077  m_interpolator16.myInterpolate(&intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]);
1078 
1079  m_interpolator32.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5]);
1080  m_interpolator32.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]);
1081  m_interpolator32.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21]);
1082  m_interpolator32.myInterpolate(&intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]);
1083  m_interpolator32.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[36], &intbuf[37]);
1084  m_interpolator32.myInterpolate(&intbuf[40], &intbuf[41], &intbuf[44], &intbuf[45]);
1085  m_interpolator32.myInterpolate(&intbuf[48], &intbuf[49], &intbuf[52], &intbuf[53]);
1086  m_interpolator32.myInterpolate(&intbuf[56], &intbuf[57], &intbuf[60], &intbuf[61]);
1087  m_interpolator32.myInterpolate(&intbuf[64], &intbuf[65], &intbuf[68], &intbuf[69]);
1088  m_interpolator32.myInterpolate(&intbuf[72], &intbuf[73], &intbuf[76], &intbuf[77]);
1089  m_interpolator32.myInterpolate(&intbuf[80], &intbuf[81], &intbuf[84], &intbuf[85]);
1090  m_interpolator32.myInterpolate(&intbuf[88], &intbuf[89], &intbuf[92], &intbuf[93]);
1091  m_interpolator32.myInterpolate(&intbuf[96], &intbuf[97], &intbuf[100], &intbuf[101]);
1092  m_interpolator32.myInterpolate(&intbuf[104], &intbuf[105], &intbuf[108], &intbuf[109]);
1093  m_interpolator32.myInterpolate(&intbuf[112], &intbuf[113], &intbuf[116], &intbuf[117]);
1094  m_interpolator32.myInterpolate(&intbuf[120], &intbuf[121], &intbuf[124], &intbuf[125]);
1095 
1096  m_interpolator64.myInterpolate(&intbuf[0], &intbuf[1], &intbuf[2], &intbuf[3]);
1097  m_interpolator64.myInterpolate(&intbuf[4], &intbuf[5], &intbuf[6], &intbuf[7]);
1098  m_interpolator64.myInterpolate(&intbuf[8], &intbuf[9], &intbuf[10], &intbuf[11]);
1099  m_interpolator64.myInterpolate(&intbuf[12], &intbuf[13], &intbuf[14], &intbuf[15]);
1100  m_interpolator64.myInterpolate(&intbuf[16], &intbuf[17], &intbuf[18], &intbuf[19]);
1101  m_interpolator64.myInterpolate(&intbuf[20], &intbuf[21], &intbuf[22], &intbuf[23]);
1102  m_interpolator64.myInterpolate(&intbuf[24], &intbuf[25], &intbuf[26], &intbuf[27]);
1103  m_interpolator64.myInterpolate(&intbuf[28], &intbuf[29], &intbuf[30], &intbuf[31]);
1104  m_interpolator64.myInterpolate(&intbuf[32], &intbuf[33], &intbuf[34], &intbuf[35]);
1105  m_interpolator64.myInterpolate(&intbuf[36], &intbuf[37], &intbuf[38], &intbuf[39]);
1106  m_interpolator64.myInterpolate(&intbuf[40], &intbuf[41], &intbuf[42], &intbuf[43]);
1107  m_interpolator64.myInterpolate(&intbuf[44], &intbuf[45], &intbuf[46], &intbuf[47]);
1108  m_interpolator64.myInterpolate(&intbuf[48], &intbuf[49], &intbuf[50], &intbuf[51]);
1109  m_interpolator64.myInterpolate(&intbuf[52], &intbuf[53], &intbuf[54], &intbuf[55]);
1110  m_interpolator64.myInterpolate(&intbuf[56], &intbuf[57], &intbuf[58], &intbuf[59]);
1111  m_interpolator64.myInterpolate(&intbuf[60], &intbuf[61], &intbuf[62], &intbuf[63]);
1112  m_interpolator64.myInterpolate(&intbuf[64], &intbuf[65], &intbuf[66], &intbuf[67]);
1113  m_interpolator64.myInterpolate(&intbuf[68], &intbuf[69], &intbuf[70], &intbuf[71]);
1114  m_interpolator64.myInterpolate(&intbuf[72], &intbuf[73], &intbuf[74], &intbuf[75]);
1115  m_interpolator64.myInterpolate(&intbuf[76], &intbuf[77], &intbuf[78], &intbuf[79]);
1116  m_interpolator64.myInterpolate(&intbuf[80], &intbuf[81], &intbuf[82], &intbuf[83]);
1117  m_interpolator64.myInterpolate(&intbuf[84], &intbuf[85], &intbuf[86], &intbuf[87]);
1118  m_interpolator64.myInterpolate(&intbuf[88], &intbuf[89], &intbuf[90], &intbuf[91]);
1119  m_interpolator64.myInterpolate(&intbuf[92], &intbuf[93], &intbuf[94], &intbuf[95]);
1120  m_interpolator64.myInterpolate(&intbuf[96], &intbuf[97], &intbuf[98], &intbuf[99]);
1121  m_interpolator64.myInterpolate(&intbuf[100], &intbuf[101], &intbuf[102], &intbuf[103]);
1122  m_interpolator64.myInterpolate(&intbuf[104], &intbuf[105], &intbuf[106], &intbuf[107]);
1123  m_interpolator64.myInterpolate(&intbuf[108], &intbuf[109], &intbuf[110], &intbuf[111]);
1124  m_interpolator64.myInterpolate(&intbuf[112], &intbuf[113], &intbuf[114], &intbuf[115]);
1125  m_interpolator64.myInterpolate(&intbuf[116], &intbuf[117], &intbuf[118], &intbuf[119]);
1126  m_interpolator64.myInterpolate(&intbuf[120], &intbuf[121], &intbuf[122], &intbuf[123]);
1127  m_interpolator64.myInterpolate(&intbuf[124], &intbuf[125], &intbuf[126], &intbuf[127]);
1128 
1129  buf[pos+0] = intbuf[0] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1130  buf[pos+1] = intbuf[1] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1131  buf[pos+2] = intbuf[2] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1132  buf[pos+3] = intbuf[3] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1133  buf[pos+4] = intbuf[4] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1134  buf[pos+5] = intbuf[5] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1135  buf[pos+6] = intbuf[6] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1136  buf[pos+7] = intbuf[7] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1137  buf[pos+8] = intbuf[8] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1138  buf[pos+9] = intbuf[9] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1139  buf[pos+10] = intbuf[10] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1140  buf[pos+11] = intbuf[11] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1141  buf[pos+12] = intbuf[12] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1142  buf[pos+13] = intbuf[13] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1143  buf[pos+14] = intbuf[14] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1144  buf[pos+15] = intbuf[15] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1145  buf[pos+16] = intbuf[16] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1146  buf[pos+17] = intbuf[17] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1147  buf[pos+18] = intbuf[18] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1148  buf[pos+19] = intbuf[19] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1149  buf[pos+20] = intbuf[20] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1150  buf[pos+21] = intbuf[21] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1151  buf[pos+22] = intbuf[22] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1152  buf[pos+23] = intbuf[23] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1153  buf[pos+24] = intbuf[24] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1154  buf[pos+25] = intbuf[25] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1155  buf[pos+26] = intbuf[26] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1156  buf[pos+27] = intbuf[27] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1157  buf[pos+28] = intbuf[28] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1158  buf[pos+29] = intbuf[29] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1159  buf[pos+30] = intbuf[30] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1160  buf[pos+31] = intbuf[31] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1161  buf[pos+32] = intbuf[32] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1162  buf[pos+33] = intbuf[33] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1163  buf[pos+34] = intbuf[34] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1164  buf[pos+35] = intbuf[35] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1165  buf[pos+36] = intbuf[36] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1166  buf[pos+37] = intbuf[37] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1167  buf[pos+38] = intbuf[38] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1168  buf[pos+39] = intbuf[39] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1169  buf[pos+40] = intbuf[40] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1170  buf[pos+41] = intbuf[41] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1171  buf[pos+42] = intbuf[42] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1172  buf[pos+43] = intbuf[43] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1173  buf[pos+44] = intbuf[44] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1174  buf[pos+45] = intbuf[45] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1175  buf[pos+46] = intbuf[46] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1176  buf[pos+47] = intbuf[47] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1177  buf[pos+48] = intbuf[48] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1178  buf[pos+49] = intbuf[49] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1179  buf[pos+50] = intbuf[50] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1180  buf[pos+51] = intbuf[51] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1181  buf[pos+52] = intbuf[52] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1182  buf[pos+53] = intbuf[53] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1183  buf[pos+54] = intbuf[54] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1184  buf[pos+55] = intbuf[55] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1185  buf[pos+56] = intbuf[56] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1186  buf[pos+57] = intbuf[57] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1187  buf[pos+58] = intbuf[58] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1188  buf[pos+59] = intbuf[59] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1189  buf[pos+60] = intbuf[60] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1190  buf[pos+61] = intbuf[61] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1191  buf[pos+62] = intbuf[62] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1192  buf[pos+63] = intbuf[63] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1193  buf[pos+64] = intbuf[64] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1194  buf[pos+65] = intbuf[65] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1195  buf[pos+66] = intbuf[66] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1196  buf[pos+67] = intbuf[67] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1197  buf[pos+68] = intbuf[68] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1198  buf[pos+69] = intbuf[69] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1199  buf[pos+70] = intbuf[70] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1200  buf[pos+71] = intbuf[71] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1201  buf[pos+72] = intbuf[72] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1202  buf[pos+73] = intbuf[73] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1203  buf[pos+74] = intbuf[74] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1204  buf[pos+75] = intbuf[75] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1205  buf[pos+76] = intbuf[76] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1206  buf[pos+77] = intbuf[77] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1207  buf[pos+78] = intbuf[78] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1208  buf[pos+79] = intbuf[79] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1209  buf[pos+80] = intbuf[80] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1210  buf[pos+81] = intbuf[81] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1211  buf[pos+82] = intbuf[82] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1212  buf[pos+83] = intbuf[83] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1213  buf[pos+84] = intbuf[84] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1214  buf[pos+85] = intbuf[85] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1215  buf[pos+86] = intbuf[86] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1216  buf[pos+87] = intbuf[87] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1217  buf[pos+88] = intbuf[88] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1218  buf[pos+89] = intbuf[89] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1219  buf[pos+90] = intbuf[90] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1220  buf[pos+91] = intbuf[91] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1221  buf[pos+92] = intbuf[92] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1222  buf[pos+93] = intbuf[93] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1223  buf[pos+94] = intbuf[94] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1224  buf[pos+95] = intbuf[95] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1225  buf[pos+96] = intbuf[96] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1226  buf[pos+97] = intbuf[97] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1227  buf[pos+98] = intbuf[98] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1228  buf[pos+99] = intbuf[99] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1229  buf[pos+100] = intbuf[100] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1230  buf[pos+101] = intbuf[101] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1231  buf[pos+102] = intbuf[102] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1232  buf[pos+103] = intbuf[103] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1233  buf[pos+104] = intbuf[104] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1234  buf[pos+105] = intbuf[105] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1235  buf[pos+106] = intbuf[106] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1236  buf[pos+107] = intbuf[107] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1237  buf[pos+108] = intbuf[108] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1238  buf[pos+109] = intbuf[109] >> interpolation_shifts<SdrBits, OutputBits>::post64;
1239 
1240  ++(*it);
1241  }
1242 }
1243 
1244 template<typename T, uint SdrBits, uint OutputBits>
1245 void Interpolators<T, SdrBits, OutputBits>::interpolate64_inf(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
1246 {
1247  qint32 intbuf[256];
1248  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
1249 
1250  if (invertIQ)
1251  {
1252  bufI0 = &intbuf[1];
1253  bufQ0 = &intbuf[0];
1254  bufI1 = &intbuf[129];
1255  bufQ1 = &intbuf[128];
1256  }
1257  else
1258  {
1259  bufI0 = &intbuf[0];
1260  bufQ0 = &intbuf[1];
1261  bufI1 = &intbuf[128];
1262  bufQ1 = &intbuf[129];
1263  }
1264 
1265  for (int pos = 0; pos < len - 255; pos += 256)
1266  {
1267  memset(intbuf, 0, 256*sizeof(qint32));
1268  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre64;
1269  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre64;
1270  ++(*it);
1271  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre64;
1272  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre64;
1273  ++(*it);
1274 
1275  m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[64], &intbuf[65], &intbuf[128], &intbuf[129], &intbuf[192], &intbuf[193]);
1276 
1277  m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33], &intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]);
1278  m_interpolator4.myInterpolateInf(&intbuf[128], &intbuf[129], &intbuf[160], &intbuf[161], &intbuf[192], &intbuf[193], &intbuf[224], &intbuf[225]);
1279 
1280  m_interpolator8.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
1281  m_interpolator8.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81], &intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]);
1282  m_interpolator8.myInterpolateSup(&intbuf[128], &intbuf[129], &intbuf[144], &intbuf[145], &intbuf[160], &intbuf[161], &intbuf[176], &intbuf[177]);
1283  m_interpolator8.myInterpolateSup(&intbuf[192], &intbuf[193], &intbuf[208], &intbuf[209], &intbuf[224], &intbuf[225], &intbuf[240], &intbuf[241]);
1284 
1285  m_interpolator16.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
1286  m_interpolator16.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
1287  m_interpolator16.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73], &intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]);
1288  m_interpolator16.myInterpolateInf(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105], &intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]);
1289  m_interpolator16.myInterpolateInf(&intbuf[128], &intbuf[129], &intbuf[136], &intbuf[137], &intbuf[144], &intbuf[145], &intbuf[152], &intbuf[153]);
1290  m_interpolator16.myInterpolateInf(&intbuf[160], &intbuf[161], &intbuf[168], &intbuf[169], &intbuf[176], &intbuf[177], &intbuf[184], &intbuf[185]);
1291  m_interpolator16.myInterpolateInf(&intbuf[192], &intbuf[193], &intbuf[200], &intbuf[201], &intbuf[208], &intbuf[209], &intbuf[216], &intbuf[217]);
1292  m_interpolator16.myInterpolateInf(&intbuf[224], &intbuf[225], &intbuf[232], &intbuf[233], &intbuf[240], &intbuf[241], &intbuf[248], &intbuf[249]);
1293 
1294  for (int i = 0; i < 16; i++) {
1295  m_interpolator32.myInterpolateSup(
1296  &intbuf[16*i+0],
1297  &intbuf[16*i+1],
1298  &intbuf[16*i+4],
1299  &intbuf[16*i+5],
1300  &intbuf[16*i+8],
1301  &intbuf[16*i+9],
1302  &intbuf[16*i+12],
1303  &intbuf[16*i+13]);
1304  }
1305 
1306  for (int i = 0; i < 32; i++) {
1307  m_interpolator64.myInterpolateInf(
1308  &intbuf[8*i+0],
1309  &intbuf[8*i+1],
1310  &intbuf[8*i+2],
1311  &intbuf[8*i+3],
1312  &intbuf[8*i+4],
1313  &intbuf[8*i+5],
1314  &intbuf[8*i+6],
1315  &intbuf[8*i+7]);
1316  }
1317 
1318  for (int i = 0; i < 256; i++) {
1320  }
1321  }
1322 }
1323 
1324 template<typename T, uint SdrBits, uint OutputBits>
1325 void Interpolators<T, SdrBits, OutputBits>::interpolate64_sup(SampleVector::iterator* it, T* buf, qint32 len, bool invertIQ)
1326 {
1327  qint32 intbuf[256];
1328  qint32 *bufI0, *bufQ0, *bufI1, *bufQ1;
1329 
1330  if (invertIQ)
1331  {
1332  bufI0 = &intbuf[1];
1333  bufQ0 = &intbuf[0];
1334  bufI1 = &intbuf[129];
1335  bufQ1 = &intbuf[128];
1336  }
1337  else
1338  {
1339  bufI0 = &intbuf[0];
1340  bufQ0 = &intbuf[1];
1341  bufI1 = &intbuf[128];
1342  bufQ1 = &intbuf[129];
1343  }
1344 
1345  for (int pos = 0; pos < len - 255; pos += 256)
1346  {
1347  memset(intbuf, 0, 256*sizeof(qint32));
1348  *bufI0 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre64;
1349  *bufQ0 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre64;
1350  ++(*it);
1351  *bufI1 = (**it).m_real << interpolation_shifts<SdrBits, OutputBits>::pre64;
1352  *bufQ1 = (**it).m_imag << interpolation_shifts<SdrBits, OutputBits>::pre64;
1353  ++(*it);
1354 
1355  m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[64], &intbuf[65], &intbuf[128], &intbuf[129], &intbuf[192], &intbuf[193]);
1356 
1357  m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33], &intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]);
1358  m_interpolator4.myInterpolateSup(&intbuf[128], &intbuf[129], &intbuf[160], &intbuf[161], &intbuf[192], &intbuf[193], &intbuf[224], &intbuf[225]);
1359 
1360  m_interpolator8.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]);
1361  m_interpolator8.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81], &intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]);
1362  m_interpolator8.myInterpolateInf(&intbuf[128], &intbuf[129], &intbuf[144], &intbuf[145], &intbuf[160], &intbuf[161], &intbuf[176], &intbuf[177]);
1363  m_interpolator8.myInterpolateInf(&intbuf[192], &intbuf[193], &intbuf[208], &intbuf[209], &intbuf[224], &intbuf[225], &intbuf[240], &intbuf[241]);
1364 
1365  m_interpolator16.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]);
1366  m_interpolator16.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]);
1367  m_interpolator16.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73], &intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]);
1368  m_interpolator16.myInterpolateSup(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105], &intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]);
1369  m_interpolator16.myInterpolateSup(&intbuf[128], &intbuf[129], &intbuf[136], &intbuf[137], &intbuf[144], &intbuf[145], &intbuf[152], &intbuf[153]);
1370  m_interpolator16.myInterpolateSup(&intbuf[160], &intbuf[161], &intbuf[168], &intbuf[169], &intbuf[176], &intbuf[177], &intbuf[184], &intbuf[185]);
1371  m_interpolator16.myInterpolateSup(&intbuf[192], &intbuf[193], &intbuf[200], &intbuf[201], &intbuf[208], &intbuf[209], &intbuf[216], &intbuf[217]);
1372  m_interpolator16.myInterpolateSup(&intbuf[224], &intbuf[225], &intbuf[232], &intbuf[233], &intbuf[240], &intbuf[241], &intbuf[248], &intbuf[249]);
1373 
1374  for (int i = 0; i < 16; i++) {
1375  m_interpolator32.myInterpolateInf(
1376  &intbuf[16*i+0],
1377  &intbuf[16*i+1],
1378  &intbuf[16*i+4],
1379  &intbuf[16*i+5],
1380  &intbuf[16*i+8],
1381  &intbuf[16*i+9],
1382  &intbuf[16*i+12],
1383  &intbuf[16*i+13]);
1384  }
1385 
1386  for (int i = 0; i < 32; i++) {
1387  m_interpolator64.myInterpolateSup(
1388  &intbuf[8*i+0],
1389  &intbuf[8*i+1],
1390  &intbuf[8*i+2],
1391  &intbuf[8*i+3],
1392  &intbuf[8*i+4],
1393  &intbuf[8*i+5],
1394  &intbuf[8*i+6],
1395  &intbuf[8*i+7]);
1396  }
1397 
1398  for (int i = 0; i < 256; i++) {
1400  }
1401  }
1402 }
1403 
1404 #endif /* INCLUDE_GPL_DSP_INTERPOLATORS_H_ */
void interpolate64_sup(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint post1
Definition: interpolators.h:35
static const uint pre2
Definition: interpolators.h:36
static const uint post8
Definition: interpolators.h:41
void interpolate64_cen(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint pre8
Definition: interpolators.h:40
IntHalfbandFilterDB< qint32, INTERPOLATORS_HB_FILTER_ORDER_SECOND > m_interpolator4
IntHalfbandFilterDB< qint32, INTERPOLATORS_HB_FILTER_ORDER_NEXT > m_interpolator32
void interpolate8_inf(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate32_inf(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate32_cen(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate4_inf(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint post16
Definition: interpolators.h:43
static const uint pre32
Definition: interpolators.h:44
void interpolate8_cen(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint pre4
Definition: interpolators.h:38
int32_t i
Definition: decimators.h:244
void interpolate2_cen(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint post4
Definition: interpolators.h:39
IntHalfbandFilterDB< qint32, INTERPOLATORS_HB_FILTER_ORDER_NEXT > m_interpolator8
IntHalfbandFilterDB< qint32, INTERPOLATORS_HB_FILTER_ORDER_FIRST > m_interpolator2
static const uint post32
Definition: interpolators.h:45
void interpolate16_inf(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate2_sup(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate2_inf(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint post64
Definition: interpolators.h:47
static const uint post2
Definition: interpolators.h:37
IntHalfbandFilterDB< qint32, INTERPOLATORS_HB_FILTER_ORDER_NEXT > m_interpolator64
void interpolate1(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate16_sup(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate32_sup(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate8_sup(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate16_cen(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate4_cen(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
void interpolate64_inf(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
static const uint pre16
Definition: interpolators.h:42
static const uint pre64
Definition: interpolators.h:46
void interpolate4_sup(SampleVector::iterator *it, T *buf, qint32 len, bool invertIQ=false)
IntHalfbandFilterDB< qint32, INTERPOLATORS_HB_FILTER_ORDER_NEXT > m_interpolator16