1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-02-03 09:44:01 -05:00

Channel analyzer NG: use input selection

This commit is contained in:
f4exb 2018-05-20 11:54:05 +02:00
parent d673278f86
commit cbda404926
4 changed files with 43 additions and 28 deletions

View File

@ -148,8 +148,7 @@ void ChannelAnalyzerNG::processOneSample(Complex& c, fftfilt::cmplx *sideband)
Real re = m_sum.real() / SDR_RX_SCALED;
Real im = m_sum.imag() / SDR_RX_SCALED;
m_magsq = re*re + im*im;
Real mixI = 1.0f;
Real mixQ = 0.0f;
std::complex<float> mix;
if (m_settings.m_pll)
{
@ -157,40 +156,17 @@ void ChannelAnalyzerNG::processOneSample(Complex& c, fftfilt::cmplx *sideband)
{
m_fll.feed(re, im);
// Use -fPLL to mix (exchange PLL real and image in the complex multiplication)
mixI = m_sum.real() * m_fll.getImag() - m_sum.imag() * m_fll.getReal();
mixQ = m_sum.real() * m_fll.getReal() + m_sum.imag() * m_fll.getImag();
// mixI = m_fll.getReal() * SDR_RX_SCALED;
// mixQ = m_fll.getImag() * SDR_RX_SCALED;
mix = m_sum * std::conj(m_fll.getComplex());
}
else
{
m_pll.feed(re, im);
// Use -fPLL to mix (exchange PLL real and image in the complex multiplication)
mixI = m_sum.real() * m_pll.getImag() - m_sum.imag() * m_pll.getReal();
mixQ = m_sum.real() * m_pll.getReal() + m_sum.imag() * m_pll.getImag();
}
if (m_settings.m_ssb & !m_usb)
{ // invert spectrum for LSB
m_sampleBuffer.push_back(Sample(mixQ, mixI));
}
else
{
m_sampleBuffer.push_back(Sample(mixI, mixQ));
}
}
else
{
if (m_settings.m_ssb & !m_usb)
{ // invert spectrum for LSB
m_sampleBuffer.push_back(Sample(m_sum.imag(), m_sum.real()));
}
else
{
m_sampleBuffer.push_back(Sample(m_sum.real(), m_sum.imag()));
mix = m_sum * std::conj(m_pll.getComplex());
}
}
feedOneSample(m_settings.m_pll ? mix : m_sum, m_settings.m_fll ? m_fll.getComplex() : m_pll.getComplex());
m_sum = 0;
}
}

View File

@ -240,6 +240,32 @@ private:
void applySettings(const ChannelAnalyzerNGSettings& settings, bool force = false);
void setFilters(int sampleRate, float bandwidth, float lowCutoff);
void processOneSample(Complex& c, fftfilt::cmplx *sideband);
inline void feedOneSample(const fftfilt::cmplx& s, const fftfilt::cmplx& pll)
{
switch (m_settings.m_inputType)
{
case ChannelAnalyzerNGSettings::InputPLL:
{
if (m_settings.m_ssb & !m_usb) { // invert spectrum for LSB
m_sampleBuffer.push_back(Sample(pll.imag(), pll.real()));
} else {
m_sampleBuffer.push_back(Sample(pll.real(), pll.imag()));
}
}
break;
case ChannelAnalyzerNGSettings::InputSignal:
default:
{
if (m_settings.m_ssb & !m_usb) { // invert spectrum for LSB
m_sampleBuffer.push_back(Sample(s.imag(), s.real()));
} else {
m_sampleBuffer.push_back(Sample(s.real(), s.imag()));
}
}
break;
}
}
};
#endif // INCLUDE_CHANALYZERNG_H

View File

@ -41,6 +41,7 @@ void ChannelAnalyzerNGSettings::resetToDefaults()
m_pll = false;
m_fll = false;
m_pllPskOrder = 1;
m_inputType = InputSignal;
m_rgbColor = QColor(128, 128, 128).rgb();
}
@ -61,6 +62,7 @@ QByteArray ChannelAnalyzerNGSettings::serialize() const
s.writeBool(11, m_pll);
s.writeBool(12, m_fll);
s.writeU32(13, m_pllPskOrder);
s.writeS32(14, (int) m_inputType);
return s.final();
}
@ -78,6 +80,7 @@ bool ChannelAnalyzerNGSettings::deserialize(const QByteArray& data)
if(d.getVersion() == 1)
{
QByteArray bytetmp;
int tmp;
d.readS32(1, &m_frequency, 0);
d.readS32(2, &m_bandwidth, 5000);
@ -102,6 +105,8 @@ bool ChannelAnalyzerNGSettings::deserialize(const QByteArray& data)
d.readBool(11, &m_pll, false);
d.readBool(12, &m_fll, false);
d.readU32(13, &m_pllPskOrder, 1);
d.readS32(14, &tmp, 0);
m_inputType = (InputType) tmp;
return true;
}

View File

@ -23,6 +23,13 @@ class Serializable;
struct ChannelAnalyzerNGSettings
{
enum InputType
{
InputSignal,
InputPLL,
InputAutoCorr
};
int m_frequency;
bool m_downSample;
quint32 m_downSampleRate;
@ -33,6 +40,7 @@ struct ChannelAnalyzerNGSettings
bool m_pll;
bool m_fll;
unsigned int m_pllPskOrder;
InputType m_inputType;
quint32 m_rgbColor;
QString m_title;
Serializable *m_channelMarker;