周报2.21-2.27
Wifi grc
流图的搭建:
实验的整个流程:
- 将框图的输出端数据到
fsk_RE1.wav
,fsk_IM1.wav
中,通过test.py
处理生成a1_re.txt
,a1_im.txt
,然后通过matlab
处理观察波形发现其从500点到2260点为第一个数据包,2761点向后相同长度为第二个数据包,依次类推。 - 用
matlab
在1200点到1600点生成-1的数据,其他点生成+1的数据模拟对数据进行相位调制; - 将数据通过
file_matlab
模块传入,与原发送信号相乘得到经过相位调制后的数据。
需要注意的几点:
gr-right
中新写了一个file_matlab
模块可以用于将matlab
中的数据传入gnuradio
中,其读取文件的位置是/home/l/Desktop/matlab/test.txt
,该模块的作用是将txt
数据作为采样点传入gnuradio
中,注意前面的一般数据是真实数据的实部,后面的一半为虚部;file_matlab
模块需要传入一个参数samp_rate
采样率,这样gnuradio
就根据采样率和采样点数据模拟出真实的数据传输波形。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33/* -*- c++ -*- */
//file_matlab_impl.h
namespace gr {
namespace right {
class file_matlab_impl : public file_matlab
{
private:
// Nothing to declare in this block.
int flag;
int send;
public:
file_matlab_impl(int samp_rate);
~file_matlab_impl();
// Where all the action really happens
int work(
int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items
);
};
} // namespace right
} // namespace gr1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99/* -*- c++ -*- */
//file_matlab_impl.cc
using namespace std;
namespace gr {
namespace right {
file_matlab::sptr
file_matlab::make(int samp_rate)
{
return gnuradio::get_initial_sptr
(new file_matlab_impl(samp_rate));
}
/*
* The private constructor
*/
file_matlab_impl::file_matlab_impl(int samp_rate)
: gr::sync_block("file_matlab",
gr::io_signature::make(0, 0, 0),
gr::io_signature::make(1, 1, sizeof(gr_complex))),
flag(0),
send(0)
{}
/*
* Our virtual destructor.
*/
gr_complex* read_file(){
vector <float> file_data;
ifstream ifs;
string s;
ifs.open("/home/l/Desktop/matlab/test.txt",ios::in);
if(!ifs.is_open()){
cout<<"fail to open!!!"<<endl;
return 0;
}
else{
while(getline(ifs,s)){
float aa = atof(s.c_str());
file_data.push_back(aa);
}
gr_complex *data = new gr_complex[file_data.size()/2];
data[0].real(file_data.size()/2);
for(int i = 0; i < file_data.size(); i++){
if(i<file_data.size()/2) data[i+1].real(file_data[i]);
else data[i-file_data.size()/2+1].imag(file_data[i]);
}
ifs.close();
// cout<<file_data.size()<<endl;
return data;
}
}
gr_complex *data_send;
file_matlab_impl::~file_matlab_impl()
{
}
int
file_matlab_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
gr_complex *out = (gr_complex *) output_items[0];
// Do <+signal processing+>
for(int index = 0; index<noutput_items;index++){
if(flag == 0) {
data_send = read_file();
flag= 1;
}
else {
out[index] = data_send[send+1];
//cout<< data_send[send] <<endl;
//cout<< send <<endl;
if(send < (int)data_send[0].real()-1) send = send+1;
else send = 0;
}
}
// Tell runtime system how many output items we produced.
return noutput_items;
}
} /* namespace right */
} /* namespace gr */生成波形并传入
test.txt
文件
1 | % SampleRate = 2e6; |
实验结果:
可以看到数据每次改变的位置都是固定的,即第一个数据位,因为解码过程中有反卷积的操作,因此第一位字符解码出来的结果不同。