Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IQ amplitude phase correction #3

Open
wants to merge 64 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
284fd4d
driver: tejeez's no-mod direct sampling
keenerd Jan 25, 2014
7d70b00
utils: tejeez's no-mod direct sampling
keenerd Jan 25, 2014
389de6d
utils: rebase ppm in eeprom prototype
keenerd Jan 25, 2014
e8d1d26
modprobe rules
keenerd Jan 29, 2014
3dfa4ad
rtl_fm: esbensen's discriminant
keenerd Jan 30, 2014
3f2632d
r82xx: set_dithering()
keenerd Aug 2, 2014
a7caaac
r82xx: tejeez's if/bw filters
keenerd Aug 2, 2014
4198f7d
r82xx: register caching
keenerd Aug 3, 2014
a0b6131
r82xx: register batching
keenerd Aug 3, 2014
d59b178
lib: cache i2c repeater
keenerd Aug 3, 2014
29d2c84
r82xx: pll tweaks beyond my ken
keenerd Aug 3, 2014
0bba67a
r82xx: error on pll failure
keenerd Aug 4, 2014
c5d7ebe
rtl_test: r820t tuning range
keenerd Aug 4, 2014
fba7708
r82xx: build warning
keenerd Aug 5, 2014
588b673
rtl_fm: half working AGC
keenerd Aug 6, 2014
6d5cd16
rtl_fm: wav header
keenerd Aug 7, 2014
42d8f12
rtl_fm: mostly working AGC
keenerd Aug 11, 2014
9ed9ffa
lib: retry i2c on failure
keenerd Aug 11, 2014
3cb8bd6
rtl_fm: proportional squelch
keenerd Aug 12, 2014
08889ee
rtl_fm, power: stay open through broken pipes
keenerd Aug 14, 2014
00a74f0
rtl_sdr: units on -n
keenerd Aug 15, 2014
e98ab40
rtl_fm: half finished stream padding
keenerd Aug 16, 2014
3223086
rtl_power: fixed size bins, refactoring
keenerd Aug 20, 2014
40bf3cb
rtl_power: adjustable sample rate
keenerd Aug 22, 2014
6d9bb99
rtl_power: multiple frequency ranges
keenerd Aug 23, 2014
225f401
rtl_power: linear output
keenerd Aug 23, 2014
f232816
r82xx: improved tuner precision
mutability Aug 23, 2014
f9ce8bd
rtl_power: bugfix for odd bin numbers
keenerd Aug 25, 2014
ecae3d5
rtl_power: fix bugs with bin counting
keenerd Aug 26, 2014
ebb5f2a
rtl_fm: bugfix from M. Curtis
keenerd Aug 26, 2014
e23b92c
rtl_fm: in-place demodulators
keenerd Aug 26, 2014
34ab4ac
rtl_fm: no-copy architecture
keenerd Aug 26, 2014
6d57803
r82xx: remove incorrect error from reg caching
mutability Aug 26, 2014
f3b45e1
rtl_power: doc corrections
keenerd Aug 27, 2014
06af0f9
r82xx: direct sampling fixes from tejeez
keenerd Aug 27, 2014
15bb16b
rtl_fm: fix lockup on squelch
keenerd Aug 28, 2014
5e13808
rtl_power: more bug fixes
keenerd Aug 28, 2014
a710e4e
rtl_test: generic tuner range test
mutability Aug 28, 2014
1cf9215
r82xx: enforce PLL register limits.
mutability Aug 29, 2014
c918fda
rtl_fm: link librt
keenerd Aug 31, 2014
92a684c
rtl_test: refactor tuner_benchmark
keenerd Aug 31, 2014
05bee34
rtl_fm: handle no availible buffers
keenerd Aug 31, 2014
6bcea88
rtl_fm: arbitrary translation prototype
keenerd Sep 1, 2014
90706d4
rtl_fm: remove unused resamplers
keenerd Sep 1, 2014
df2a9c0
rtl_fm: software agc
keenerd Sep 1, 2014
88244c0
rtl_fm: sw-agc quantization correction
keenerd Sep 1, 2014
581b6b6
rtl_fm: pad out single channel underruns
keenerd Sep 2, 2014
c813134
rtl_fm: stream padding
keenerd Sep 3, 2014
53d212d
rtl_fm: half finished dual-channel mode
keenerd Sep 4, 2014
0037e5f
rtl_fm: arbitrary translation
keenerd Sep 8, 2014
8ad17c2
rtl_fm: three-quarters of dual channel
keenerd Sep 8, 2014
1b1c03d
rtl_power: fix NaN on 32 bit platforms (T. Kaminski)
keenerd Oct 17, 2014
012ca95
rtl_test: Support PPM error measurement on Windows.
kasper93 Nov 1, 2014
61e2b66
rtl_fm: Support output padding on Windows.
kasper93 Nov 1, 2014
d426cfd
convenience: No junk when device info isn't properly extracted.
kasper93 Nov 1, 2014
a2d23c5
rtl_fm: Avoid possible null pointer dereference.
kasper93 Nov 1, 2014
6aa5f17
Variable cleanup and corrections.
kasper93 Nov 1, 2014
5ba8898
build: Fix compilation on VS2013, Cygwin and MinGW.
kasper93 Oct 30, 2014
bc872cb
build: libusb pkgconfig for NixOS
keenerd Nov 13, 2014
f1e8e4d
rtl_power: improved hopping math
keenerd Dec 1, 2014
3c01571
rtl_power: fix peak hold
keenerd Dec 1, 2014
c6e6be5
rtl_power: epoch time
keenerd Dec 1, 2014
86f9503
rtl_fm: add swagc-aggressive
Mar 29, 2015
0d825fe
rtl_power: trough hold
keenerd Jan 1, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
r82xx: tejeez's if/bw filters
keenerd committed Aug 3, 2014

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit a7caaac7a41ca7f8765fa062170ef51a7d09d7c6
4 changes: 4 additions & 0 deletions include/rtl-sdr.h
Original file line number Diff line number Diff line change
@@ -144,6 +144,10 @@ RTLSDR_API int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data,

