mirror of https://github.com/f4exb/sdrangel.git
ATV Demod: FFT asymmetrical filter implementation
This commit is contained in:
parent
d6b48ed4d0
commit
4c6451b3c4
|
@ -193,13 +193,13 @@ void ATVDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
||||||
#endif
|
#endif
|
||||||
Complex c(fltI, fltQ);
|
Complex c(fltI, fltQ);
|
||||||
|
|
||||||
|
if (m_objRFRunning.m_intFrequencyOffset != 0)
|
||||||
|
{
|
||||||
|
c *= m_nco.nextIQ();
|
||||||
|
}
|
||||||
|
|
||||||
if (m_objRFRunning.m_blndecimatorEnable)
|
if (m_objRFRunning.m_blndecimatorEnable)
|
||||||
{
|
{
|
||||||
if (m_objRFRunning.m_intFrequencyOffset != 0)
|
|
||||||
{
|
|
||||||
c *= m_nco.nextIQ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci))
|
if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci))
|
||||||
{
|
{
|
||||||
demod(ci);
|
demod(ci);
|
||||||
|
@ -231,10 +231,28 @@ void ATVDemod::demod(Complex& c)
|
||||||
float fltVal;
|
float fltVal;
|
||||||
int intVal;
|
int intVal;
|
||||||
|
|
||||||
|
//********** FFT filtering **********
|
||||||
|
|
||||||
|
if (m_objRFRunning.m_blnFFTFiltering)
|
||||||
|
{
|
||||||
|
int n_out;
|
||||||
|
fftfilt::cmplx *filtered;
|
||||||
|
|
||||||
|
n_out = m_DSBFilter->runAsym(c, &filtered, m_objRFRunning.m_enmModulation != ATV_VAML); // all usb except explicitely lsb
|
||||||
|
|
||||||
|
if (n_out > 0)
|
||||||
|
{
|
||||||
|
memcpy((void *) m_DSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
|
||||||
|
m_DSBFilterBufferIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_DSBFilterBufferIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
//********** demodulation **********
|
//********** demodulation **********
|
||||||
|
|
||||||
float& fltI = c.real();
|
float& fltI = m_objRFRunning.m_blnFFTFiltering ? m_DSBFilterBuffer[m_DSBFilterBufferIndex-1].real() : c.real();
|
||||||
float& fltQ = c.imag();
|
float& fltQ = m_objRFRunning.m_blnFFTFiltering ? m_DSBFilterBuffer[m_DSBFilterBufferIndex-1].imag() : c.imag();
|
||||||
|
|
||||||
double magSq = fltI*fltI + fltQ*fltQ;
|
double magSq = fltI*fltI + fltQ*fltQ;
|
||||||
m_objMagSqAverage.feed(magSq);
|
m_objMagSqAverage.feed(magSq);
|
||||||
|
@ -647,6 +665,19 @@ void ATVDemod::applySettings()
|
||||||
getOutputMessageQueue()->push(report);
|
getOutputMessageQueue()->push(report);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((m_objConfigPrivate.m_intTVSampleRate != m_objRunningPrivate.m_intTVSampleRate)
|
||||||
|
|| (m_objRFConfig.m_fltRFBandwidth != m_objRFRunning.m_fltRFBandwidth)
|
||||||
|
|| (m_objRFConfig.m_fltRFOppBandwidth != m_objRFRunning.m_fltRFOppBandwidth))
|
||||||
|
{
|
||||||
|
m_objSettingsMutex.lock();
|
||||||
|
m_DSBFilter->create_asym_filter(m_objRFConfig.m_fltRFOppBandwidth / m_objConfigPrivate.m_intTVSampleRate,
|
||||||
|
m_objRFConfig.m_fltRFBandwidth / m_objConfigPrivate.m_intTVSampleRate);
|
||||||
|
memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen));
|
||||||
|
m_DSBFilterBufferIndex = 0;
|
||||||
|
m_objSettingsMutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
m_objRunning = m_objConfig;
|
m_objRunning = m_objConfig;
|
||||||
m_objRFRunning = m_objRFConfig;
|
m_objRFRunning = m_objRFConfig;
|
||||||
m_objRunningPrivate = m_objConfigPrivate;
|
m_objRunningPrivate = m_objConfigPrivate;
|
||||||
|
|
|
@ -186,7 +186,9 @@ bool ATVDemodGUI::handleMessage(const Message& objMessage)
|
||||||
|
|
||||||
void ATVDemodGUI::viewChanged()
|
void ATVDemodGUI::viewChanged()
|
||||||
{
|
{
|
||||||
|
qDebug("ATVDemodGUI::viewChanged");
|
||||||
applySettings();
|
applySettings();
|
||||||
|
applyRFSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ATVDemodGUI::channelSampleRateChanged()
|
void ATVDemodGUI::channelSampleRateChanged()
|
||||||
|
|
|
@ -54,6 +54,9 @@
|
||||||
<layout class="QHBoxLayout" name="rfSettings1Layout">
|
<layout class="QHBoxLayout" name="rfSettings1Layout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="ButtonSwitch" name="decimatorEnable">
|
<widget class="ButtonSwitch" name="decimatorEnable">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Toggle decimator on/off</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
|
@ -70,6 +73,9 @@
|
||||||
<layout class="QHBoxLayout" name="deltaFrequencyLayout">
|
<layout class="QHBoxLayout" name="deltaFrequencyLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="deltaFrequencyMinus">
|
<widget class="QToolButton" name="deltaFrequencyMinus">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Channel center frequency shift direction</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
|
@ -104,6 +110,9 @@
|
||||||
<pointsize>12</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Channel center frequency shift</string>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -123,6 +132,9 @@
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Effective channel sample rate (kS/s)</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string> 00000k</string>
|
<string> 00000k</string>
|
||||||
</property>
|
</property>
|
||||||
|
@ -184,6 +196,9 @@
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Channel power</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>-100.0 dB</string>
|
<string>-100.0 dB</string>
|
||||||
</property>
|
</property>
|
||||||
|
@ -238,6 +253,9 @@
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSlider" name="rfOppBW">
|
<widget class="QSlider" name="rfOppBW">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Asymmetrical filter opposite band cutoff</string>
|
||||||
|
</property>
|
||||||
<property name="layoutDirection">
|
<property name="layoutDirection">
|
||||||
<enum>Qt::RightToLeft</enum>
|
<enum>Qt::RightToLeft</enum>
|
||||||
</property>
|
</property>
|
||||||
|
@ -257,6 +275,9 @@
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSlider" name="rfBW">
|
<widget class="QSlider" name="rfBW">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Asymmetrical filter in band cutoff / Decimator filter cutoff</string>
|
||||||
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
|
|
Loading…
Reference in New Issue