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:
parent
107583759f
commit
ef0baa35b7
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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())
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user