GNU Radio's GFDM Package
receiver_kernel_cc.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2016 Andrej Rode
4 *
5 * This file is part of GNU Radio
6 *
7 * GNU Radio is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3, or (at your option)
10 * any later version.
11 *
12 * GNU Radio is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Radio; see the file COPYING. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street,
20 * Boston, MA 02110-1301, USA.
21 */
22
23#ifndef INCLUDED_GFDM_RECEIVER_KERNEL_CC_H
24#define INCLUDED_GFDM_RECEIVER_KERNEL_CC_H
25
26#include <complex>
27#include <vector>
28#include <boost/shared_ptr.hpp>
29#include <fftw3.h>
30#include <stdexcept>
31
32#include "gfdm_kernel_utils.h"
33
34namespace gr {
35 namespace gfdm {
36
37 /*!
38 * \brief Demodulate a GFDM block
39 * This class initializes and performs all operations necessary to demodulate a GFDM block.
40 *
41 */
42 /*!
43 * \details
44 * The GFDM receiver kernel class provides all necessary operations to blocks which instantiate it.
45 * Further functions and methods not depending on GNU Radio should be implemented here.
46 * This receiver implementation is based on [Gas+13].
47 * It is recommended to use overlap = 2 to make use of sparse frequency domain processing.
48 *
49 * [Gas+13] I.S. Gaspar et al. "Low Complexity GFDM Receiver Based on Sparse Frequency Domain Processing"
50 *
51 */
53 {
54 public:
55 typedef std::complex<float> gfdm_complex;
56 typedef boost::shared_ptr<receiver_kernel_cc> sptr;
57
58 receiver_kernel_cc(int n_timeslots, int n_subcarriers, int overlap, std::vector<gfdm_complex> frequency_taps);
60
61 void generic_work(gfdm_complex* out, const gfdm_complex* in);
62 void generic_work_equalize(gfdm_complex *out, const gfdm_complex *in, const gfdm_complex* f_eq_in);
64 void fft_equalize_filter_downsample(gfdm_complex* p_out, const gfdm_complex* p_in, const gfdm_complex* f_eq_in);
66 void cancel_sc_interference(gfdm_complex* p_out, const gfdm_complex* p_td_in, const gfdm_complex* p_fd_in);
67
68 void filter_superposition(std::vector< std::vector<gfdm_complex> > &out, const gfdm_complex* in);
69 void demodulate_subcarrier(std::vector< std::vector<gfdm_complex> > &out, std::vector< std::vector<gfdm_complex> > &sc_fdomain);
70 void serialize_output(gfdm_complex out[], std::vector< std::vector<gfdm_complex> > &sc_symbols);
71 void vectorize_2d(std::vector< std::vector<gfdm_complex> > &out_vector, const gfdm_complex* p_in);
72 void remove_sc_interference(std::vector< std::vector<gfdm_complex> > &sc_symbols, std::vector< std::vector<gfdm_complex> > &sc_fdomain);
74 {
75 return d_block_len;
76 };
77 std::vector<gfdm_complex> filter_taps();
78 std::vector<gfdm_complex> ic_filter_taps();
79 int timeslots() {return d_n_timeslots;};
80
81 private:
82 int d_n_subcarriers;
83 int d_n_timeslots;
84 int d_block_len;
85 int d_overlap;
86 gfdm_complex* d_filter_taps;
87 gfdm_complex* d_ic_filter_taps;
88
89 void initialize_taps_vector(gfdm_complex* filter_taps, std::vector<gfdm_complex> frequency_taps, const int n_timeslots);
90
91 fftwf_plan d_in_fft_plan;
92 gfdm_complex* d_in_fft_in;
93 gfdm_complex* d_in_fft_out;
94
95 gfdm_complex* d_equalized;
96
97 fftwf_plan d_sc_ifft_plan;
98 gfdm_complex* d_sc_ifft_in;
99 gfdm_complex* d_sc_ifft_out;
100
101 fftwf_plan d_sc_fft_plan;
102 gfdm_complex* d_sc_fft_in;
103 gfdm_complex* d_sc_fft_out;
104
105 gfdm_complex* d_sc_postfilter;
106 gfdm_complex* d_sc_filtered;
107
108 void filter_subcarriers_and_downsample_fd(gfdm_complex *p_out, const gfdm_complex *p_in);
109
110 };
111 } /* namespace gfdm */
112} /* namespace gr */
113
114#endif /* INCLUDED_GFDM_RECEIVER_KERNEL_CC_H */
115
116
117
118
<+description+>
Definition gfdm_kernel_utils.h:40
Demodulate a GFDM block This class initializes and performs all operations necessary to demodulate a ...
Definition receiver_kernel_cc.h:53
void generic_work_equalize(gfdm_complex *out, const gfdm_complex *in, const gfdm_complex *f_eq_in)
void transform_subcarriers_to_td(gfdm_complex *p_out, const gfdm_complex *p_in)
int timeslots()
Definition receiver_kernel_cc.h:79
void demodulate_subcarrier(std::vector< std::vector< gfdm_complex > > &out, std::vector< std::vector< gfdm_complex > > &sc_fdomain)
void vectorize_2d(std::vector< std::vector< gfdm_complex > > &out_vector, const gfdm_complex *p_in)
void filter_superposition(std::vector< std::vector< gfdm_complex > > &out, const gfdm_complex *in)
void generic_work(gfdm_complex *out, const gfdm_complex *in)
std::vector< gfdm_complex > ic_filter_taps()
void fft_filter_downsample(gfdm_complex *p_out, const gfdm_complex *p_in)
void fft_equalize_filter_downsample(gfdm_complex *p_out, const gfdm_complex *p_in, const gfdm_complex *f_eq_in)
std::complex< float > gfdm_complex
Definition receiver_kernel_cc.h:55
void serialize_output(gfdm_complex out[], std::vector< std::vector< gfdm_complex > > &sc_symbols)
receiver_kernel_cc(int n_timeslots, int n_subcarriers, int overlap, std::vector< gfdm_complex > frequency_taps)
std::vector< gfdm_complex > filter_taps()
int block_size()
Definition receiver_kernel_cc.h:73
void remove_sc_interference(std::vector< std::vector< gfdm_complex > > &sc_symbols, std::vector< std::vector< gfdm_complex > > &sc_fdomain)
boost::shared_ptr< receiver_kernel_cc > sptr
Definition receiver_kernel_cc.h:56
void cancel_sc_interference(gfdm_complex *p_out, const gfdm_complex *p_td_in, const gfdm_complex *p_fd_in)
Definition add_cyclic_prefix_cc.h:30