Моделирование GNU Radio BPSK BER: нормализация амплитуды импульсов RRC - PullRequest
0 голосов
/ 08 июня 2018

Выполняется очень простой тест BPSK BER (рассматривается только AWGN).Испытание выполняется с использованием gr-mapper OOT .Первое моделирование основано на простом отображении BPSK (1-> 1, 0 -> - 1), показанном ниже.BER without MF

Результаты очень близки к теоретическому BER, как показано ниже BER При моделировании SNR определяется путем изменения напряжения шума гауссовскогоисточник шумаEb = RMS = sqrt ((1 ^ 2 + 1 ^ 2) / 2) = 1. Таким образом, шумовое напряжение = sqrt (No) = math.sqrt (1 / math.pow (10, SNR / 10.0)).Дополнительную информацию можно найти по этой ссылке

Сейчас я сосредоточен на добавлении согласованного фильтра, выполняемого одним фильтром RRC на передатчике и приемнике, как показано ниже.Этот блок-схема имеет очень плохую производительность BER.

flowgraph

При тщательном рассмотрении отфильтрованного сигнала BPSK величина больше не равна 1 (фактическое значение составляет около 0,15) и, следовательно, значение Eb составляетИспользуется не точно.Для дальнейшей проверки моего заключения я использовал инструмент проектирования фильтров gnuradio.Инструмент показывает, что для получения величины 1 коэффициент усиления должен быть установлен около 7 (при этом значении BER как-то близок к теории).

  1. Вопрос: Как убедиться, что амплитуда импульса (при t = 0) равна 1, без изменения коэффициента усиления фильтра до произвольного значения?

RRC pulse Код формирователя импульсов (debug_pulseshape_pam_2) показан ниже

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "debug_pulseshape_pam_2_impl.h"
#include <gnuradio/blocks/char_to_float.h>
#include <gnuradio/digital/map_bb.h>
#include <gnuradio/filter/interp_fir_filter_fff.h>

namespace gr {
     namespace baseband {

debug_pulseshape_pam_2::sptr
debug_pulseshape_pam_2::make(std::vector<float> taps,float sps)
{
  return gnuradio::get_initial_sptr
    (new debug_pulseshape_pam_2_impl(taps, sps));
}

/*
 * The private constructor
 */
debug_pulseshape_pam_2_impl::debug_pulseshape_pam_2_impl(std::vector<float> taps,float sps)
  : gr::hier_block2("debug_pulseshape_pam_2",
          gr::io_signature::make(1, 1, sizeof(unsigned char)),
          gr::io_signature::make(1, 1, sizeof(float)))
{
  //Initializing the map block
  std::vector<int> map;
  map.push_back(-1);
  map.push_back(1);
  gr::digital::map_bb::sptr mapper(gr::digital::map_bb::make(map));

  //Initializing char_to_float block
  gr::blocks::char_to_float::sptr float_char(gr::blocks::char_to_float::make());

  //Initializing add const block
  //gr::blocks::add_const_ff::sptr const_add(gr::blocks::add_const_ff::make(-0.5));

  //Initializing an interpolating FIR filter
  gr::filter::interp_fir_filter_fff::sptr fir(gr::filter::interp_fir_filter_fff::make(int(sps),taps));

  connect(self(),0,mapper,0);
  connect(mapper,0,float_char,0);
  connect(float_char,0, fir, 0);
  connect(fir, 0,    self(), 0);
}

/*
 * Our virtual destructor.
 */
debug_pulseshape_pam_2_impl::~debug_pulseshape_pam_2_impl()
{
}


} /* namespace baseband */
} /* namespace gr */

Пожалуйста, не стесняйтесь обращаться за дополнительной информацией, если это необходимо.

С уважением,

1 Ответ

0 голосов
/ 18 июня 2018

Мне удалось наконец решить проблему.Оказалось, что шум должен быть разделен на количество выборок на символ.enter image description here

...