Experimental raw I/Q output mode

This commit is contained in:
Charles J. Cliffe 2015-06-27 23:23:43 -04:00
parent 20f537b37b
commit 26ca557349
4 changed files with 52 additions and 9 deletions

View File

@ -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);

View File

@ -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 {

View File

@ -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() {

View File

@ -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) {