Calculate sleep and RX buffer from decimation
This commit is contained in:
parent
b05ec20528
commit
4652802a54
2 changed files with 26 additions and 109 deletions
118
grc/PicoSDR.grc
118
grc/PicoSDR.grc
|
@ -56,7 +56,7 @@ blocks:
|
|||
id: variable
|
||||
parameters:
|
||||
comment: ''
|
||||
value: 1_280_000 // 64
|
||||
value: 1_280_000 // (1 << 6)
|
||||
states:
|
||||
bus_sink: false
|
||||
bus_source: false
|
||||
|
@ -77,23 +77,7 @@ blocks:
|
|||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [512, 568.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: blocks_complex_to_mag_squared_0
|
||||
id: blocks_complex_to_mag_squared
|
||||
parameters:
|
||||
affinity: ''
|
||||
alias: ''
|
||||
comment: ''
|
||||
maxoutbuf: '0'
|
||||
minoutbuf: '0'
|
||||
vlen: '1'
|
||||
states:
|
||||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [704, 440.0]
|
||||
coordinate: [712, 496.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: blocks_interleaved_char_to_complex_0
|
||||
|
@ -127,24 +111,6 @@ blocks:
|
|||
coordinate: [1000, 32.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: blocks_nlog10_ff_0
|
||||
id: blocks_nlog10_ff
|
||||
parameters:
|
||||
affinity: ''
|
||||
alias: ''
|
||||
comment: ''
|
||||
k: '0'
|
||||
maxoutbuf: '0'
|
||||
minoutbuf: '0'
|
||||
n: '10'
|
||||
vlen: '1'
|
||||
states:
|
||||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [888, 432.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: blocks_probe_rate_0
|
||||
id: blocks_probe_rate
|
||||
parameters:
|
||||
|
@ -195,54 +161,6 @@ blocks:
|
|||
coordinate: [440, 8.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: low_pass_filter_1
|
||||
id: low_pass_filter
|
||||
parameters:
|
||||
affinity: ''
|
||||
alias: ''
|
||||
beta: '6.76'
|
||||
comment: ''
|
||||
cutoff_freq: '1900'
|
||||
decim: '1'
|
||||
gain: '1'
|
||||
interp: '1'
|
||||
maxoutbuf: '0'
|
||||
minoutbuf: '0'
|
||||
samp_rate: samp_rate
|
||||
type: fir_filter_fff
|
||||
width: '100'
|
||||
win: window.WIN_HAMMING
|
||||
states:
|
||||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [704, 516.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: low_pass_filter_1_0
|
||||
id: low_pass_filter
|
||||
parameters:
|
||||
affinity: ''
|
||||
alias: ''
|
||||
beta: '6.76'
|
||||
comment: ''
|
||||
cutoff_freq: '15'
|
||||
decim: '1'
|
||||
gain: '1'
|
||||
interp: '1'
|
||||
maxoutbuf: '0'
|
||||
minoutbuf: '0'
|
||||
samp_rate: samp_rate
|
||||
type: fir_filter_fff
|
||||
width: '15'
|
||||
win: window.WIN_BLACKMAN
|
||||
states:
|
||||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [1000, 380.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: network_tcp_source_0
|
||||
id: network_tcp_source
|
||||
parameters:
|
||||
|
@ -546,10 +464,10 @@ blocks:
|
|||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [1000, 544.0]
|
||||
coordinate: [1000, 472.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: qtgui_time_sink_x_0_0_0
|
||||
- name: qtgui_time_sink_x_0_1
|
||||
id: qtgui_time_sink_x
|
||||
parameters:
|
||||
affinity: ''
|
||||
|
@ -581,9 +499,9 @@ blocks:
|
|||
entags: 'False'
|
||||
grid: 'True'
|
||||
gui_hint: (2, 0, 1, 1)
|
||||
label1: RSSI
|
||||
label1: I
|
||||
label10: Signal 10
|
||||
label2: Signal 2
|
||||
label2: Q
|
||||
label3: Signal 3
|
||||
label4: Signal 4
|
||||
label5: Signal 5
|
||||
|
@ -602,10 +520,10 @@ blocks:
|
|||
marker7: '-1'
|
||||
marker8: '-1'
|
||||
marker9: '-1'
|
||||
name: '"RSSI"'
|
||||
name: '"IQ / Loop"'
|
||||
nconnections: '1'
|
||||
size: '1000'
|
||||
srate: '1000'
|
||||
size: int(samp_rate // 30)
|
||||
srate: samp_rate
|
||||
stemplot: 'False'
|
||||
style1: '1'
|
||||
style10: '1'
|
||||
|
@ -623,7 +541,7 @@ blocks:
|
|||
tr_mode: qtgui.TRIG_MODE_FREE
|
||||
tr_slope: qtgui.TRIG_SLOPE_POS
|
||||
tr_tag: '""'
|
||||
type: float
|
||||
type: complex
|
||||
update_time: 1/30
|
||||
width1: '1'
|
||||
width10: '1'
|
||||
|
@ -635,15 +553,15 @@ blocks:
|
|||
width7: '1'
|
||||
width8: '1'
|
||||
width9: '1'
|
||||
ylabel: dBm
|
||||
ymax: '0'
|
||||
ymin: '-60'
|
||||
ylabel: Amplitude
|
||||
ymax: '1'
|
||||
ymin: '-1'
|
||||
yunit: '""'
|
||||
states:
|
||||
bus_sink: false
|
||||
bus_source: false
|
||||
bus_structure: null
|
||||
coordinate: [1184, 408.0]
|
||||
coordinate: [1000, 360.0]
|
||||
rotation: 0
|
||||
state: true
|
||||
- name: qtgui_waterfall_sink_x_0_0
|
||||
|
@ -709,19 +627,15 @@ blocks:
|
|||
state: true
|
||||
|
||||
connections:
|
||||
- [analog_quadrature_demod_cf_0, '0', low_pass_filter_1, '0']
|
||||
- [blocks_complex_to_mag_squared_0, '0', blocks_nlog10_ff_0, '0']
|
||||
- [analog_quadrature_demod_cf_0, '0', qtgui_time_sink_x_0_0, '0']
|
||||
- [blocks_interleaved_char_to_complex_0, '0', analog_quadrature_demod_cf_0, '0']
|
||||
- [blocks_interleaved_char_to_complex_0, '0', blocks_complex_to_mag_squared_0, '0']
|
||||
- [blocks_interleaved_char_to_complex_0, '0', blocks_probe_rate_0, '0']
|
||||
- [blocks_interleaved_char_to_complex_0, '0', digital_costas_loop_cc_0, '0']
|
||||
- [blocks_interleaved_char_to_complex_0, '0', qtgui_time_sink_x_0, '0']
|
||||
- [blocks_interleaved_char_to_complex_0, '0', qtgui_waterfall_sink_x_0_0, '0']
|
||||
- [blocks_nlog10_ff_0, '0', low_pass_filter_1_0, '0']
|
||||
- [blocks_probe_rate_0, rate, blocks_message_debug_0, print]
|
||||
- [digital_costas_loop_cc_0, '0', qtgui_const_sink_x_0, '0']
|
||||
- [low_pass_filter_1, '0', qtgui_time_sink_x_0_0, '0']
|
||||
- [low_pass_filter_1_0, '0', qtgui_time_sink_x_0_0_0, '0']
|
||||
- [digital_costas_loop_cc_0, '0', qtgui_time_sink_x_0_1, '0']
|
||||
- [network_tcp_source_0, '0', blocks_interleaved_char_to_complex_0, '0']
|
||||
|
||||
metadata:
|
||||
|
|
17
src/main.c
17
src/main.c
|
@ -39,10 +39,14 @@
|
|||
|
||||
#define CLK_SYS_HZ (250 * MHZ)
|
||||
#define BANDWIDTH 1280000
|
||||
#define DECIMATION 64
|
||||
|
||||
#define DECIMATION_BITS 6
|
||||
#define IQ_BLOCK_LEN 64
|
||||
|
||||
#define RX_SLEEP_US (DECIMATION * BANDWIDTH / (1 * MHZ) / 4)
|
||||
#define DECIMATION (1 << DECIMATION_BITS)
|
||||
|
||||
static_assert(RX_SLEEP_US > 0, "RX_SLEEP_US must be positive");
|
||||
|
||||
#define XOR_ADDR 0x1000
|
||||
#define LO_COS_ACCUMULATOR (&pio1->sm[2].pinctrl)
|
||||
#define LO_SIN_ACCUMULATOR (&pio1->sm[3].pinctrl)
|
||||
|
@ -52,7 +56,7 @@
|
|||
static uint32_t lo_cos[LO_WORDS] __attribute__((__aligned__(LO_WORDS * 4)));
|
||||
static uint32_t lo_sin[LO_WORDS] __attribute__((__aligned__(LO_WORDS * 4)));
|
||||
|
||||
#define RX_BITS_DEPTH 8
|
||||
#define RX_BITS_DEPTH (DECIMATION_BITS + 2)
|
||||
#define RX_WORDS (1 << RX_BITS_DEPTH)
|
||||
static uint32_t rx_cos[RX_WORDS] __attribute__((__aligned__(RX_WORDS * 4)));
|
||||
static uint32_t rx_sin[RX_WORDS] __attribute__((__aligned__(RX_WORDS * 4)));
|
||||
|
@ -60,8 +64,6 @@ static uint32_t rx_sin[RX_WORDS] __attribute__((__aligned__(RX_WORDS * 4)));
|
|||
#define SIN_PHASE (UINT_MAX / 4)
|
||||
#define COS_PHASE (0)
|
||||
|
||||
static_assert(RX_WORDS > 2 * DECIMATION, "RX buffers too short for given decimation");
|
||||
|
||||
/* rx -> cp -> cos -> sin -> pio_cos -> pio_sin -> rx ... */
|
||||
static int dma_ch_rx = -1;
|
||||
static int dma_ch_cp = -1;
|
||||
|
@ -590,7 +592,7 @@ static void rf_rx(void)
|
|||
|
||||
while (delta < 2 * DECIMATION) {
|
||||
delta = prev_transfers - dma_hw->ch[dma_ch_in_cos].transfer_count;
|
||||
sleep_us(10);
|
||||
sleep_us(RX_SLEEP_US);
|
||||
}
|
||||
|
||||
prev_transfers -= 2 * DECIMATION;
|
||||
|
@ -788,7 +790,8 @@ static void do_rx(int rx_pin, int bias_pin, float freq, char mode)
|
|||
for (int i = 0; i < IQ_BLOCK_LEN / 2; i += 8) {
|
||||
int I = block[i * 2];
|
||||
int Q = block[i * 2 + 1];
|
||||
printf("%+4i | %+5.1f dBm | %+4i %+4i | ", gap, rssi, I, Q);
|
||||
printf("%+4i | %+5.1f dBm | %+4i %+4i | ",
|
||||
RX_WORDS / 2 + gap, rssi, I, Q);
|
||||
plot_IQ(I, Q);
|
||||
putchar('\n');
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue