东方耀AI技术分享
标题:
模拟连续波CW信号生成block的work函数
[打印本页]
作者:
东方耀
时间:
2021-7-5 16:42
标题:
模拟连续波CW信号生成block的work函数
模拟连续波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;
}
复制代码
作者:
zouqiqi
时间:
2021-11-23 19:37
让天下人人学会人工智能!人工智能的前景一片大好!
欢迎光临 东方耀AI技术分享 (http://ai111.vip/)
Powered by Discuz! X3.4