1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-31 06:12:26 -04:00

Audio CAT SISO: process mono signals as real signals plus fixes

This commit is contained in:
f4exb 2023-06-18 00:45:13 +02:00
parent 107583759f
commit ef0baa35b7
7 changed files with 65 additions and 47 deletions

View File

@ -31,8 +31,7 @@ AudioCATInputWorker::AudioCATInputWorker(SampleMIFifo* sampleFifo, AudioFifo *fi
m_log2Decim(0), m_log2Decim(0),
m_iqMapping(AudioCATSISOSettings::IQMapping::L), m_iqMapping(AudioCATSISOSettings::IQMapping::L),
m_convertBuffer(m_convBufSamples), m_convertBuffer(m_convBufSamples),
m_sampleFifo(sampleFifo), m_sampleFifo(sampleFifo)
m_quNCOPhase(0)
{ {
} }
@ -60,31 +59,10 @@ void AudioCATInputWorker::workIQ(unsigned int nbRead)
{ {
for (uint32_t i = 0; i < nbRead; i++) for (uint32_t i = 0; i < nbRead; i++)
{ {
qint16 r = m_buf[i*2 + (m_iqMapping == AudioCATSISOSettings::IQMapping::R ? 1 : 0)]; // real sample if (m_iqMapping == AudioCATSISOSettings::IQMapping::L) {
m_buf[i*2+1] = m_buf[i*2];
if (m_quNCOPhase == 0) // 0 } else {
{ m_buf[i*2] = m_buf[i*2+1];
m_buf[i*2] = r; // 1
m_buf[i*2+1] = 0; // 0
m_quNCOPhase = 1; // next phase
}
else if (m_quNCOPhase == 1) // -pi/2
{
m_buf[i*2] = 0; // 0
m_buf[i*2+1] = -r; // -1
m_quNCOPhase = 2; // next phase
}
else if (m_quNCOPhase == 2) // pi or -pi
{
m_buf[i*2] = -r; // -1
m_buf[i*2+1] = 0; // 0
m_quNCOPhase = 3; // next phase
}
else if (m_quNCOPhase == 3) // pi/2
{
m_buf[i*2] = 0; // 0
m_buf[i*2+1] = r; // 1
m_quNCOPhase = 0; // next phase
} }
} }
} }

View File

@ -52,7 +52,6 @@ private:
SampleVector m_convertBuffer; SampleVector m_convertBuffer;
SampleMIFifo* m_sampleFifo; SampleMIFifo* m_sampleFifo;
Decimators<qint32, qint16, SDR_RX_SAMP_SZ, 16, true> m_decimatorsIQ; Decimators<qint32, qint16, SDR_RX_SAMP_SZ, 16, true> m_decimatorsIQ;
int m_quNCOPhase; //!< Quarter sample rate pseudo NCO phase index (0, 90, 180, 270)
void workIQ(unsigned int nbRead); void workIQ(unsigned int nbRead);
void decimate(qint16 *buf, unsigned int nbRead); void decimate(qint16 *buf, unsigned int nbRead);

View File