RTLSDR_API int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq);

RTLSDR_API int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq);

RTLSDR_API int rtlsdr_set_if_bandwidth(rtlsdr_dev_t *dev, int bw);

/*!
* Get actual frequency the device is tuned to.
*
5 changes: 4 additions & 1 deletion include/tuner_r82xx.h
Original file line number Diff line number Diff line change
@@ -32,7 +32,8 @@
#define R82XX_CHECK_ADDR 0x00
#define R82XX_CHECK_VAL 0x69

#define R82XX_IF_FREQ 3570000
#define R82XX_DEFAULT_IF_FREQ 6000000
#define R82XX_DEFAULT_IF_BW 2000000

#define REG_SHADOW_START 5
#define NUM_REGS 30
@@ -118,5 +119,7 @@ int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq);
int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain);
int r82xx_set_nomod(struct r82xx_priv *priv);
int r82xx_set_dither(struct r82xx_priv *priv, int dither);
int r82xx_set_bw(struct r82xx_priv *priv, uint32_t bw);
int r82xx_set_if_freq(struct r82xx_priv *priv, uint32_t freq);

#endif
49 changes: 38 additions & 11 deletions src/librtlsdr.c
Original file line number Diff line number Diff line change
@@ -64,6 +64,7 @@ typedef struct rtlsdr_tuner_iface {
int (*set_gain)(void *, int gain /* tenth dB */);
int (*set_if_gain)(void *, int stage, int gain /* tenth dB */);
int (*set_gain_mode)(void *, int manual);
int (*set_if_freq)(void *, uint32_t freq /* Hz */);
} rtlsdr_tuner_iface_t;

