Skip to content

Commit

Permalink
cdd: Add CDD to GNU Radio blocks
Browse files Browse the repository at this point in the history
now, CDD is usable in GR flowgraphs.
  • Loading branch information
jdemel committed Feb 5, 2021
1 parent d988276 commit 5038512
Show file tree
Hide file tree
Showing 20 changed files with 450 additions and 185 deletions.
97 changes: 54 additions & 43 deletions grc/gfdm_short_burst_shaper.block.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,69 @@

id: gfdm_short_burst_shaper
label: Short Burst Shaper
category: '[GFDM]'
category: "[GFDM]"

parameters:
- id: pre_padding
label: Pre-padding Length
dtype: int
default: '128'
- id: post_padding
label: Post-padding Length
dtype: int
default: '128'
- id: scale
label: Scale
dtype: complex
default: '1.0+0.0j'
- id: length_tag_name
label: Length Tag Name
dtype: string
default: '"packet_len"'
- id: use_timed_commands
label: Timed commands
dtype: bool
default: False
- id: timing_advance
label: Timing advance
dtype: float
default: 1.0e-3
- id: cycle_interval
label: Cycle interval
dtype: float
default: 250.0e-6
- id: pre_padding
label: Pre-padding Length
dtype: int
default: "128"
- id: post_padding
label: Post-padding Length
dtype: int
default: "128"
- id: scale
label: Scale
dtype: complex
default: "1.0+0.0j"
- id: nports
label: Ports
dtype: int
default: "1"
- id: length_tag_name
label: Length Tag Name
dtype: string
default: '"packet_len"'
- id: use_timed_commands
label: Timed commands
dtype: bool
default: False
- id: timing_advance
label: Timing advance
dtype: float
default: 1.0e-3
- id: cycle_interval
label: Cycle interval
dtype: float
default: 250.0e-6

asserts:
- ${ pre_padding >= 0 }
- ${ post_padding >= 0 }
- ${ nports > 0 }

inputs:
- domain: stream
dtype: complex
- domain: message
id: time_tag
optional: True
- domain: stream
dtype: complex
multiplicity: ${nports}
- domain: message
id: time_tag
optional: True

outputs:
- domain: stream
dtype: complex
- domain: message
id: command
optional: True
- domain: stream
dtype: complex
multiplicity: ${nports}
- domain: message
id: command
optional: True

templates:
imports: import gfdm
make: gfdm.short_burst_shaper(${pre_padding}, ${post_padding}, ${scale}, ${length_tag_name}, ${use_timed_commands}, ${timing_advance}, ${cycle_interval})
make: gfdm.short_burst_shaper(${pre_padding}, ${post_padding}, ${scale}, ${nports}, ${length_tag_name}, ${use_timed_commands}, ${timing_advance}, ${cycle_interval})
callbacks:
- set_scale(${scale})
- set_timing_advance(${timing_advance})
- set_timing_advance(${cycle_interval})
- set_scale(${scale})
- set_timing_advance(${timing_advance})
- set_timing_advance(${cycle_interval})

file_format: 1
55 changes: 32 additions & 23 deletions grc/gfdm_transmitter_cc.block.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,64 +2,73 @@

id: gfdm_transmitter_cc
label: GFDM Transmitter
category: '[GFDM]'
category: "[GFDM]"

parameters:
- id: timeslots
- id: timeslots
label: Timeslots
dtype: int
- id: subcarriers
- id: subcarriers
label: Subcarriers
dtype: int
- id: active_subcarriers
- id: active_subcarriers
label: Active subcarriers
dtype: int
- id: cp_len
- id: cp_len
label: CP length
dtype: int
- id: cs_len
- id: cs_len
label: CS length
dtype: int
- id: ramp_len
- id: ramp_len
label: Ramp length
dtype: int
- id: subcarrier_map
- id: subcarrier_map
label: Subcarrier map
dtype: raw
- id: per_timeslot
- id: per_timeslot
label: per Timeslot
dtype: bool
default: 'True'
- id: overlap
default: "True"
- id: overlap
label: Overlap
dtype: int
- id: frequency_taps
- id: frequency_taps
label: Frequency domain taps
dtype: raw
- id: window_taps
- id: window_taps
label: Window taps
dtype: raw
- id: preamble
label: Preamble
- id: cyclic_shifts
label: Cyclic shifts
dtype: int_vector
default: "[0, ]"
- id: preambles
label: Preambles
dtype: raw
- id: tsb_tag_key
- id: tsb_tag_key
label: Length Tag Key
dtype: string
default: '"packet_len"'

