diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputthread.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputthread.cpp index 1cc77b9f3..6d643c1ec 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputthread.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputthread.cpp @@ -145,9 +145,9 @@ void HackRFOutputThread::callback(qint8* buf, qint32 len) case 5: m_interpolators.interpolate32_inf(&beginRead, buf, len); break; - // case 6: - // m_interpolators.interpolate64_cen(&beginRead, buf, len); - // break; + case 6: + m_interpolators.interpolate64_inf(&beginRead, buf, len); + break; default: break; } @@ -171,9 +171,9 @@ void HackRFOutputThread::callback(qint8* buf, qint32 len) case 5: m_interpolators.interpolate32_sup(&beginRead, buf, len); break; - // case 6: - // m_interpolators.interpolate64_cen(&beginRead, buf, len); - // break; + case 6: + m_interpolators.interpolate64_sup(&beginRead, buf, len); + break; default: break; } diff --git a/sdrbase/dsp/interpolators.h b/sdrbase/dsp/interpolators.h index 7d1a9dfdb..92b43f602 100644 --- a/sdrbase/dsp/interpolators.h +++ b/sdrbase/dsp/interpolators.h @@ -128,6 +128,8 @@ public: void interpolate32_sup(SampleVector::iterator* it, T* buf, qint32 len); void interpolate64_cen(SampleVector::iterator* it, T* buf, qint32 len); + void interpolate64_inf(SampleVector::iterator* it, T* buf, qint32 len); + void interpolate64_sup(SampleVector::iterator* it, T* buf, qint32 len); private: #ifdef USE_SSE4_1 @@ -506,10 +508,10 @@ void Interpolators::interpolate16_inf(SampleVector::iter intbuf[33] = (**it).m_imag << interpolation_shifts::pre16; ++(*it); - m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]); + m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]); - m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]); - m_interpolator4.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]); + m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]); + m_interpolator4.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]); m_interpolator8.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]); m_interpolator8.myInterpolateInf(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]); @@ -546,10 +548,10 @@ void Interpolators::interpolate16_sup(SampleVector::iter intbuf[33] = (**it).m_imag << interpolation_shifts::pre16; ++(*it); - m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]); + m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]); - m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]); - m_interpolator4.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]); + m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]); + m_interpolator4.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]); m_interpolator8.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[4], &intbuf[5], &intbuf[8], &intbuf[9], &intbuf[12], &intbuf[13]); m_interpolator8.myInterpolateSup(&intbuf[16], &intbuf[17], &intbuf[20], &intbuf[21], &intbuf[24], &intbuf[25], &intbuf[28], &intbuf[29]); @@ -994,4 +996,132 @@ void Interpolators::interpolate64_cen(SampleVector::iter } } +template +void Interpolators::interpolate64_inf(SampleVector::iterator* it, T* buf, qint32 len) +{ + qint32 intbuf[256]; + + for (int pos = 0; pos < len - 255; pos += 256) + { + memset(intbuf, 0, 256*sizeof(qint32)); + intbuf[0] = (**it).m_real << interpolation_shifts::pre64; + intbuf[1] = (**it).m_imag << interpolation_shifts::pre64; + ++(*it); + intbuf[128] = (**it).m_real << interpolation_shifts::pre64; + intbuf[129] = (**it).m_imag << interpolation_shifts::pre64; + ++(*it); + + m_interpolator2.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[64], &intbuf[65], &intbuf[128], &intbuf[129], &intbuf[192], &intbuf[193]); + + m_interpolator4.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33], &intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]); + m_interpolator4.myInterpolateInf(&intbuf[128], &intbuf[129], &intbuf[160], &intbuf[161], &intbuf[192], &intbuf[193], &intbuf[224], &intbuf[225]); + + m_interpolator8.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]); + m_interpolator8.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81], &intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]); + m_interpolator8.myInterpolateSup(&intbuf[128], &intbuf[129], &intbuf[144], &intbuf[145], &intbuf[160], &intbuf[161], &intbuf[176], &intbuf[177]); + m_interpolator8.myInterpolateSup(&intbuf[192], &intbuf[193], &intbuf[208], &intbuf[209], &intbuf[224], &intbuf[225], &intbuf[240], &intbuf[241]); + + m_interpolator16.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]); + m_interpolator16.myInterpolateInf(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]); + m_interpolator16.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73], &intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]); + m_interpolator16.myInterpolateInf(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105], &intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]); + m_interpolator16.myInterpolateInf(&intbuf[128], &intbuf[129], &intbuf[136], &intbuf[137], &intbuf[144], &intbuf[145], &intbuf[152], &intbuf[153]); + m_interpolator16.myInterpolateInf(&intbuf[160], &intbuf[161], &intbuf[168], &intbuf[169], &intbuf[176], &intbuf[177], &intbuf[184], &intbuf[185]); + m_interpolator16.myInterpolateInf(&intbuf[192], &intbuf[193], &intbuf[200], &intbuf[201], &intbuf[208], &intbuf[209], &intbuf[216], &intbuf[217]); + m_interpolator16.myInterpolateInf(&intbuf[224], &intbuf[225], &intbuf[232], &intbuf[233], &intbuf[240], &intbuf[241], &intbuf[248], &intbuf[249]); + + for (int i = 0; i < 16; i++) { + m_interpolator32.myInterpolateSup( + &intbuf[16*i+0], + &intbuf[16*i+1], + &intbuf[16*i+4], + &intbuf[16*i+5], + &intbuf[16*i+8], + &intbuf[16*i+9], + &intbuf[16*i+12], + &intbuf[16*i+13]); + } + + for (int i = 0; i < 32; i++) { + m_interpolator64.myInterpolateInf( + &intbuf[8*i+0], + &intbuf[8*i+1], + &intbuf[8*i+2], + &intbuf[8*i+3], + &intbuf[8*i+4], + &intbuf[8*i+5], + &intbuf[8*i+6], + &intbuf[8*i+7]); + } + + for (int i = 0; i < 256; i++) { + buf[pos+i] = intbuf[i] >> interpolation_shifts::post64; + } + } +} + +template +void Interpolators::interpolate64_sup(SampleVector::iterator* it, T* buf, qint32 len) +{ + qint32 intbuf[256]; + + for (int pos = 0; pos < len - 255; pos += 256) + { + memset(intbuf, 0, 256*sizeof(qint32)); + intbuf[0] = (**it).m_real << interpolation_shifts::pre64; + intbuf[1] = (**it).m_imag << interpolation_shifts::pre64; + ++(*it); + intbuf[128] = (**it).m_real << interpolation_shifts::pre64; + intbuf[129] = (**it).m_imag << interpolation_shifts::pre64; + ++(*it); + + m_interpolator2.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[64], &intbuf[65], &intbuf[128], &intbuf[129], &intbuf[192], &intbuf[193]); + + m_interpolator4.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[32], &intbuf[33], &intbuf[64], &intbuf[65], &intbuf[96], &intbuf[97]); + m_interpolator4.myInterpolateSup(&intbuf[128], &intbuf[129], &intbuf[160], &intbuf[161], &intbuf[192], &intbuf[193], &intbuf[224], &intbuf[225]); + + m_interpolator8.myInterpolateInf(&intbuf[0], &intbuf[1], &intbuf[16], &intbuf[17], &intbuf[32], &intbuf[33], &intbuf[48], &intbuf[49]); + m_interpolator8.myInterpolateInf(&intbuf[64], &intbuf[65], &intbuf[80], &intbuf[81], &intbuf[96], &intbuf[97], &intbuf[112], &intbuf[113]); + m_interpolator8.myInterpolateInf(&intbuf[128], &intbuf[129], &intbuf[144], &intbuf[145], &intbuf[160], &intbuf[161], &intbuf[176], &intbuf[177]); + m_interpolator8.myInterpolateInf(&intbuf[192], &intbuf[193], &intbuf[208], &intbuf[209], &intbuf[224], &intbuf[225], &intbuf[240], &intbuf[241]); + + m_interpolator16.myInterpolateSup(&intbuf[0], &intbuf[1], &intbuf[8], &intbuf[9], &intbuf[16], &intbuf[17], &intbuf[24], &intbuf[25]); + m_interpolator16.myInterpolateSup(&intbuf[32], &intbuf[33], &intbuf[40], &intbuf[41], &intbuf[48], &intbuf[49], &intbuf[56], &intbuf[57]); + m_interpolator16.myInterpolateSup(&intbuf[64], &intbuf[65], &intbuf[72], &intbuf[73], &intbuf[80], &intbuf[81], &intbuf[88], &intbuf[89]); + m_interpolator16.myInterpolateSup(&intbuf[96], &intbuf[97], &intbuf[104], &intbuf[105], &intbuf[112], &intbuf[113], &intbuf[120], &intbuf[121]); + m_interpolator16.myInterpolateSup(&intbuf[128], &intbuf[129], &intbuf[136], &intbuf[137], &intbuf[144], &intbuf[145], &intbuf[152], &intbuf[153]); + m_interpolator16.myInterpolateSup(&intbuf[160], &intbuf[161], &intbuf[168], &intbuf[169], &intbuf[176], &intbuf[177], &intbuf[184], &intbuf[185]); + m_interpolator16.myInterpolateSup(&intbuf[192], &intbuf[193], &intbuf[200], &intbuf[201], &intbuf[208], &intbuf[209], &intbuf[216], &intbuf[217]); + m_interpolator16.myInterpolateSup(&intbuf[224], &intbuf[225], &intbuf[232], &intbuf[233], &intbuf[240], &intbuf[241], &intbuf[248], &intbuf[249]); + + for (int i = 0; i < 16; i++) { + m_interpolator32.myInterpolateInf( + &intbuf[16*i+0], + &intbuf[16*i+1], + &intbuf[16*i+4], + &intbuf[16*i+5], + &intbuf[16*i+8], + &intbuf[16*i+9], + &intbuf[16*i+12], + &intbuf[16*i+13]); + } + + for (int i = 0; i < 32; i++) { + m_interpolator64.myInterpolateSup( + &intbuf[8*i+0], + &intbuf[8*i+1], + &intbuf[8*i+2], + &intbuf[8*i+3], + &intbuf[8*i+4], + &intbuf[8*i+5], + &intbuf[8*i+6], + &intbuf[8*i+7]); + } + + for (int i = 0; i < 256; i++) { + buf[pos+i] = intbuf[i] >> interpolation_shifts::post64; + } + } +} + #endif /* INCLUDE_GPL_DSP_INTERPOLATORS_H_ */