@ -146,8 +146,11 @@ void AudioCATOutputWorker::callbackPart(SampleVector& data, unsigned int iBegin,
{ {
for (unsigned int i = iBegin; i < iEnd; i++) for (unsigned int i = iBegin; i < iEnd; i++)
{ {
m_audioBuffer[m_audioBufferFill].l = (m_iqMapping == AudioCATSISOSettings::LR ? data[i].m_real : data[i].m_imag) * m_volume;
m_audioBuffer[m_audioBufferFill].r = (m_iqMapping == AudioCATSISOSettings::LR ? data[i].m_imag : data[i].m_real) * m_volume; m_audioBuffer[m_audioBufferFill].l =
((m_iqMapping == AudioCATSISOSettings::LR || m_iqMapping == AudioCATSISOSettings::L) ? data[i].m_real : data[i].m_imag) * m_volume;
m_audioBuffer[m_audioBufferFill].r =
((m_iqMapping == AudioCATSISOSettings::LR || m_iqMapping == AudioCATSISOSettings::R) ? data[i].m_imag : data[i].m_real) * m_volume;
m_audioBufferFill++; m_audioBufferFill++;
if (m_audioBufferFill >= m_audioBuffer.size()) if (m_audioBufferFill >= m_audioBuffer.size())

View File

@ -523,6 +523,8 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
if (settingsKeys.contains("rxIQMapping") || force) if (settingsKeys.contains("rxIQMapping") || force)
{ {
forwardRxChange = true;
if (m_rxRunning) { if (m_rxRunning) {
m_inputWorker->setIQMapping(settings.m_rxIQMapping); m_inputWorker->setIQMapping(settings.m_rxIQMapping);
} }
@ -530,6 +532,8 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
if (settingsKeys.contains("txIQMapping") || force) if (settingsKeys.contains("txIQMapping") || force)
{ {
forwardTxChange = true;
if (m_txRunning) { if (m_txRunning) {
m_outputWorker->setIQMapping(settings.m_txIQMapping); m_outputWorker->setIQMapping(settings.m_txIQMapping);
} }
@ -579,7 +583,15 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
if (forwardRxChange) if (forwardRxChange)
{ {
DSPMIMOSignalNotification *notif = new DSPMIMOSignalNotification(m_rxSampleRate, settings.m_rxCenterFrequency, true, 0); bool realElseComplex = (m_settings.m_rxIQMapping == AudioCATSISOSettings::L)
|| (m_settings.m_rxIQMapping == AudioCATSISOSettings::R);
DSPMIMOSignalNotification *notif = new DSPMIMOSignalNotification(
m_rxSampleRate / (1<<m_settings.m_log2Decim),
settings.m_rxCenterFrequency,
true,
0,
realElseComplex
);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
} }
@ -589,7 +601,15 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
m_outputWorker->setSamplerate(m_txSampleRate); m_outputWorker->setSamplerate(m_txSampleRate);
} }
DSPMIMOSignalNotification *notif = new DSPMIMOSignalNotification(m_txSampleRate, settings.m_txCenterFrequency, false, 0); bool realElseComplex = (m_settings.m_txIQMapping == AudioCATSISOSettings::L)
|| (m_settings.m_txIQMapping == AudioCATSISOSettings::R);
DSPMIMOSignalNotification *notif = new DSPMIMOSignalNotification(
m_txSampleRate,
settings.m_txCenterFrequency,
false,
0,
realElseComplex
);
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
} }
} }

View File

@ -208,7 +208,7 @@ void AudioCATSISOGUI::on_streamSide_currentIndexChanged(int index)
m_deviceUISet->setSpectrumScalingFactor(SDR_TX_SCALEF); m_deviceUISet->setSpectrumScalingFactor(SDR_TX_SCALEF);
} }
updateSpectrum(); updateSpectrum(m_rxElseTx);
ui->spectrumSide->blockSignals(true); ui->spectrumSide->blockSignals(true);
ui->spectrumSide->setCurrentIndex(index); ui->spectrumSide->setCurrentIndex(index);
@ -235,13 +235,14 @@ void AudioCATSISOGUI::on_spectrumSide_currentIndexChanged(int index)
m_deviceUISet->setSpectrumScalingFactor(SDR_TX_SCALEF); m_deviceUISet->setSpectrumScalingFactor(SDR_TX_SCALEF);
} }
updateSpectrum(); updateSpectrum(index == 0);
if (ui->streamLock->isChecked()) if (ui->streamLock->isChecked())
{ {
ui->streamSide->blockSignals(true); ui->streamSide->blockSignals(true);
ui->streamSide->setCurrentIndex(index); ui->streamSide->setCurrentIndex(index);
ui->streamSide->blockSignals(false); ui->streamSide->blockSignals(false);
m_rxElseTx = index == 0;
displayFrequency(); displayFrequency();
displaySampleRate(); displaySampleRate();
} }
@ -435,7 +436,7 @@ void AudioCATSISOGUI::displaySettings()
displayFrequency(); displayFrequency();
displaySampleRate(); displaySampleRate();
displayDecim(); displayDecim();
updateSpectrum(); updateSpectrum(ui->spectrumSide->currentIndex() == 0);
displayFcRxTooltip(); displayFcRxTooltip();
displayCatDevice(); displayCatDevice();
displayCatType(); displayCatType();
@ -565,7 +566,7 @@ bool AudioCATSISOGUI::handleMessage(const Message& message)
if (sourceOrSink) if (sourceOrSink)
{ {
m_rxSampleRate = notif.getSampleRate(); m_rxSampleRate = notif.getSampleRate() * (1<<m_settings.m_log2Decim);
m_settings.m_rxCenterFrequency = frequency; m_settings.m_rxCenterFrequency = frequency;
} }
else else
@ -585,7 +586,7 @@ bool AudioCATSISOGUI::handleMessage(const Message& message)
displayFrequency(); displayFrequency();
displaySampleRate(); displaySampleRate();
updateSpectrum(); updateSpectrum(ui->spectrumSide->currentIndex() == 0);
return true; return true;
} }
@ -706,23 +707,30 @@ void AudioCATSISOGUI::updateCATStatus(AudioCATSISOSettings::MsgCATReportStatus::
m_lastCATStatus = status; m_lastCATStatus = status;
} }
void AudioCATSISOGUI::updateSpectrum() void AudioCATSISOGUI::updateSpectrum(bool rxElseTx)
{ {
qint64 centerFrequency; qint64 centerFrequency;
int sampleRate;
bool realElseComplex;
if (m_rxElseTx) { if (rxElseTx)
{
realElseComplex = (m_settings.m_rxIQMapping == AudioCATSISOSettings::L)
|| (m_settings.m_rxIQMapping == AudioCATSISOSettings::R);
sampleRate = m_rxSampleRate/(1<<m_settings.m_log2Decim);
centerFrequency = m_settings.m_rxCenterFrequency; centerFrequency = m_settings.m_rxCenterFrequency;
} else { }
else
{
realElseComplex = (m_settings.m_txIQMapping == AudioCATSISOSettings::L)
|| (m_settings.m_txIQMapping == AudioCATSISOSettings::R);
centerFrequency = m_settings.m_txCenterFrequency; centerFrequency = m_settings.m_txCenterFrequency;
sampleRate = m_txSampleRate;
} }
m_deviceUISet->getSpectrum()->setCenterFrequency(centerFrequency); m_deviceUISet->getSpectrum()->setCenterFrequency(centerFrequency);
m_deviceUISet->getSpectrum()->setSampleRate(sampleRate);
if (m_rxElseTx) { m_deviceUISet->getSpectrum()->setSsbSpectrum(realElseComplex);
m_deviceUISet->getSpectrum()->setSampleRate(m_rxSampleRate/(1<<m_settings.m_log2Decim));
} else {
m_deviceUISet->getSpectrum()->setSampleRate(m_txSampleRate);
}
} }
void AudioCATSISOGUI::openDeviceSettingsDialog(const QPoint& p) void AudioCATSISOGUI::openDeviceSettingsDialog(const QPoint& p)

View File

@ -76,7 +76,7 @@ private:
void displayCatDevice(); void displayCatDevice();
void displayCatType(); void displayCatType();
void updateTxEnable(); void updateTxEnable();
void updateSpectrum(); void updateSpectrum(bool rxElseTx);
void updateCATStatus(AudioCATSISOSettings::MsgCATReportStatus::Status status); void updateCATStatus(AudioCATSISOSettings::MsgCATReportStatus::Status status);
void sendSettings(); void sendSettings();
void setCenterFrequency(qint64 centerFrequency); void setCenterFrequency(qint64 centerFrequency);

View File

@ -790,6 +790,16 @@
<string>I=R, Q=L</string> <string>I=R, Q=L</string>
</property> </property>
</item> </item>
<item>
<property name="text">
<string>Mono L</string>
</property>
</item>
<item>
<property name="text">
<string>Mono R</string>
</property>
</item>
</widget> </widget>
</item> </item>
</layout> </layout>