是否有一种优雅的方式来转换vector <complex <float>&gt;矢量<short>?

时间:2017-04-27 12:30:06

标签: c++ c++11 vector

我的类正在接收复杂浮点数的向量,但数据流数据包必须将数据设置为short。我的解决方案是首先将数据转换为short,然后将其批量处理为数据包,然后发送它们。转换这些数据的最佳方法是什么?

复杂数据应映射到两个单独的变量:例如,vcfSampleData[0].real() - &gt; m_pData[0]vcfSampleData[0].imag() - &gt; m_pData[1]等等。

void cPXGFtoWaveBase::BufferSampleData(const std::vector<std::complex<float>>& vcfSampleData, const float& fTotalGain_dB, const cFrequency& CentreFrequency, const cBandwidth& cBandwidth, const cTimeStamp& tCaptureTime, const cSampleRate& SampleRate)
{
    sBufferData* pWriteElement = m_SampleBuffer.GetWriteElement();
    if(pWriteElement != nullptr) {
        std::copy(vcfSampleData.begin(), vcfSampleData.end(), pWriteElement->m_pData); //vector<comlex<float>> must become vector<complex<short>> or vector<short>
        //other irrelevant stuff here
        m_SampleBuffer.CommitWriteElement();
    }
}

2 个答案:

答案 0 :(得分:0)

KISS。

void Transform (const std::vector<std::complex<float>>& vSrc, const std::vector<short>& vDst) {
    vDst.resize(2*vSrc.size());
    for (std::size_t i=0; i<vSrc.size(); i++) {
        vDst[2*i] = vSrc[i].real;
        vDst[2*i+1] = vSrc[i].imag;
    }
}

答案 1 :(得分:0)

没有std::功能可以满足您的要求,您只需编写循环

pWriteElement->m_pData.reserve(vcfSampleData.size() * 2);
pWriteElement->m_pData.clear();
for (auto cmpl : vcfSampleData)
{
    pWriteElement->m_pData.push_back(cmpl.real());
    pWriteElement->m_pData.push_back(cmpl.imag());
}