asserts:
- ${ len(preambles) == len(cyclic_shifts) }

inputs:
- domain: stream
- domain: stream
dtype: complex

outputs:
- domain: stream
- domain: stream
dtype: complex
multiplicity: ${ len(cyclic_shifts) }

templates:
imports: import gfdm
make: |-
gfdm.transmitter_cc(${timeslots}, ${subcarriers}, ${active_subcarriers},
${cp_len}, ${cs_len}, ${ramp_len}, ${subcarrier_map},
${per_timeslot}, ${overlap}, ${frequency_taps}, ${window_taps}, ${preamble}, ${tsb_tag_key})
imports: import gfdm
make: |-
gfdm.transmitter_cc(${timeslots}, ${subcarriers}, ${active_subcarriers},
${cp_len}, ${cs_len}, ${ramp_len}, ${subcarrier_map},
${per_timeslot}, ${overlap}, ${frequency_taps}, ${window_taps},
${cyclic_shifts}, ${preambles}, ${tsb_tag_key})
file_format: 1
10 changes: 9 additions & 1 deletion include/gfdm/add_cyclic_prefix_cc.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
* Copyright 2016 Johannes Demel.
* Copyright 2016, 2021 Johannes Demel.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -48,6 +48,9 @@ class add_cyclic_prefix_cc
int cyclic_shift = 0);
~add_cyclic_prefix_cc();
void generic_work(gfdm_complex* p_out, const gfdm_complex* p_in);
void add_cyclic_prefix(gfdm_complex* p_out,
const gfdm_complex* p_in,
const int cyclic_prefix);
void remove_cyclic_prefix(gfdm_complex* p_out, const gfdm_complex* p_in);
int block_size() { return d_block_len; };
int frame_size() { return block_size() + d_cp_len + d_cs_len; };
Expand All @@ -60,8 +63,13 @@ class add_cyclic_prefix_cc
const int d_ramp_len;
const int d_cyclic_shift;

void add_cyclic_extension(gfdm_complex* out,
const gfdm_complex* in,
const int cyclic_shift);

volk::vector<gfdm_complex> d_front_ramp;
volk::vector<gfdm_complex> d_back_ramp;
void apply_ramp(gfdm_complex* out, const gfdm_complex* in);
};

} // namespace gfdm
Expand Down
1 change: 1 addition & 0 deletions include/gfdm/short_burst_shaper.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class GFDM_API short_burst_shaper : virtual public gr::tagged_stream_block
static sptr make(int pre_padding,
int post_padding,
gr_complex scale,
const unsigned nports = 1,
const std::string& length_tag_name = "packet_len",
bool use_timed_commands = false,
double timing_advance = 1.0e-3,
Expand Down
3 changes: 2 additions & 1 deletion include/gfdm/transmitter_cc.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ class GFDM_API transmitter_cc : virtual public gr::block
int overlap,
std::vector<gr_complex> frequency_taps,
std::vector<gr_complex> window_taps,
std::vector<gr_complex> preamble,
std::vector<int> cyclic_shifts,
std::vector<std::vector<gr_complex>> preambles,
const std::string& tsb_tag_key = "");
};

Expand Down
15 changes: 12 additions & 3 deletions include/gfdm/transmitter_kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <gfdm/api.h>
#include <gfdm/modulator_kernel_cc.h>
#include <gfdm/resource_mapper_kernel_cc.h>
#include <unordered_map>
#include <volk/volk_alloc.hh>
#include <memory>

Expand Down Expand Up @@ -55,22 +56,30 @@ class GFDM_API transmitter_kernel
int overlap,
std::vector<gfdm_complex> frequency_taps,
std::vector<gfdm_complex> window_taps,
std::vector<gfdm_complex> preamble);
std::vector<int> cyclic_shifts,
std::vector<std::vector<gfdm_complex>> preambles);
~transmitter_kernel();

