mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-11-29 23:28:39 -05:00
Adds feature to Swap I/Q
This commit is contained in:
parent
3efb036099
commit
8496287455
@ -130,8 +130,24 @@ AppFrame::AppFrame() :
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
wxMenu *menu = new wxMenu;
|
||||
|
||||
menu->Append(wxID_SET_FREQ_OFFSET, "Set Frequency Offset");
|
||||
menu->Append(wxID_SET_PPM, "Set Device PPM");
|
||||
menu->Append(wxID_OPEN, "&Open Session");
|
||||
menu->Append(wxID_SAVE, "&Save Session");
|
||||
menu->Append(wxID_SAVEAS, "Save Session &As..");
|
||||
menu->AppendSeparator();
|
||||
menu->Append(wxID_RESET, "&Reset Session");
|
||||
|
||||
#ifndef __APPLE__
|
||||
menu->AppendSeparator();
|
||||
menu->Append(wxID_CLOSE);
|
||||
#endif
|
||||
|
||||
menuBar->Append(menu, wxT("&File"));
|
||||
|
||||
menu = new wxMenu;
|
||||
|
||||
menu->Append(wxID_SET_FREQ_OFFSET, "Frequency Offset");
|
||||
menu->Append(wxID_SET_PPM, "Device PPM");
|
||||
iqSwapMenuItem = menu->AppendCheckItem(wxID_SET_SWAP_IQ, "Swap I/Q");
|
||||
|
||||
wxMenu *dsMenu = new wxMenu;
|
||||
|
||||
@ -141,20 +157,7 @@ AppFrame::AppFrame() :
|
||||
|
||||
menu->AppendSubMenu(dsMenu, "Direct Sampling");
|
||||
|
||||
wxMenu *sessionMenu = new wxMenu;
|
||||
sessionMenu->Append(wxID_OPEN, "&Open Session");
|
||||
sessionMenu->Append(wxID_SAVE, "&Save Session");
|
||||
sessionMenu->Append(wxID_SAVEAS, "Save Session &As..");
|
||||
sessionMenu->AppendSeparator();
|
||||
sessionMenu->Append(wxID_RESET, "&Reset Session");
|
||||
|
||||
menu->AppendSubMenu(sessionMenu, "Session");
|
||||
|
||||
menu->AppendSeparator();
|
||||
|
||||
menu->Append(wxID_CLOSE);
|
||||
|
||||
menuBar->Append(menu, wxT("&File"));
|
||||
menuBar->Append(menu, wxT("&Settings"));
|
||||
|
||||
menu = new wxMenu;
|
||||
|
||||
@ -183,7 +186,7 @@ AppFrame::AppFrame() :
|
||||
outputDeviceMenuItems[mdevices_i->first] = itm;
|
||||
}
|
||||
|
||||
menuBar->Append(menu, wxT("Active Demodulator &Output"));
|
||||
menuBar->Append(menu, wxT("Audio &Output"));
|
||||
|
||||
menu = new wxMenu;
|
||||
|
||||
@ -340,6 +343,10 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
|
||||
wxGetApp().setDirectSampling(1);
|
||||
} else if (event.GetId() == wxID_SET_DS_Q) {
|
||||
wxGetApp().setDirectSampling(2);
|
||||
} else if (event.GetId() == wxID_SET_SWAP_IQ) {
|
||||
bool swap_state = !wxGetApp().getSwapIQ();
|
||||
wxGetApp().setSwapIQ(swap_state);
|
||||
iqSwapMenuItem->Check(swap_state);
|
||||
} else if (event.GetId() == wxID_SET_PPM) {
|
||||
long ofs = wxGetNumberFromUser("Frequency correction for device in PPM.\ni.e. -51 for -51 PPM\n\nNote: you can adjust PPM interactively\nby holding ALT over the frequency tuning bar.\n", "Parts per million (PPM)",
|
||||
"Frequency Correction", wxGetApp().getPPM(), -1000, 1000, this);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#define wxID_SET_DS_OFF 2004
|
||||
#define wxID_SET_DS_I 2005
|
||||
#define wxID_SET_DS_Q 2006
|
||||
#define wxID_SET_SWAP_IQ 2007
|
||||
|
||||
#define wxID_THEME_DEFAULT 2100
|
||||
#define wxID_THEME_SHARP 2101
|
||||
@ -78,6 +79,7 @@ private:
|
||||
std::map<int, wxMenuItem *> outputDeviceMenuItems;
|
||||
std::map<int, wxMenuItem *> sampleRateMenuItems;
|
||||
std::map<int, wxMenuItem *> audioSampleRateMenuItems;
|
||||
wxMenuItem *iqSwapMenuItem;
|
||||
|
||||
std::string currentSessionFile;
|
||||
|
||||
|
@ -182,6 +182,14 @@ int CubicSDR::getDirectSampling() {
|
||||
return directSamplingMode;
|
||||
}
|
||||
|
||||
void CubicSDR::setSwapIQ(bool swapIQ) {
|
||||
sdrPostThread->setSwapIQ(swapIQ);
|
||||
}
|
||||
|
||||
bool CubicSDR::getSwapIQ() {
|
||||
return sdrPostThread->getSwapIQ();
|
||||
}
|
||||
|
||||
long long CubicSDR::getFrequency() {
|
||||
return frequency;
|
||||
}
|
||||
|
@ -40,6 +40,9 @@ public:
|
||||
void setDirectSampling(int mode);
|
||||
int getDirectSampling();
|
||||
|
||||
void setSwapIQ(bool swapIQ);
|
||||
bool getSwapIQ();
|
||||
|
||||
void setSampleRate(long long rate_in);
|
||||
long long getSampleRate();
|
||||
|
||||
|
@ -6,19 +6,21 @@
|
||||
#include <deque>
|
||||
|
||||
SDRPostThread::SDRPostThread() :
|
||||
iqDataOutQueue(NULL), iqDataInQueue(NULL), iqVisualQueue(NULL), terminated(false), dcFilter(NULL), num_vis_samples(16384*2) {
|
||||
iqDataInQueue(NULL), iqDataOutQueue(NULL), iqVisualQueue(NULL), terminated(false), dcFilter(NULL), num_vis_samples(16384*2), swapIQ(false) {
|
||||
|
||||
// create a lookup table
|
||||
for (unsigned int i = 0; i <= 0xffff; i++) {
|
||||
liquid_float_complex tmp;
|
||||
liquid_float_complex tmp,tmp_swap;
|
||||
# if (__BYTE_ORDER == __LITTLE_ENDIAN)
|
||||
tmp.real = (float(i & 0xff) - 127.4f) * (1.0f/128.0f);
|
||||
tmp.imag = (float(i >> 8) - 127.4f) * (1.0f/128.0f);
|
||||
tmp_swap.imag = tmp.real = (float(i & 0xff) - 127.4f) * (1.0f/128.0f);
|
||||
tmp_swap.real = tmp.imag = (float(i >> 8) - 127.4f) * (1.0f/128.0f);
|
||||
_lut.push_back(tmp);
|
||||
_lut_swap.push_back(tmp_swap);
|
||||
#else // BIG_ENDIAN
|
||||
tmp.real = (float(i >> 8) - 127.4f) * (1.0f/128.0f);
|
||||
tmp.imag = (float(i & 0xff) - 127.4f) * (1.0f/128.0f);
|
||||
tmp_swap.imag = tmp.real = (float(i >> 8) - 127.4f) * (1.0f/128.0f);
|
||||
tmp_swap.real = tmp.imag = (float(i & 0xff) - 127.4f) * (1.0f/128.0f);
|
||||
_lut.push_back(tmp);
|
||||
_lut_swap.push_back(tmp_swap);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -64,6 +66,14 @@ int SDRPostThread::getNumVisSamples() {
|
||||
return num_vis_samples;
|
||||
}
|
||||
|
||||
void SDRPostThread::setSwapIQ(bool swapIQ) {
|
||||
this->swapIQ.store(swapIQ);
|
||||
}
|
||||
|
||||
bool SDRPostThread::getSwapIQ() {
|
||||
return this->swapIQ.load();
|
||||
}
|
||||
|
||||
void SDRPostThread::threadMain() {
|
||||
int n_read;
|
||||
double seconds = 0.0;
|
||||
@ -103,8 +113,14 @@ void SDRPostThread::threadMain() {
|
||||
dataOut.resize(dataSize);
|
||||
}
|
||||
|
||||
for (int i = 0, iMax = dataSize; i < iMax; i++) {
|
||||
fpData[i] = _lut[*((uint16_t*)&data_in->data[2*i])];
|
||||
if (swapIQ) {
|
||||
for (int i = 0; i < dataSize; i++) {
|
||||
fpData[i] = _lut_swap[*((uint16_t*)&data_in->data[2*i])];
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < dataSize; i++) {
|
||||
fpData[i] = _lut[*((uint16_t*)&data_in->data[2*i])];
|
||||
}
|
||||
}
|
||||
|
||||
iirfilt_crcf_execute_block(dcFilter, &fpData[0], dataSize, &dataOut[0]);
|
||||
|
@ -18,6 +18,9 @@ public:
|
||||
void setNumVisSamples(int num_vis_samples_in);
|
||||
int getNumVisSamples();
|
||||
|
||||
void setSwapIQ(bool swapIQ);
|
||||
bool getSwapIQ();
|
||||
|
||||
void threadMain();
|
||||
void terminate();
|
||||
|
||||
@ -31,7 +34,9 @@ protected:
|
||||
std::atomic<bool> terminated;
|
||||
iirfilt_crcf dcFilter;
|
||||
int num_vis_samples;
|
||||
std::atomic<bool> swapIQ;
|
||||
|
||||
private:
|
||||
std::vector<liquid_float_complex> _lut;
|
||||
std::vector<liquid_float_complex> _lut_swap;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user