Example #1
0
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;
	}
}
Example #2
0
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();
}
Example #3
0
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;
    }
}