GNU Radio BPSK BER 模拟:RRC 脉冲幅度归一化
GNU Radio BPSK BER simulation: RRC Pulse Magnitude Normalization
正在执行非常基本的 BPSK BER 测试(仅考虑 AWGN)。测试是通过使用 gr-mapper OOT 完成的。第一个模拟基于一个简单的 BPSK 映射器 (1->1, 0->-1),如下所示。
结果非常接近理论 BER,如下所示
在仿真中,通过改变高斯噪声源的噪声电压来指定 SNR。
Eb = RMS = sqrt((1^2 + 1^2)/2) = 1。因此,噪声电压 = sqrt(No) = math.sqrt(1/math.pow(10,SNR/10.0)).可以在 link
找到更多信息
我现在专注于在发射器和接收器上添加一个由一个 RRC 滤波器完成的匹配滤波器,如下所示。该流程图的 BER 性能非常差。
仔细检查过滤后的 BPSK 信号,幅度不再为 1(实际值约为 0.15),因此使用的 Eb 值不准确。为了进一步验证我的结论,我使用了 gnuradio 滤波器设计工具。该工具显示,要获得 1 的幅度,必须将增益设置为 7 左右(在这个值下,BER 在某种程度上接近理论值)。
- 问题:如何在不将滤波器增益调整为任意值的情况下确保脉冲幅度(在 t=0 时)为 1?
脉冲整形器 (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 */
如果需要,请随时询问更多信息。
此致,
我终于解决了这个问题。结果表明噪声必须除以每个符号的样本数。
正在执行非常基本的 BPSK BER 测试(仅考虑 AWGN)。测试是通过使用 gr-mapper OOT 完成的。第一个模拟基于一个简单的 BPSK 映射器 (1->1, 0->-1),如下所示。
结果非常接近理论 BER,如下所示
我现在专注于在发射器和接收器上添加一个由一个 RRC 滤波器完成的匹配滤波器,如下所示。该流程图的 BER 性能非常差。
仔细检查过滤后的 BPSK 信号,幅度不再为 1(实际值约为 0.15),因此使用的 Eb 值不准确。为了进一步验证我的结论,我使用了 gnuradio 滤波器设计工具。该工具显示,要获得 1 的幅度,必须将增益设置为 7 左右(在这个值下,BER 在某种程度上接近理论值)。
- 问题:如何在不将滤波器增益调整为任意值的情况下确保脉冲幅度(在 t=0 时)为 1?
#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 */
如果需要,请随时询问更多信息。
此致,
我终于解决了这个问题。结果表明噪声必须除以每个符号的样本数。