mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-29 20:10:22 -04:00 
			
		
		
		
	Samplerate options.
This commit is contained in:
		
							parent
							
								
									9c3b58d7a3
								
							
						
					
					
						commit
						812d0f4d15
					
				| @ -10,7 +10,7 @@ RTLSDRGui::RTLSDRGui(PluginAPI* pluginAPI, QWidget* parent) : | |||||||
| 	m_sampleSource(NULL) | 	m_sampleSource(NULL) | ||||||
| { | { | ||||||
| 	ui->setupUi(this); | 	ui->setupUi(this); | ||||||
| 	ui->centerFrequency->setValueRange(7, 20000U, 2200000U); | 	ui->centerFrequency->setValueRange(7, 28900U, 1700000U); | ||||||
| 	connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); | 	connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); | ||||||
| 	displaySettings(); | 	displaySettings(); | ||||||
| 
 | 
 | ||||||
| @ -95,7 +95,7 @@ bool RTLSDRGui::handleMessage(Message* message) | |||||||
| void RTLSDRGui::displaySettings() | void RTLSDRGui::displaySettings() | ||||||
| { | { | ||||||
| 	ui->centerFrequency->setValue(m_generalSettings.m_centerFrequency / 1000); | 	ui->centerFrequency->setValue(m_generalSettings.m_centerFrequency / 1000); | ||||||
| 	ui->decimation->setValue(m_settings.m_decimation); | 	ui->samplerate->setValue(m_settings.m_samplerate); | ||||||
| 
 | 
 | ||||||
| 	if(m_gains.size() > 0) { | 	if(m_gains.size() > 0) { | ||||||
| 		int dist = abs(m_settings.m_gain - m_gains[0]); | 		int dist = abs(m_settings.m_gain - m_gains[0]); | ||||||
| @ -139,10 +139,12 @@ void RTLSDRGui::on_gain_valueChanged(int value) | |||||||
| 	sendSettings(); | 	sendSettings(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLSDRGui::on_decimation_valueChanged(int value) | void RTLSDRGui::on_samplerate_valueChanged(int value) | ||||||
| { | { | ||||||
| 	ui->decimationText->setText(tr("1:%1").arg(1 << value)); | 	int Rates[] = {288, 1024, 1536, 0}; | ||||||
| 	m_settings.m_decimation = value; | 	int newrate = Rates[value]; | ||||||
|  | 	ui->samplerateText->setText(tr("%1k").arg(newrate)); | ||||||
|  | 	m_settings.m_samplerate = newrate * 1000; | ||||||
| 	sendSettings(); | 	sendSettings(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -159,19 +161,16 @@ void RTLSDRGui::on_checkBox_stateChanged(int state) { | |||||||
| 		ui->radioButton->setEnabled(true); | 		ui->radioButton->setEnabled(true); | ||||||
| 		ui->radioButton_2->setEnabled(true); | 		ui->radioButton_2->setEnabled(true); | ||||||
| 		ui->gain->setEnabled(false); | 		ui->gain->setEnabled(false); | ||||||
| 		//ui->decimation->setMaximum(6);
 | 		ui->centerFrequency->setValueRange(7, 1000U, 28700U); | ||||||
| 
 | 		ui->centerFrequency->setValue(27000); | ||||||
| 		ui->centerFrequency->setValueRange(5, 0U, 30000U); |  | ||||||
| 		ui->centerFrequency->setValue(0); |  | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 		((RTLSDRInput*)m_sampleSource)->set_ds_mode(0); | 		((RTLSDRInput*)m_sampleSource)->set_ds_mode(0); | ||||||
| 		ui->radioButton->setEnabled(false); | 		ui->radioButton->setEnabled(false); | ||||||
| 		ui->radioButton_2->setEnabled(false); | 		ui->radioButton_2->setEnabled(false); | ||||||
| 		ui->gain->setEnabled(true); | 		ui->gain->setEnabled(true); | ||||||
| 		//ui->decimation->setMaximum(4);
 | 		ui->centerFrequency->setValueRange(7, 28900U, 1700000U); | ||||||
| 
 | 		ui->centerFrequency->setValue(29000); | ||||||
| 		ui->centerFrequency->setValueRange(7, 20000U, 2200000U); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -45,7 +45,7 @@ private: | |||||||
| private slots: | private slots: | ||||||
| 	void on_centerFrequency_changed(quint64 value); | 	void on_centerFrequency_changed(quint64 value); | ||||||
| 	void on_gain_valueChanged(int value); | 	void on_gain_valueChanged(int value); | ||||||
| 	void on_decimation_valueChanged(int value); | 	void on_samplerate_valueChanged(int value); | ||||||
| 	void on_checkBox_stateChanged(int state); | 	void on_checkBox_stateChanged(int state); | ||||||
| 	void on_radioButton_toggled(bool checked); | 	void on_radioButton_toggled(bool checked); | ||||||
| 	void on_radioButton_2_toggled(bool checked); | 	void on_radioButton_2_toggled(bool checked); | ||||||
|  | |||||||
| @ -106,12 +106,12 @@ | |||||||
|       <number>3</number> |       <number>3</number> | ||||||
|      </property> |      </property> | ||||||
|      <item row="0" column="1"> |      <item row="0" column="1"> | ||||||
|       <widget class="QSlider" name="decimation"> |       <widget class="QSlider" name="samplerate"> | ||||||
|        <property name="toolTip"> |        <property name="toolTip"> | ||||||
|         <string>Signal decimation factor</string> |         <string>Device Samplerate</string> | ||||||
|        </property> |        </property> | ||||||
|        <property name="maximum"> |        <property name="maximum"> | ||||||
|         <number>4</number> |         <number>2</number> | ||||||
|        </property> |        </property> | ||||||
|        <property name="pageStep"> |        <property name="pageStep"> | ||||||
|         <number>1</number> |         <number>1</number> | ||||||
| @ -130,12 +130,12 @@ | |||||||
|         </sizepolicy> |         </sizepolicy> | ||||||
|        </property> |        </property> | ||||||
|        <property name="text"> |        <property name="text"> | ||||||
|         <string>Zoom Out</string> |         <string>Rate</string> | ||||||
|        </property> |        </property> | ||||||
|       </widget> |       </widget> | ||||||
|      </item> |      </item> | ||||||
|      <item row="0" column="2"> |      <item row="0" column="2"> | ||||||
|       <widget class="QLabel" name="decimationText"> |       <widget class="QLabel" name="samplerateText"> | ||||||
|        <property name="minimumSize"> |        <property name="minimumSize"> | ||||||
|         <size> |         <size> | ||||||
|          <width>40</width> |          <width>40</width> | ||||||
| @ -143,7 +143,7 @@ | |||||||
|         </size> |         </size> | ||||||
|        </property> |        </property> | ||||||
|        <property name="text"> |        <property name="text"> | ||||||
|         <string>1:1</string> |         <string>288k</string> | ||||||
|        </property> |        </property> | ||||||
|        <property name="alignment"> |        <property name="alignment"> | ||||||
|         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||||
| @ -226,7 +226,7 @@ | |||||||
|      <item> |      <item> | ||||||
|       <widget class="QCheckBox" name="checkBox"> |       <widget class="QCheckBox" name="checkBox"> | ||||||
|        <property name="text"> |        <property name="text"> | ||||||
|         <string>ds</string> |         <string>Direct Sampling: </string> | ||||||
|        </property> |        </property> | ||||||
|       </widget> |       </widget> | ||||||
|      </item> |      </item> | ||||||
| @ -236,7 +236,7 @@ | |||||||
|         <bool>false</bool> |         <bool>false</bool> | ||||||
|        </property> |        </property> | ||||||
|        <property name="text"> |        <property name="text"> | ||||||
|         <string>i</string> |         <string>I</string> | ||||||
|        </property> |        </property> | ||||||
|        <property name="checkable"> |        <property name="checkable"> | ||||||
|         <bool>true</bool> |         <bool>true</bool> | ||||||
| @ -252,7 +252,7 @@ | |||||||
|         <bool>false</bool> |         <bool>false</bool> | ||||||
|        </property> |        </property> | ||||||
|        <property name="text"> |        <property name="text"> | ||||||
|         <string>q</string> |         <string>Q</string> | ||||||
|        </property> |        </property> | ||||||
|       </widget> |       </widget> | ||||||
|      </item> |      </item> | ||||||
|  | |||||||
| @ -27,21 +27,21 @@ MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgReportRTLSDR, Message) | |||||||
| 
 | 
 | ||||||
| RTLSDRInput::Settings::Settings() : | RTLSDRInput::Settings::Settings() : | ||||||
| 	m_gain(0), | 	m_gain(0), | ||||||
| 	m_decimation(0) | 	m_samplerate(288000) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLSDRInput::Settings::resetToDefaults() | void RTLSDRInput::Settings::resetToDefaults() | ||||||
| { | { | ||||||
| 	m_gain = 0; | 	m_gain = 0; | ||||||
| 	m_decimation = 0; | 	m_samplerate = 288000; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| QByteArray RTLSDRInput::Settings::serialize() const | QByteArray RTLSDRInput::Settings::serialize() const | ||||||
| { | { | ||||||
| 	SimpleSerializer s(1); | 	SimpleSerializer s(1); | ||||||
| 	s.writeS32(1, m_gain); | 	s.writeS32(1, m_gain); | ||||||
| 	s.writeS32(2, m_decimation); | 	s.writeS32(2, m_samplerate); | ||||||
| 	return s.final(); | 	return s.final(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -56,7 +56,7 @@ bool RTLSDRInput::Settings::deserialize(const QByteArray& data) | |||||||
| 
 | 
 | ||||||
| 	if(d.getVersion() == 1) { | 	if(d.getVersion() == 1) { | ||||||
| 		d.readS32(1, &m_gain, 0); | 		d.readS32(1, &m_gain, 0); | ||||||
| 		d.readS32(2, &m_decimation, 0); | 		d.readS32(2, &m_samplerate, 0); | ||||||
| 		return true; | 		return true; | ||||||
| 	} else { | 	} else { | ||||||
| 		resetToDefaults(); | 		resetToDefaults(); | ||||||
| @ -91,7 +91,7 @@ bool RTLSDRInput::startInput(int device) | |||||||
| 	int res; | 	int res; | ||||||
| 	int numberOfGains; | 	int numberOfGains; | ||||||
| 
 | 
 | ||||||
| 	if(!m_sampleFifo.setSize(524288)) { | 	if(!m_sampleFifo.setSize(96000 * 4)) { | ||||||
| 		qCritical("Could not allocate SampleFifo"); | 		qCritical("Could not allocate SampleFifo"); | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| @ -111,8 +111,8 @@ bool RTLSDRInput::startInput(int device) | |||||||
| 	qWarning("RTLSDRInput open: %s %s, SN: %s", vendor, product, serial); | 	qWarning("RTLSDRInput open: %s %s, SN: %s", vendor, product, serial); | ||||||
| 	m_deviceDescription = QString("%1 (SN %2)").arg(product).arg(serial); | 	m_deviceDescription = QString("%1 (SN %2)").arg(product).arg(serial); | ||||||
| 
 | 
 | ||||||
| 	if((res = rtlsdr_set_sample_rate(m_dev, 1536000)) < 0) { | 	if((res = rtlsdr_set_sample_rate(m_dev, 288000)) < 0) { | ||||||
| 		qCritical("could not set sample rate: %s", strerror(errno)); | 		qCritical("could not set sample rate: 288k S/s"); | ||||||
| 		goto failed; | 		goto failed; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -182,7 +182,10 @@ const QString& RTLSDRInput::getDeviceDescription() const | |||||||
| 
 | 
 | ||||||
| int RTLSDRInput::getSampleRate() const | int RTLSDRInput::getSampleRate() const | ||||||
| { | { | ||||||
| 	return 96000 * (1 <<  m_settings.m_decimation); | 	int rate = m_settings.m_samplerate / 4; | ||||||
|  | 	if (rate < 200000) | ||||||
|  | 		return rate; | ||||||
|  | 	return (rate / 4); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| quint64 RTLSDRInput::getCenterFrequency() const | quint64 RTLSDRInput::getCenterFrequency() const | ||||||
| @ -207,14 +210,6 @@ bool RTLSDRInput::applySettings(const GeneralSettings& generalSettings, const Se | |||||||
| { | { | ||||||
| 	QMutexLocker mutexLocker(&m_mutex); | 	QMutexLocker mutexLocker(&m_mutex); | ||||||
| 
 | 
 | ||||||
| 	if((m_generalSettings.m_centerFrequency != generalSettings.m_centerFrequency) || force) { |  | ||||||
| 		m_generalSettings.m_centerFrequency = generalSettings.m_centerFrequency; |  | ||||||
| 		if(m_dev != NULL) { |  | ||||||
| 			if(rtlsdr_set_center_freq(m_dev, m_generalSettings.m_centerFrequency |  | ||||||
| 								+ 384000) != 0) |  | ||||||
| 				qDebug("osmosdr_set_center_freq(%lld) failed", m_generalSettings.m_centerFrequency); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if((m_settings.m_gain != settings.m_gain) || force) { | 	if((m_settings.m_gain != settings.m_gain) || force) { | ||||||
| 		m_settings.m_gain = settings.m_gain; | 		m_settings.m_gain = settings.m_gain; | ||||||
| 		if(m_dev != NULL) { | 		if(m_dev != NULL) { | ||||||
| @ -222,15 +217,30 @@ bool RTLSDRInput::applySettings(const GeneralSettings& generalSettings, const Se | |||||||
| 				qDebug("rtlsdr_set_tuner_gain() failed"); | 				qDebug("rtlsdr_set_tuner_gain() failed"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if((m_settings.m_decimation != settings.m_decimation) || force) { | 
 | ||||||
| 		m_settings.m_decimation = settings.m_decimation; | 	if((m_settings.m_samplerate != settings.m_samplerate) || force) { | ||||||
| 		if(m_dev != NULL) | 		if(m_dev != NULL) { | ||||||
| 			m_rtlSDRThread->setDecimation(m_settings.m_decimation); | 			if( rtlsdr_set_sample_rate(m_dev, settings.m_samplerate) < 0) | ||||||
|  | 				qCritical("could not set sample rate: %d", settings.m_samplerate); | ||||||
|  | 			else { | ||||||
|  | 				m_settings.m_samplerate = settings.m_samplerate; | ||||||
|  | 				m_rtlSDRThread->setSamplerate(settings.m_samplerate); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	m_generalSettings.m_centerFrequency = generalSettings.m_centerFrequency; | ||||||
|  | 	if(m_dev != NULL) { | ||||||
|  | 		if(rtlsdr_set_center_freq( m_dev, m_generalSettings.m_centerFrequency | ||||||
|  | 						+ (m_settings.m_samplerate / 4) ) != 0) | ||||||
|  | 			qDebug("osmosdr_set_center_freq(%lld) failed", m_generalSettings.m_centerFrequency); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | void RTLSDRInput::set_ds_mode(int on) | ||||||
| void RTLSDRInput::set_ds_mode(int on){ | { | ||||||
| 	rtlsdr_set_direct_sampling(m_dev, on); | 	rtlsdr_set_direct_sampling(m_dev, on); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ class RTLSDRInput : public SampleSource { | |||||||
| public: | public: | ||||||
| 	struct Settings { | 	struct Settings { | ||||||
| 		qint32 m_gain; | 		qint32 m_gain; | ||||||
| 		qint32 m_decimation; | 		qint32 m_samplerate; | ||||||
| 
 | 
 | ||||||
| 		Settings(); | 		Settings(); | ||||||
| 		void resetToDefaults(); | 		void resetToDefaults(); | ||||||
|  | |||||||
| @ -28,9 +28,8 @@ RTLSDRThread::RTLSDRThread(rtlsdr_dev_t* dev, SampleFifo* sampleFifo, QObject* p | |||||||
| 	m_dev(dev), | 	m_dev(dev), | ||||||
| 	m_convertBuffer(BLOCKSIZE), | 	m_convertBuffer(BLOCKSIZE), | ||||||
| 	m_sampleFifo(sampleFifo), | 	m_sampleFifo(sampleFifo), | ||||||
| 	m_decimation(2) | 	m_samplerate(288000) | ||||||
| { | { | ||||||
| 	m_localdecimation = 0; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RTLSDRThread::~RTLSDRThread() | RTLSDRThread::~RTLSDRThread() | ||||||
| @ -53,9 +52,9 @@ void RTLSDRThread::stopWork() | |||||||
| 	wait(); | 	wait(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLSDRThread::setDecimation(int decimation) | void RTLSDRThread::setSamplerate(int samplerate) | ||||||
| { | { | ||||||
| 	m_decimation = decimation; | 	m_samplerate = samplerate; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLSDRThread::run() | void RTLSDRThread::run() | ||||||
| @ -136,43 +135,39 @@ void RTLSDRThread::decimate16(SampleVector::iterator* it, const quint8* buf, qin | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Decimate everything by 16x, except 288kHz | ||||||
|  |   TODO : no offset tuning for direct sampling | ||||||
|  | */ | ||||||
|  | 
 | ||||||
| void RTLSDRThread::callback(const quint8* buf, qint32 len) | void RTLSDRThread::callback(const quint8* buf, qint32 len) | ||||||
| { | { | ||||||
| 	qint16 xreal, yimag, phase; | 	qint16 xreal, yimag, phase; | ||||||
| 	SampleVector::iterator it = m_convertBuffer.begin(); | 	SampleVector::iterator it = m_convertBuffer.begin(); | ||||||
| 	int decimationFactor[] = {1, 1, 1, 2, 4, 0}; |  | ||||||
| 
 | 
 | ||||||
| 	if (++m_localdecimation < decimationFactor[m_decimation]) return; | 	int mode = 0; | ||||||
| 	m_localdecimation = 0; | 	if (m_samplerate < 800000) | ||||||
|  | 		mode = 2; | ||||||
|  | 	// if (directsampling) mode++;
 | ||||||
| 
 | 
 | ||||||
| 	switch(4 - m_decimation) { | 	switch(mode) { | ||||||
| 		case 0: // 1:1 = no decimation
 | 		case 0: | ||||||
| 			// just rotation
 | 			decimate16(&it, buf, len); | ||||||
| 			phase = -(1<<2); |  | ||||||
| 			for (int pos = 0; pos < len + 3; pos += 4) { |  | ||||||
| 				phase *= -1; |  | ||||||
| 				xreal = phase * (2 * buf[pos+0] - 255); |  | ||||||
| 				yimag = phase * (2 * buf[pos+1] - 255); |  | ||||||
| 				*it++ = Sample(xreal, yimag); |  | ||||||
| 				xreal = phase * (255 - 2 * buf[pos+3]); |  | ||||||
| 				yimag = phase * (2 * buf[pos+2] - 255); |  | ||||||
| 				*it++ = Sample(xreal, yimag); |  | ||||||
| 			} |  | ||||||
| 			break; | 			break; | ||||||
| 		case 1: // 1:2
 | 		case 1: | ||||||
| 			decimate2(&it, buf, len); | 			// no_rotate16(&it, buf, len);
 | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case 2: // 1:4
 | 		case 2: | ||||||
| 			decimate4(&it, buf, len); | 			decimate4(&it, buf, len); | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case 3: // 1:8
 | 		case 3: | ||||||
| 			decimate8(&it, buf, len); | 			// norotate4(&it, buf, len);
 | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		default: | 		default: | ||||||
| 		case 4: // 1:16
 |  | ||||||
| 			decimate16(&it, buf, len); | 			decimate16(&it, buf, len); | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ public: | |||||||
| 	void startWork(); | 	void startWork(); | ||||||
| 	void stopWork(); | 	void stopWork(); | ||||||
| 
 | 
 | ||||||
| 	void setDecimation(int decimation); | 	void setSamplerate(int sanplerate); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	QMutex m_startWaitMutex; | 	QMutex m_startWaitMutex; | ||||||
| @ -46,8 +46,7 @@ private: | |||||||
| 	SampleVector m_convertBuffer; | 	SampleVector m_convertBuffer; | ||||||
| 	SampleFifo* m_sampleFifo; | 	SampleFifo* m_sampleFifo; | ||||||
| 
 | 
 | ||||||
| 	int m_decimation; | 	int m_samplerate; | ||||||
| 	int m_localdecimation; |  | ||||||
| 
 | 
 | ||||||
| 	void run(); | 	void run(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user