|
模拟连续波CW信号生成block的work函数
- #include <iostream>
- #include <complex>
- #include <vector>
- #include <unistd.h>
- #include <string.h>
- #define GR_M_PI 3.14159265358979323846 /* pi */
- //complex 头文件定义了用于处理复数的功能。complex<T> 模板类型的实例表示的是复数,这里定义了 3 个特化类型:
- //complex<float>、complex<double>、complex<long double>
- typedef std::vector<void*> gr_vector_void_star;
- //typedef std::vector<const void*> gr_vector_const_void_star;
- typedef std::complex<float> gr_complex;
- int work(int noutput_items, gr_vector_void_star& output_items)
- {
- // 谁调这个函数,谁就来决定output_items的数目
- //std::cout << "python里的tb.start()来调work()吗?noutput_items=" << noutput_items << std::endl;
- //std::cout << "到底谁来反复调这个work函数开始?这个值noutput_items输出数目谁定的?=" << noutput_items << std::endl;
- //std::cout << "1个包的长度d_packet_len界面参数定的=" << d_packet_len << std::endl;
- //output_items[0]指向模块的输出缓冲区
- gr_complex* out = (gr_complex*)output_items[0]; // out就是一个复数数组了
- //out = new gr_complex[4096];
- std::cout << "输出缓冲区数组长度(这里的out还是首元素地址)=" << sizeof(out) / sizeof(out[0]) << std::endl;
- //我加一句 需要重新编译并安装 make sudo make install 起作用了
- //sizeof(gr_complex)=8
- //std::cout << "sizeof(gr_complex)=" << sizeof(gr_complex) << std::endl;
- //noutput_items=4096 noutput_items=3072 noutput_items=3073 noutput_items=4095
- // std::cout << "输出样点数noutput_items=" << noutput_items << std::endl;
- // Set output to zero 每次都清空一下
- memset(out, 0, noutput_items * sizeof(gr_complex));
-
- int d_samp_rate=32000; //采样率 32k
- float d_amplitude=1.0; //振幅
- std::vector<float> d_frequency;
- d_frequency.push_back(1000); //频率1k
- int d_num_freq = d_frequency.size();// 频点个数
- std::vector<gr_complex> d_phase; //相位
- d_phase.resize(d_num_freq);
-
- // Integrate phase for iq signal iq信号的集成相位
- for (int i = 0; i < noutput_items; ++i) {
-
- // Write sample 这里才是真正的写样本
- for (int k = 0; k < d_num_freq; ++k) { // Go through frequencies
- //std::cout << i << "----" << k << "----" << d_phase[k] << std::endl;
- // 遍历 所有的频率
- out[i] += d_amplitude / (float)d_num_freq * exp(d_phase[k]);
- // output amplitude is normed on d_amplitude
- d_phase[k] = gr_complex(0, std::fmod(imag(d_phase[k]) + 2 * GR_M_PI * d_frequency[k] /
- (float)d_samp_rate,
- 2 * GR_M_PI));
- //std::cout << "相位(只改变虚部):" << d_phase[k] << std::endl;
- }
- //std::cout << "输出的值out(复数形式)=" << out[i] << std::endl;
- }
- // Tell runtime system how many output items we produced.
- // 告诉运行时系统我们生成了多少输出项
- return noutput_items;
- }
- int main(){
- //模拟连续波CW信号生成block的work函数
- int noutput_items = 4096; //这个值在框架里会波动 4095 4096
- gr_complex out[noutput_items]; //复数数组 栈 int a[10];
- std::cout << "sizeof(gr_complex)=" << sizeof(gr_complex) << std::endl;
- //模拟一下 定时调用work
- for(int i=0;i<5;i++){
- //work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items)
- //gr_vector_const_void_star input;
- gr_vector_void_star output;
- output.push_back(out);//代表1个输出端口
- work(noutput_items, output);
- sleep(1); //停留n秒
- }
- return 0;
- }
复制代码
|
|