mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-16 13:21:50 -05:00
SSB demod: binaural option
This commit is contained in:
parent
f8c36546b0
commit
b07d9c838d
@ -19,7 +19,7 @@ These plugins come from the parent code base and have been maintained so that th
|
|||||||
|
|
||||||
- Channels:
|
- Channels:
|
||||||
- lora
|
- lora
|
||||||
- tcpsrc
|
- tcpsrc (although it has evolved please use the udpsrc plugin instead)
|
||||||
|
|
||||||
<h2>Unsupported plugins</h2>
|
<h2>Unsupported plugins</h2>
|
||||||
|
|
||||||
@ -180,6 +180,9 @@ For Debian Jessie or Stretch:
|
|||||||
- Scope: trigger countdown
|
- Scope: trigger countdown
|
||||||
- Scope: multiple trigger chaining
|
- Scope: multiple trigger chaining
|
||||||
- Scope: new mode with linear IQ (two traces) on the primary display and polar IQ on the secondary display
|
- Scope: new mode with linear IQ (two traces) on the primary display and polar IQ on the secondary display
|
||||||
|
- New USB source plugin to connect to an external demodulator (ex: GNU radio) via USB ports
|
||||||
|
- Binaural option for SSB demod
|
||||||
|
- DSB option for SSB
|
||||||
|
|
||||||
<h2>Major redesign</h2>
|
<h2>Major redesign</h2>
|
||||||
|
|
||||||
|
@ -29,7 +29,8 @@ MESSAGE_CLASS_DEFINITION(SSBDemod::MsgConfigureSSBDemod, Message)
|
|||||||
SSBDemod::SSBDemod(SampleSink* sampleSink) :
|
SSBDemod::SSBDemod(SampleSink* sampleSink) :
|
||||||
m_sampleSink(sampleSink),
|
m_sampleSink(sampleSink),
|
||||||
m_audioFifo(4, 24000),
|
m_audioFifo(4, 24000),
|
||||||
m_settingsMutex(QMutex::Recursive)
|
m_settingsMutex(QMutex::Recursive),
|
||||||
|
m_audioBinaual(false)
|
||||||
{
|
{
|
||||||
setObjectName("SSBDemod");
|
setObjectName("SSBDemod");
|
||||||
|
|
||||||
@ -66,9 +67,14 @@ SSBDemod::~SSBDemod()
|
|||||||
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
DSPEngine::instance()->removeAudioSink(&m_audioFifo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSBDemod::configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCutoff, Real volume, int spanLog2)
|
void SSBDemod::configure(MessageQueue* messageQueue,
|
||||||
|
Real Bandwidth,
|
||||||
|
Real LowCutoff,
|
||||||
|
Real volume,
|
||||||
|
int spanLog2,
|
||||||
|
bool audioBinaural)
|
||||||
{
|
{
|
||||||
Message* cmd = MsgConfigureSSBDemod::create(Bandwidth, LowCutoff, volume, spanLog2);
|
Message* cmd = MsgConfigureSSBDemod::create(Bandwidth, LowCutoff, volume, spanLog2, audioBinaural);
|
||||||
messageQueue->push(cmd);
|
messageQueue->push(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,9 +108,6 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
|||||||
|
|
||||||
for (int i = 0; i < n_out; i++)
|
for (int i = 0; i < n_out; i++)
|
||||||
{
|
{
|
||||||
//Real demod = (sideband[i].real() + sideband[i].imag()) * 0.7 * 32768.0;
|
|
||||||
Real demod = (sideband[i].real() + sideband[i].imag()) * 0.7;
|
|
||||||
|
|
||||||
// Downsample by 2^(m_scaleLog2 - 1) for SSB band spectrum display
|
// Downsample by 2^(m_scaleLog2 - 1) for SSB band spectrum display
|
||||||
// smart decimation with bit gain using float arithmetic (23 bits significand)
|
// smart decimation with bit gain using float arithmetic (23 bits significand)
|
||||||
|
|
||||||
@ -122,9 +125,19 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
|||||||
sum.imag() = 0.0;
|
sum.imag() = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_audioBinaual)
|
||||||
|
{
|
||||||
|
m_audioBuffer[m_audioBufferFill].r = (qint16)(sideband[i].real() * m_volume * 100);
|
||||||
|
m_audioBuffer[m_audioBufferFill].l = (qint16)(sideband[i].imag() * m_volume * 100);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Real demod = (sideband[i].real() + sideband[i].imag()) * 0.7;
|
||||||
qint16 sample = (qint16)(demod * m_volume * 100);
|
qint16 sample = (qint16)(demod * m_volume * 100);
|
||||||
m_audioBuffer[m_audioBufferFill].l = sample;
|
m_audioBuffer[m_audioBufferFill].l = sample;
|
||||||
m_audioBuffer[m_audioBufferFill].r = sample;
|
m_audioBuffer[m_audioBufferFill].r = sample;
|
||||||
|
}
|
||||||
|
|
||||||
++m_audioBufferFill;
|
++m_audioBufferFill;
|
||||||
|
|
||||||
if (m_audioBufferFill >= m_audioBuffer.size())
|
if (m_audioBufferFill >= m_audioBuffer.size())
|
||||||
@ -220,13 +233,15 @@ bool SSBDemod::handleMessage(const Message& cmd)
|
|||||||
m_volume *= m_volume * 0.1;
|
m_volume *= m_volume * 0.1;
|
||||||
|
|
||||||
m_spanLog2 = cfg.getSpanLog2();
|
m_spanLog2 = cfg.getSpanLog2();
|
||||||
|
m_audioBinaual = cfg.getAudioBinaural();
|
||||||
|
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
|
|
||||||
qDebug() << " - MsgConfigureSSBDemod: m_Bandwidth: " << m_Bandwidth
|
qDebug() << "SBDemod::handleMessage: MsgConfigureSSBDemod: m_Bandwidth: " << m_Bandwidth
|
||||||
<< " m_LowCutoff: " << m_LowCutoff
|
<< " m_LowCutoff: " << m_LowCutoff
|
||||||
<< " m_volume: " << m_volume
|
<< " m_volume: " << m_volume
|
||||||
<< " m_spanLog2: " << m_spanLog2;
|
<< " m_spanLog2: " << m_spanLog2
|
||||||
|
<< " m_audioBinaual: " << m_audioBinaual;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,12 @@ public:
|
|||||||
SSBDemod(SampleSink* sampleSink);
|
SSBDemod(SampleSink* sampleSink);
|
||||||
virtual ~SSBDemod();
|
virtual ~SSBDemod();
|
||||||
|
|
||||||
void configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCutoff, Real volume, int spanLog2);
|
void configure(MessageQueue* messageQueue,
|
||||||
|
Real Bandwidth,
|
||||||
|
Real LowCutoff,
|
||||||
|
Real volume,
|
||||||
|
int spanLog2,
|
||||||
|
bool audioBinaural);
|
||||||
|
|
||||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
|
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
|
||||||
virtual void start();
|
virtual void start();
|
||||||
@ -52,10 +57,15 @@ private:
|
|||||||
Real getLoCutoff() const { return m_LowCutoff; }
|
Real getLoCutoff() const { return m_LowCutoff; }
|
||||||
Real getVolume() const { return m_volume; }
|
Real getVolume() const { return m_volume; }
|
||||||
int getSpanLog2() const { return m_spanLog2; }
|
int getSpanLog2() const { return m_spanLog2; }
|
||||||
|
bool getAudioBinaural() const { return m_audioBinaural; }
|
||||||
|
|
||||||
static MsgConfigureSSBDemod* create(Real Bandwidth, Real LowCutoff, Real volume, int spanLog2)
|
static MsgConfigureSSBDemod* create(Real Bandwidth,
|
||||||
|
Real LowCutoff,
|
||||||
|
Real volume,
|
||||||
|
int spanLog2,
|
||||||
|
bool audioBinaural)
|
||||||
{
|
{
|
||||||
return new MsgConfigureSSBDemod(Bandwidth, LowCutoff, volume, spanLog2);
|
return new MsgConfigureSSBDemod(Bandwidth, LowCutoff, volume, spanLog2, audioBinaural);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -63,13 +73,19 @@ private:
|
|||||||
Real m_LowCutoff;
|
Real m_LowCutoff;
|
||||||
Real m_volume;
|
Real m_volume;
|
||||||
int m_spanLog2;
|
int m_spanLog2;
|
||||||
|
bool m_audioBinaural;
|
||||||
|
|
||||||
MsgConfigureSSBDemod(Real Bandwidth, Real LowCutoff, Real volume, int spanLog2) :
|
MsgConfigureSSBDemod(Real Bandwidth,
|
||||||
|
Real LowCutoff,
|
||||||
|
Real volume,
|
||||||
|
int spanLog2,
|
||||||
|
bool audioBinaural) :
|
||||||
Message(),
|
Message(),
|
||||||
m_Bandwidth(Bandwidth),
|
m_Bandwidth(Bandwidth),
|
||||||
m_LowCutoff(LowCutoff),
|
m_LowCutoff(LowCutoff),
|
||||||
m_volume(volume),
|
m_volume(volume),
|
||||||
m_spanLog2(spanLog2)
|
m_spanLog2(spanLog2),
|
||||||
|
m_audioBinaural(audioBinaural)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -77,6 +93,7 @@ private:
|
|||||||
qint16 l;
|
qint16 l;
|
||||||
qint16 r;
|
qint16 r;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<AudioSample> AudioVector;
|
typedef std::vector<AudioSample> AudioVector;
|
||||||
|
|
||||||
Real m_Bandwidth;
|
Real m_Bandwidth;
|
||||||
@ -86,6 +103,7 @@ private:
|
|||||||
int m_undersampleCount;
|
int m_undersampleCount;
|
||||||
int m_sampleRate;
|
int m_sampleRate;
|
||||||
int m_frequency;
|
int m_frequency;
|
||||||
|
bool m_audioBinaual;
|
||||||
bool m_usb;
|
bool m_usb;
|
||||||
Real m_magsq;
|
Real m_magsq;
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@ QByteArray SSBDemodGUI::serialize() const
|
|||||||
s.writeU32(5, m_channelMarker.getColor().rgb());
|
s.writeU32(5, m_channelMarker.getColor().rgb());
|
||||||
s.writeS32(6, ui->lowCut->value());
|
s.writeS32(6, ui->lowCut->value());
|
||||||
s.writeS32(7, ui->spanLog2->value());
|
s.writeS32(7, ui->spanLog2->value());
|
||||||
|
s.writeBool(8, m_audioBinaural);
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +109,8 @@ bool SSBDemodGUI::deserialize(const QByteArray& data)
|
|||||||
d.readS32(7, &tmp, 20);
|
d.readS32(7, &tmp, 20);
|
||||||
ui->spanLog2->setValue(tmp);
|
ui->spanLog2->setValue(tmp);
|
||||||
setNewRate(tmp);
|
setNewRate(tmp);
|
||||||
|
d.readBool(8, &m_audioBinaural);
|
||||||
|
ui->audioBinaural->setChecked(m_audioBinaural);
|
||||||
|
|
||||||
blockApplySettings(false);
|
blockApplySettings(false);
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
@ -143,6 +146,12 @@ void SSBDemodGUI::on_deltaMinus_toggled(bool minus)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBDemodGUI::on_audioBinaural_toggled(bool binaural)
|
||||||
|
{
|
||||||
|
m_audioBinaural = binaural;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
void SSBDemodGUI::on_deltaFrequency_changed(quint64 value)
|
void SSBDemodGUI::on_deltaFrequency_changed(quint64 value)
|
||||||
{
|
{
|
||||||
if (ui->deltaMinus->isChecked())
|
if (ui->deltaMinus->isChecked())
|
||||||
@ -257,6 +266,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
|
|||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_rate(6000),
|
m_rate(6000),
|
||||||
m_spanLog2(3),
|
m_spanLog2(3),
|
||||||
|
m_audioBinaural(false),
|
||||||
m_channelPowerDbAvg(20,0)
|
m_channelPowerDbAvg(20,0)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
@ -374,7 +384,8 @@ void SSBDemodGUI::applySettings()
|
|||||||
ui->BW->value() * 100.0,
|
ui->BW->value() * 100.0,
|
||||||
ui->lowCut->value() * 100.0,
|
ui->lowCut->value() * 100.0,
|
||||||
ui->volume->value() / 10.0,
|
ui->volume->value() / 10.0,
|
||||||
m_spanLog2);
|
m_spanLog2,
|
||||||
|
m_audioBinaural);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ private slots:
|
|||||||
void viewChanged();
|
void viewChanged();
|
||||||
void on_deltaFrequency_changed(quint64 value);
|
void on_deltaFrequency_changed(quint64 value);
|
||||||
void on_deltaMinus_toggled(bool minus);
|
void on_deltaMinus_toggled(bool minus);
|
||||||
|
void on_audioBinaural_toggled(bool binaural);
|
||||||
void on_BW_valueChanged(int value);
|
void on_BW_valueChanged(int value);
|
||||||
void on_lowCut_valueChanged(int value);
|
void on_lowCut_valueChanged(int value);
|
||||||
void on_volume_valueChanged(int value);
|
void on_volume_valueChanged(int value);
|
||||||
@ -56,6 +57,7 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
int m_rate;
|
int m_rate;
|
||||||
int m_spanLog2;
|
int m_spanLog2;
|
||||||
|
bool m_audioBinaural;
|
||||||
MovingAverage<Real> m_channelPowerDbAvg;
|
MovingAverage<Real> m_channelPowerDbAvg;
|
||||||
|
|
||||||
ThreadedSampleSink* m_threadedChannelizer;
|
ThreadedSampleSink* m_threadedChannelizer;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>302</width>
|
<width>302</width>
|
||||||
<height>544</height>
|
<height>483</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@ -25,7 +25,7 @@
|
|||||||
<x>5</x>
|
<x>5</x>
|
||||||
<y>35</y>
|
<y>35</y>
|
||||||
<width>281</width>
|
<width>281</width>
|
||||||
<height>349</height>
|
<height>151</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -142,6 +142,24 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="audioBinaural">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Binaural audio</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../sdrbase/resources/res.qrc">
|
||||||
|
<normaloff>:/mono.png</normaloff>
|
||||||
|
<normalon>:/stereo.png</normalon>:/mono.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
@ -332,8 +350,8 @@
|
|||||||
<widget class="QWidget" name="spectrumContainer" native="true">
|
<widget class="QWidget" name="spectrumContainer" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>30</x>
|
<x>40</x>
|
||||||
<y>390</y>
|
<y>190</y>
|
||||||
<width>218</width>
|
<width>218</width>
|
||||||
<height>284</height>
|
<height>284</height>
|
||||||
</rect>
|
</rect>
|
||||||
@ -380,12 +398,6 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
|
||||||
<class>RollupWidget</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>gui/rollupwidget.h</header>
|
|
||||||
<container>1</container>
|
|
||||||
</customwidget>
|
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ValueDial</class>
|
<class>ValueDial</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
@ -404,6 +416,12 @@
|
|||||||
<header>gui/glspectrumgui.h</header>
|
<header>gui/glspectrumgui.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>RollupWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>gui/rollupwidget.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../../../sdrbase/resources/res.qrc"/>
|
<include location="../../../sdrbase/resources/res.qrc"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user