74 , m_iFFTlength(p_iMaxSamples)
75 , m_pFiffInfo(p_pFiffInfo)
76 , m_dataLength(p_dataLen)
79 qRegisterMetaType<Eigen::MatrixXd>(
"Eigen::MatrixXd");
82 m_Fs = m_pFiffInfo->sfreq;
84 SendDataToBuffer =
true;
89 m_fWin = hanning(m_iFFTlength,0);
91 qDebug()<<
"Hanning window is created.";
107 QVector <float> RtNoise::hanning(
int N,
short itype)
110 QVector <float> w(N,0.0);
120 for(i=0; i<half; i++)
121 w[i] = 0.5 * (1 - cos(2*3.14159265*(i+1) / (n+1)));
124 for(i=half; i<n; i++) {
132 for(i=0; i<half; i++)
133 w[i] = 0.5 * (1 - cos(23.14159265*(i+1) / (n+1)));
136 for(i=half; i<n; i++) {
144 for(i=N-1; i>=1; i--)
155 if(!m_pRawMatrixBuffer)
158 if (SendDataToBuffer)
159 m_pRawMatrixBuffer->
push(&p_DataSegment);
182 m_bIsRunning =
false;
186 m_pRawMatrixBuffer->
clear();
188 qDebug()<<
" RtNoise Thread is stopped.";
198 bool FirstStart =
true;
202 if(m_pRawMatrixBuffer)
204 MatrixXd block = m_pRawMatrixBuffer->
pop();
208 if(m_dataLength < 0) m_dataLength = 10;
209 NumOfBlocks = m_dataLength;
210 BlockSize = block.cols();
211 Sensors = block.rows();
213 CircBuf.resize(Sensors,NumOfBlocks*BlockSize);
219 for (
int i=0; i< Sensors; i++)
220 for (
int j=0; j< BlockSize; j++)
221 CircBuf(i,j+BlockIndex*BlockSize) = block(i,j);
225 if (BlockIndex >= NumOfBlocks){
229 SendDataToBuffer =
false;
233 MatrixXd sum_psdx = MatrixXd::Zero(Sensors,m_iFFTlength/2+1);
235 int nb = floor(NumOfBlocks*BlockSize/m_iFFTlength)+1;
236 qDebug()<<
"nb"<<nb<<
"NumOfBlocks"<<NumOfBlocks<<
"BlockSize"<<BlockSize;
237 MatrixXd t_mat(Sensors,m_iFFTlength);
238 MatrixXd t_psdx(Sensors,m_iFFTlength/2+1);
239 for (
int n = 0; n<nb; n++){
243 for(qint32 ii=0; ii<Sensors; ii++)
244 for(qint32 jj=0; jj<m_iFFTlength; jj++)
245 if(jj+n*m_iFFTlength<NumOfBlocks*BlockSize)
246 t_mat(ii,jj) = CircBuf(ii,jj+n*m_iFFTlength);
253 for(qint32 ii=0; ii<Sensors; ii++)
254 for(qint32 jj=0; jj<m_iFFTlength; jj++)
255 t_mat(ii,jj) = CircBuf(ii,jj+n*m_iFFTlength);
259 for(qint32 i = 0; i < t_mat.rows(); i++){
265 RowVectorXd t_dataZeroPad = RowVectorXd::Zero(m_iFFTlength);
266 t_dataZeroPad.head(data.cols()) = data;
268 for (qint32 lk = 0; lk<m_iFFTlength; lk++)
269 t_dataZeroPad[lk] = t_dataZeroPad[lk]*m_fWin[lk];
272 Eigen::FFT<double> fft;
273 fft.SetFlag(fft.HalfSpectrum);
276 RowVectorXcd t_freqData(m_iFFTlength/2+1);
277 fft.fwd(t_freqData,t_dataZeroPad);
280 for(qint32 j=0; j<m_iFFTlength/2+1;j++)
282 double mag_abs = sqrt(t_freqData(j).real()* t_freqData(j).real() + t_freqData(j).imag()*t_freqData(j).imag());
283 double spower = (1.0/(m_Fs*m_iFFTlength))* mag_abs;
284 if (j>0&&j<m_iFFTlength/2) spower = 2.0*spower;
285 sum_psdx(i,j) = sum_psdx(i,j) + spower;
291 for(qint32 ii=0; ii<Sensors; ii++)
292 for(qint32 jj=0; jj<m_iFFTlength/2+1; jj++)
293 t_psdx(ii,jj) = 10.0*log10(sum_psdx(ii,jj)/nb);
295 qDebug()<<
"Send spectrum to Noise Estimator";
297 if(m_pRawMatrixBuffer->
size()>0)
298 m_pRawMatrixBuffer->
clear();
300 SendDataToBuffer =
true;
void append(const MatrixXd &p_DataSegment)
QSharedPointer< CircularMatrixBuffer > SPtr
RtNoise(qint32 p_iMaxSamples, FiffInfo::SPtr p_pFiffInfo, qint32 p_dataLen, QObject *parent=0)
QSharedPointer< FiffInfo > SPtr
void push(const Matrix< _Tp, Dynamic, Dynamic > *pMatrix)
Matrix< _Tp, Dynamic, Dynamic > pop()
void SpecCalculated(Eigen::MatrixXd)
FiffCov class declaration.
RtNoise class declaration.