mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-09-28 16:16:58 -04:00
Experimental raw I/Q output mode
This commit is contained in:
parent
20f537b37b
commit
26ca557349
@ -57,6 +57,7 @@ AppFrame::AppFrame() :
|
|||||||
demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB");
|
demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB");
|
||||||
demodModeSelector->addChoice(DEMOD_TYPE_USB, "USB");
|
demodModeSelector->addChoice(DEMOD_TYPE_USB, "USB");
|
||||||
demodModeSelector->addChoice(DEMOD_TYPE_DSB, "DSB");
|
demodModeSelector->addChoice(DEMOD_TYPE_DSB, "DSB");
|
||||||
|
demodModeSelector->addChoice(DEMOD_TYPE_RAW, "I/Q");
|
||||||
demodModeSelector->setSelection(DEMOD_TYPE_FM);
|
demodModeSelector->setSelection(DEMOD_TYPE_FM);
|
||||||
demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band.");
|
demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band.");
|
||||||
demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0);
|
demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0);
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#define DEMOD_TYPE_LSB 3
|
#define DEMOD_TYPE_LSB 3
|
||||||
#define DEMOD_TYPE_USB 4
|
#define DEMOD_TYPE_USB 4
|
||||||
#define DEMOD_TYPE_DSB 5
|
#define DEMOD_TYPE_DSB 5
|
||||||
|
#define DEMOD_TYPE_RAW 6
|
||||||
|
|
||||||
|
|
||||||
class DemodulatorThread;
|
class DemodulatorThread;
|
||||||
class DemodulatorThreadCommand {
|
class DemodulatorThreadCommand {
|
||||||
|
@ -220,13 +220,12 @@ void DemodulatorInstance::setOutputDevice(int device_id) {
|
|||||||
if (!active) {
|
if (!active) {
|
||||||
audioThread->setInitOutputDevice(device_id);
|
audioThread->setInitOutputDevice(device_id);
|
||||||
} else if (audioThread) {
|
} else if (audioThread) {
|
||||||
setAudioSampleRate(AudioThread::deviceSampleRate[device_id]);
|
|
||||||
|
|
||||||
AudioThreadCommand command;
|
AudioThreadCommand command;
|
||||||
command.cmd = AudioThreadCommand::AUDIO_THREAD_CMD_SET_DEVICE;
|
command.cmd = AudioThreadCommand::AUDIO_THREAD_CMD_SET_DEVICE;
|
||||||
command.int_value = device_id;
|
command.int_value = device_id;
|
||||||
audioThread->getCommandQueue()->push(command);
|
audioThread->getCommandQueue()->push(command);
|
||||||
}
|
}
|
||||||
|
setAudioSampleRate(AudioThread::deviceSampleRate[device_id]);
|
||||||
currentOutputDevice = device_id;
|
currentOutputDevice = device_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,6 +257,13 @@ void DemodulatorInstance::setDemodulatorType(int demod_type_in) {
|
|||||||
checkBandwidth();
|
checkBandwidth();
|
||||||
threadQueueControl->push(command);
|
threadQueueControl->push(command);
|
||||||
}
|
}
|
||||||
|
if (currentDemodType == DEMOD_TYPE_RAW) {
|
||||||
|
if (currentAudioSampleRate) {
|
||||||
|
setBandwidth(currentAudioSampleRate);
|
||||||
|
} else {
|
||||||
|
setBandwidth(AudioThread::deviceSampleRate[getOutputDevice()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int DemodulatorInstance::getDemodulatorType() {
|
int DemodulatorInstance::getDemodulatorType() {
|
||||||
@ -265,6 +271,13 @@ int DemodulatorInstance::getDemodulatorType() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DemodulatorInstance::setBandwidth(int bw) {
|
void DemodulatorInstance::setBandwidth(int bw) {
|
||||||
|
if (currentDemodType == DEMOD_TYPE_RAW) {
|
||||||
|
if (currentAudioSampleRate) {
|
||||||
|
bw = currentAudioSampleRate;
|
||||||
|
} else {
|
||||||
|
bw = AudioThread::deviceSampleRate[getOutputDevice()];
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!active) {
|
if (!active) {
|
||||||
currentBandwidth = bw;
|
currentBandwidth = bw;
|
||||||
checkBandwidth();
|
checkBandwidth();
|
||||||
@ -321,6 +334,9 @@ void DemodulatorInstance::setAudioSampleRate(int sampleRate) {
|
|||||||
command.llong_value = sampleRate;
|
command.llong_value = sampleRate;
|
||||||
threadQueueCommand->push(command);
|
threadQueueCommand->push(command);
|
||||||
}
|
}
|
||||||
|
if (currentDemodType == DEMOD_TYPE_RAW) {
|
||||||
|
setBandwidth(currentAudioSampleRate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int DemodulatorInstance::getAudioSampleRate() {
|
int DemodulatorInstance::getAudioSampleRate() {
|
||||||
|
@ -173,6 +173,8 @@ void DemodulatorThread::threadMain() {
|
|||||||
|
|
||||||
if (demodulatorType == DEMOD_TYPE_FM) {
|
if (demodulatorType == DEMOD_TYPE_FM) {
|
||||||
freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]);
|
freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]);
|
||||||
|
} else if (demodulatorType == DEMOD_TYPE_RAW) {
|
||||||
|
// do nothing here..
|
||||||
} else {
|
} else {
|
||||||
float p;
|
float p;
|
||||||
switch (demodulatorType.load()) {
|
switch (demodulatorType.load()) {
|
||||||
@ -222,6 +224,10 @@ void DemodulatorThread::threadMain() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int numAudioWritten;
|
unsigned int numAudioWritten;
|
||||||
|
|
||||||
|
if (demodulatorType == DEMOD_TYPE_RAW) {
|
||||||
|
numAudioWritten = bufSize;
|
||||||
|
} else {
|
||||||
msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten);
|
msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten);
|
||||||
|
|
||||||
if (stereo && inp->sampleRate >= 100000) {
|
if (stereo && inp->sampleRate >= 100000) {
|
||||||
@ -276,6 +282,7 @@ void DemodulatorThread::threadMain() {
|
|||||||
|
|
||||||
msresamp_rrrf_execute(stereoResampler, &demodStereoData[0], bufSize, &resampledStereoData[0], &numAudioWritten);
|
msresamp_rrrf_execute(stereoResampler, &demodStereoData[0], bufSize, &resampledStereoData[0], &numAudioWritten);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (currentSignalLevel > signalLevel) {
|
if (currentSignalLevel > signalLevel) {
|
||||||
signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.5;
|
signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.5;
|
||||||
@ -303,7 +310,17 @@ void DemodulatorThread::threadMain() {
|
|||||||
ati->sampleRate = audioSampleRate;
|
ati->sampleRate = audioSampleRate;
|
||||||
ati->setRefCount(1);
|
ati->setRefCount(1);
|
||||||
|
|
||||||
if (stereo && inp->sampleRate >= 100000) {
|
if (demodulatorType == DEMOD_TYPE_RAW) {
|
||||||
|
ati->channels = 2;
|
||||||
|
if (ati->data.capacity() < (numAudioWritten * 2)) {
|
||||||
|
ati->data.reserve(numAudioWritten * 2);
|
||||||
|
}
|
||||||
|
ati->data.resize(numAudioWritten * 2);
|
||||||
|
for (int i = 0; i < numAudioWritten; i++) {
|
||||||
|
ati->data[i * 2] = agcData[i].real;
|
||||||
|
ati->data[i * 2 + 1] = agcData[i].imag;
|
||||||
|
}
|
||||||
|
} else if (stereo && inp->sampleRate >= 100000) {
|
||||||
ati->channels = 2;
|
ati->channels = 2;
|
||||||
if (ati->data.capacity() < (numAudioWritten * 2)) {
|
if (ati->data.capacity() < (numAudioWritten * 2)) {
|
||||||
ati->data.reserve(numAudioWritten * 2);
|
ati->data.reserve(numAudioWritten * 2);
|
||||||
@ -344,19 +361,26 @@ void DemodulatorThread::threadMain() {
|
|||||||
ati_vis->busy_update.lock();
|
ati_vis->busy_update.lock();
|
||||||
|
|
||||||
int num_vis = DEMOD_VIS_SIZE;
|
int num_vis = DEMOD_VIS_SIZE;
|
||||||
if (stereo && inp->sampleRate >= 100000) {
|
if (demodulatorType == DEMOD_TYPE_RAW || (stereo && inp->sampleRate >= 100000)) {
|
||||||
ati_vis->channels = 2;
|
ati_vis->channels = 2;
|
||||||
int stereoSize = ati->data.size();
|
int stereoSize = ati->data.size();
|
||||||
if (stereoSize > DEMOD_VIS_SIZE) {
|
if (stereoSize > DEMOD_VIS_SIZE * 2) {
|
||||||
stereoSize = DEMOD_VIS_SIZE;
|
stereoSize = DEMOD_VIS_SIZE * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ati_vis->data.resize(stereoSize);
|
ati_vis->data.resize(stereoSize);
|
||||||
|
|
||||||
|
if (demodulatorType == DEMOD_TYPE_RAW) {
|
||||||
|
for (int i = 0; i < stereoSize / 2; i++) {
|
||||||
|
ati_vis->data[i] = ati->data[i * 2] * 0.5;
|
||||||
|
ati_vis->data[i + stereoSize / 2] = ati->data[i * 2 + 1] * 0.5;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
for (int i = 0; i < stereoSize / 2; i++) {
|
for (int i = 0; i < stereoSize / 2; i++) {
|
||||||
ati_vis->data[i] = ati->data[i * 2];
|
ati_vis->data[i] = ati->data[i * 2];
|
||||||
ati_vis->data[i + stereoSize / 2] = ati->data[i * 2 + 1];
|
ati_vis->data[i + stereoSize / 2] = ati->data[i * 2 + 1];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ati_vis->channels = 1;
|
ati_vis->channels = 1;
|
||||||
if (numAudioWritten > bufSize) {
|
if (numAudioWritten > bufSize) {
|
||||||
|
Loading…
Reference in New Issue
Block a user