enum rtlsdr_async_status {
@@ -123,6 +124,7 @@ struct rtlsdr_dev {
int dev_lost;
int driver_active;
unsigned int xfer_errors;
int tuner_initialized;
};

void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
@@ -238,7 +240,17 @@ int r820t_set_freq(void *dev, uint32_t freq) {
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
return r82xx_set_freq(&devt->r82xx_p, freq);
}
int r820t_set_bw(void *dev, int bw) { return 0; }

int r820t_set_bw(void *dev, int bw) {
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
return r82xx_set_bw(&devt->r82xx_p, bw);
}

int r820t_set_if_freq(void *dev, uint32_t freq) {
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
return r82xx_set_if_freq(&devt->r82xx_p, freq);
}

int r820t_set_gain(void *dev, int gain) {
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
return r82xx_set_gain(&devt->r82xx_p, 1, gain);
@@ -251,37 +263,37 @@ int r820t_set_gain_mode(void *dev, int manual) {
/* definition order must match enum rtlsdr_tuner */
static rtlsdr_tuner_iface_t tuners[] = {
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL /* dummy for unknown tuners */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL /* dummy for unknown tuners */
},
{
e4000_init, e4000_exit,
e4000_set_freq, e4000_set_bw, e4000_set_gain, e4000_set_if_gain,
e4000_set_gain_mode
e4000_set_gain_mode, NULL
},
{
_fc0012_init, fc0012_exit,
fc0012_set_freq, fc0012_set_bw, _fc0012_set_gain, NULL,
fc0012_set_gain_mode
fc0012_set_gain_mode, NULL
},
{
_fc0013_init, fc0013_exit,
fc0013_set_freq, fc0013_set_bw, _fc0013_set_gain, NULL,
fc0013_set_gain_mode
fc0013_set_gain_mode, NULL
},
{
fc2580_init, fc2580_exit,
_fc2580_set_freq, fc2580_set_bw, fc2580_set_gain, NULL,
fc2580_set_gain_mode
fc2580_set_gain_mode, NULL
},
{
r820t_init, r820t_exit,
r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL,
r820t_set_gain_mode
r820t_set_gain_mode, r820t_set_if_freq
},
{
r820t_init, r820t_exit,
r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL,
r820t_set_gain_mode
r820t_set_gain_mode, r820t_set_if_freq
},
};

@@ -662,6 +674,7 @@ int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev)
rtlsdr_set_i2c_repeater(dev, 1);
r = dev->tuner->exit(dev); /* deinitialize tuner */
rtlsdr_set_i2c_repeater(dev, 0);
dev->tuner_initialized = 0;
}

/* poweroff demodulator and ADCs */
@@ -693,6 +706,14 @@ int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq)
tmp = if_freq & 0xff;
r |= rtlsdr_demod_write_reg(dev, 1, 0x1b, tmp, 1);

/* Tell the R820T driver which IF frequency we are currently using
* so that it can choose the optimal IF filter settings.
* Works for normal tuning as well as no-mod direct sampling! */
if(dev->tuner_initialized && dev->tuner && dev->tuner->set_if_freq) {
rtlsdr_set_i2c_repeater(dev, 1);
dev->tuner->set_if_freq(dev, freq);
rtlsdr_set_i2c_repeater(dev, 0);
}
return r;
}

@@ -1144,6 +1165,7 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
rtlsdr_set_i2c_repeater(dev, 1);
r = dev->tuner->exit(dev);
rtlsdr_set_i2c_repeater(dev, 0);
dev->tuner_initialized = 0;
}
}

@@ -1153,6 +1175,7 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
fprintf(stderr, "Tuning E4000 to 3708 MHz\n");
rtlsdr_set_i2c_repeater(dev, 1);
dev->tuner->init(dev);
dev->tuner_initialized = 1;
dev->tuner->set_freq(dev, 3708000000u);
e4000_set_bw(dev, 15000000);
rtlsdr_set_i2c_repeater(dev, 0);
@@ -1161,6 +1184,7 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
rtlsdr_set_i2c_repeater(dev, 1);
dev->tuner->init(dev);
dev->tuner_initialized = 1;
r82xx_set_nomod(&devt->r82xx_p);
rtlsdr_set_i2c_repeater(dev, 0);
}
@@ -1190,11 +1214,12 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
rtlsdr_set_i2c_repeater(dev, 1);
r |= dev->tuner->init(dev);
rtlsdr_set_i2c_repeater(dev, 0);
dev->tuner_initialized = 1;
}

if ((dev->tuner_type == RTLSDR_TUNER_R820T) ||
(dev->tuner_type == RTLSDR_TUNER_R828D)) {
r |= rtlsdr_set_if_freq(dev, R82XX_IF_FREQ);
r |= rtlsdr_set_if_freq(dev, R82XX_DEFAULT_IF_FREQ);

/* enable spectrum inversion */
r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
@@ -1585,7 +1610,7 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)

/* the R82XX use 3.57 MHz IF for the DVB-T 6 MHz mode, and
* 4.57 MHz for the 8 MHz mode */
rtlsdr_set_if_freq(dev, R82XX_IF_FREQ);
rtlsdr_set_if_freq(dev, R82XX_DEFAULT_IF_FREQ);

/* enable spectrum inversion */
rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
@@ -1598,8 +1623,10 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
break;
}

if (dev->tuner->init)
if (dev->tuner->init) {
r = dev->tuner->init(dev);
dev->tuner_initialized = 1;
}

rtlsdr_set_i2c_repeater(dev, 0);

Loading