int input_vector_size() { return d_mapper->input_vector_size(); }
int output_vector_size() { return d_prefixer->frame_size() + d_preamble.size(); }
int output_vector_size() { return d_prefixer->frame_size() + d_preamble_size; }
void
generic_work(gfdm_complex* p_out, const gfdm_complex* p_in, const int ninput_size);
void modulate(gfdm_complex* out, const gfdm_complex* in, const int ninput_size);
void add_frame(gfdm_complex* out, const gfdm_complex* in, const int cyclic_shift);
const std::vector<int>& cyclic_shifts() const { return d_cyclic_shifts; };

private:
std::unique_ptr<resource_mapper_kernel_cc> d_mapper;
std::unique_ptr<modulator_kernel_cc> d_modulator;
std::unique_ptr<add_cyclic_prefix_cc> d_prefixer;

std::vector<int> d_cyclic_shifts;

volk::vector<gfdm_complex> d_mapped;
volk::vector<gfdm_complex> d_frame;
volk::vector<gfdm_complex> d_preamble;
const unsigned d_preamble_size;
std::unordered_map<int, volk::vector<gfdm_complex>> d_preambles;
void insert_preamble(gfdm_complex* out, const int cyclic_shift);
};

} // namespace gfdm
Expand Down
45 changes: 32 additions & 13 deletions lib/add_cyclic_prefix_cc.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
* Copyright 2016 Johannes Demel.
* Copyright 2016, 2021 Johannes Demel.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -60,24 +60,43 @@ add_cyclic_prefix_cc::~add_cyclic_prefix_cc() {}

void add_cyclic_prefix_cc::generic_work(gfdm_complex* p_out, const gfdm_complex* p_in)
{
const unsigned cp_start = block_size() - d_cp_len - d_cyclic_shift;
const unsigned shifted_cp_len = d_cp_len + d_cyclic_shift;
memcpy(p_out, p_in + cp_start, sizeof(gfdm_complex) * shifted_cp_len);
add_cyclic_prefix(p_out, p_in, d_cyclic_shift);
}


memcpy(p_out + shifted_cp_len, p_in, sizeof(gfdm_complex) * block_size());
const unsigned shifted_cs_len = d_cs_len - d_cyclic_shift;
memcpy(p_out + shifted_cp_len + block_size(),
p_in,
sizeof(gfdm_complex) * shifted_cs_len);
void add_cyclic_prefix_cc::add_cyclic_prefix(gfdm_complex* p_out,
const gfdm_complex* p_in,
const int cyclic_prefix)
{
add_cyclic_extension(p_out, p_in, cyclic_prefix);

if (d_ramp_len > 0) {
const unsigned tail_start = block_size() + d_cp_len + d_cs_len - d_ramp_len;
volk_32fc_x2_multiply_32fc(p_out, p_out, d_front_ramp.data(), d_ramp_len);
volk_32fc_x2_multiply_32fc(
p_out + tail_start, p_out + tail_start, d_back_ramp.data(), d_ramp_len);
apply_ramp(p_out, p_out);
}
}

void add_cyclic_prefix_cc::add_cyclic_extension(gfdm_complex* out,
const gfdm_complex* in,
const int cyclic_shift)
{
const unsigned cp_start = block_size() - d_cp_len - cyclic_shift;
const unsigned shifted_cp_len = d_cp_len + cyclic_shift;
memcpy(out, in + cp_start, sizeof(gfdm_complex) * shifted_cp_len);

memcpy(out + shifted_cp_len, in, sizeof(gfdm_complex) * block_size());
const unsigned shifted_cs_len = d_cs_len - cyclic_shift;
memcpy(
out + shifted_cp_len + block_size(), in, sizeof(gfdm_complex) * shifted_cs_len);
}

void add_cyclic_prefix_cc::apply_ramp(gfdm_complex* out, const gfdm_complex* in)
{
const unsigned tail_start = block_size() + d_cp_len + d_cs_len - d_ramp_len;
volk_32fc_x2_multiply_32fc(out, in, d_front_ramp.data(), d_ramp_len);
volk_32fc_x2_multiply_32fc(
out + tail_start, in + tail_start, d_back_ramp.data(), d_ramp_len);
}

void add_cyclic_prefix_cc::remove_cyclic_prefix(gfdm_complex* p_out,
const gfdm_complex* p_in)
{
Expand Down
Loading

0 comments on commit 5038512

Please sign in to comment.