void QFilter::Normalize(CPX &in, CPX &out, int size) { float norm = 1.0f/size; for (int i = 0; i < size; i++) { out[i].re = in.at(i).re * norm; out[i].im = in.at(i).im * norm; } }
void QDSPEngine::processDSP(CPX &in, CPX &out, int size) { m_mutex.lock(); switch (m_fftMultiplcator) { case 1: spectrum->ProcessSpectrum(in, size*2, 1); break; case 2: spectrum2->ProcessSpectrum(in, size*4, 3); break; case 4: spectrum4->ProcessSpectrum(in, size*8, 7); break; case 8: spectrum8->ProcessSpectrum(in, size*16, 15); break; } if (m_NcoFreq != 0) ProcessFrequencyShift(in, in, size); filter->ProcessFilter(in, tmp1CPX, size); signalmeter->ProcessBlock(tmp1CPX, size); wpagc->ProcessAGC(tmp1CPX, tmp2CPX, size); demod->ProcessBlock(tmp2CPX, out, size); //memcpy(out.data(), in.data(), size * sizeof(cpx)); //out = in; for (int i = 0; i < size; i++) { out[i] = ScaleCPX(out.at(i), m_volume); } m_mutex.unlock(); }
void QAGC::ProcessAGC(const CPX &in, CPX &out, int size) { if (m_agcMode == agcOFF) { for (int i = 0; i < size; i++) out[i] = ScaleCPX(in[i], m_gainFix); //memcpy(out.data(), in.data(), size * sizeof(cpx)); return; } unsigned int hangTime = (unsigned int)(m_samplerate * m_hangTime); unsigned int fastHangTime = (unsigned int)(m_samplerate * m_fastHangTime); float hangThresh = 0.0; if (m_hangThresh > 0.0) hangThresh = m_gainTop * m_hangThresh + m_gainBottom * (1.0 - m_hangThresh); for (int i = 0; i < m_size; i++) { G[m_index] = in.at(i); float tmp = 1.1 * SqrMagCPX(G.at(m_index)); if (tmp == 0.0) tmp = m_gainNow; else tmp = m_gainLimit / tmp; if (tmp < hangThresh) m_hangIndex = hangTime; if (tmp > m_gainNow) { if (m_hangIndex++ > (qint16)hangTime) m_gainNow = m_oneMDecay * m_gainNow + m_decay * qMin(m_gainTop, tmp); } else { m_hangIndex = 0; m_gainNow = m_oneMAttack * m_gainNow + m_attack * qMax(tmp, m_gainBottom); } tmp = 1.2 * SqrMagCPX(G[m_fastIndex]); if (tmp != 0.0) tmp = m_gainLimit / tmp; else tmp = m_gainFastNow; if (tmp > m_gainFastNow) { if (m_fastHang++ > (qint16)fastHangTime) m_gainFastNow = qMin(m_oneMFastDecay * m_gainFastNow + m_fastDecay * qMin(m_gainTop, tmp), m_gainTop); } else { m_fastHang = 0; m_gainFastNow = qMax(m_oneMFastAttack * m_gainFastNow + m_fastAttack * qMax(tmp, m_gainBottom), m_gainBottom); } m_gainFastNow = qMax(qMin(m_gainFastNow, m_gainTop), m_gainBottom); m_gainNow = qMax(qMin(m_gainNow, m_gainTop), m_gainBottom); out[i].re = Scale(G.at(m_sndex).re, qMin(m_gainFastNow, qMin(m_slope * m_gainNow, m_gainTop))); out[i].im = Scale(G.at(m_sndex).im, qMin(m_gainFastNow, qMin(m_slope * m_gainNow, m_gainTop))); m_index = (m_index + m_mask) & m_mask; m_sndex = (m_sndex + m_mask) & m_mask; m_fastIndex = (m_fastIndex + m_mask) & m_mask; } }