87 m_iNumOfBlocks = m_iDataLength;
88 m_iBlockSize =
static_cast<int>(matData.cols());
89 m_iSensors =
static_cast<int>(matData.rows());
90 m_matCircBuf.resize(m_iSensors, m_iNumOfBlocks * m_iBlockSize);
92 m_bFirstBlock =
false;
96 m_matCircBuf.block(0, m_iBlockIndex * m_iBlockSize, m_iSensors, m_iBlockSize) = matData;
99 if(m_iBlockIndex < m_iNumOfBlocks) {
106 const int iTotalSamples = m_iNumOfBlocks * m_iBlockSize;
107 const int iHalfSpec = m_iFftLength / 2 + 1;
108 const int nb = iTotalSamples / m_iFftLength + 1;
110 MatrixXd sum_psdx = MatrixXd::Zero(m_iSensors, iHalfSpec);
111 RowVectorXd vecDataZeroPad = RowVectorXd::Zero(m_iFftLength);
112 RowVectorXcd vecFreqData(iHalfSpec);
114 for(
int n = 0; n < nb; ++n) {
115 const int iOffset = n * m_iFftLength;
117 for(
int i = 0; i < m_iSensors; ++i) {
119 vecDataZeroPad.setZero();
120 const int iCopyLen = std::min(m_iFftLength, iTotalSamples - iOffset);
121 vecDataZeroPad.head(iCopyLen) = m_matCircBuf.block(i, iOffset, 1, iCopyLen);
124 for(
int k = 0; k < m_iFftLength; ++k) {
125 vecDataZeroPad[k] *= m_fWin[k];
129 Eigen::FFT<double> fft;
130 fft.SetFlag(fft.HalfSpectrum);
131 fft.fwd(vecFreqData, vecDataZeroPad);
134 for(
int j = 0; j < iHalfSpec; ++j) {
135 const double mag = std::abs(vecFreqData(j));
136 double spower = mag / (m_dFs * m_iFftLength);
137 if(j > 0 && j < m_iFftLength / 2) {
140 sum_psdx(i, j) += spower;
146 MatrixXd matResult(m_iSensors, iHalfSpec);
147 for(
int i = 0; i < m_iSensors; ++i) {
148 for(
int j = 0; j < iHalfSpec; ++j) {
149 matResult(i, j) = 10.0 * std::log10(sum_psdx(i, j) / nb);
204 qRegisterMetaType<Eigen::MatrixXd>(
"Eigen::MatrixXd");
206 auto* worker =
new RtNoiseWorker(iFftLength, pFiffInfo, iDataLength);
207 worker->moveToThread(&m_workerThread);
209 connect(&m_workerThread, &QThread::finished,
210 worker, &QObject::deleteLater);