В настоящее время я реализую схему фазовой модуляции с остаточной несущей. Эта схема модуляции в основном используется в дальнем космосе. Я уже вывел компоненты I-Q следующим образом
I (t) = Power_total * sin (h) * d (t)
Q (t) = -1 * Power_total * cos (h)
где h — схема модуляции, а d (t) — входные данные (поток битов). Обратите внимание, что когда h = 90 градусов, мы имеем схему фазовой модуляции с подавленной несущей a.k.a BPSK. Индекс модуляции определяет, как мощность распределяется между остаточной несущей и носителем данных. Это упрощает синхронизацию, поскольку приемник может отслеживать остаточную немодулированную несущую.
Ниже мой код в GNU Radio. К сожалению, этот код дает сбой всякий раз, когда я назначаю входные данные, в [i], oi и oq (синфазные и квадратурные коэффициенты для компонентов данных и остаточных несущих). Будем весьма благодарны за любые предложения, ссылки или ссылки, которые могут помочь мне устранить проблему. Заранее спасибо.
#ifdef HAVE_CONFIG_H
#include "config.h"#endif
#include <gnuradio/io_signature.h>
#include "phase_mod_impl.h"#include <gnuradio/sincos.h>
#include <math.h>
namespace gr {
namespace GS {
phase_mod::sptr
phase_mod::make(float mod_index)
{
return gnuradio::get_initial_sptr
(new phase_mod_impl(mod_index));
}
/*
* The private constructor
*/
phase_mod_impl::phase_mod_impl(float mod_index)
: gr::sync_block("phase_mod",
gr::io_signature::make(1, 1, sizeof(float)),
gr::io_signature::make(1, 1, sizeof(gr_complex))),
h(mod_index)
{}
/*
* Our virtual destructor.
*/
phase_mod_impl::~phase_mod_impl()
{
}
int
phase_mod_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const float *in = (const float *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
// Do <+signal processing+>
for(int i = 0; i < noutput_items; i++) {
float oq, oi;
gr::sincosf(h,&oi, &oq);
oi *= in[i];
oq *= -1;
out[i] = gr_complex(oi,oq);
}
// Tell runtime system how many output items we produced.
return noutput_items;
}
/*} /* namespace GS */
} /* namespace gr */code here
Я обнаружил, что проблема была в потоковой диаграмме gnuradio, которую я использовал для тестирования кода. В основном один из блоков генерировал числа порядка 10 ^ 34. Это то, что вызвало сбои. В противном случае блок фазовой модуляции работает как положено.
Других решений пока нет …