为每一行数据加上行号

博客介绍了在单行输入模式下输入代码“let i = 1 | g /^/ s//\\=i/ | let i = i + 1”,涉及信息技术领域的代码操作相关内容。

在单行输入模式下输入:

:let i = 1 | g /^/ s//\=i/ | let i = i  + 1

下面是完整的 C++ 代码,**每行都添加了详细注释**,帮助你理解代码每一行的作用和逻辑。该代码用于生成 **1 秒的 LINK 4A 标准 BPSK 调制 IQ 数据**,并将其保存为 CSV 文件。 --- ```cpp #include <iostream> // 标准输入输出流,用于控制台输入输出 #include <fstream> // 文件操作,用于将生成的数据写入文件 #include <vector> // 动态数组,用于存储 IQ 样本 #include <cmath> // 数学函数,如 cos、sin、PI 等 #include <random> // 随机数库,用于生成随机比特流和噪声 // 定义 π 常量,用于三角函数计算 const double PI = 3.14159265358979323846; // LINK 4A 参数 const int SAMPLE_RATE = 48000; // 采样率 48kHz const double BIT_RATE = 5000.0; // 数据速率 5kbps const double BIT_DURATION = 1.0 / BIT_RATE; // 每个比特持续时间(秒)= 0.0002s const double CARRIER_FREQ = 300e6; // 载波频率 300MHz // 定义 IQ 样本结构体,用于存储 I 和 Q 分量 struct IQSample { double I; // 同相分量 double Q; // 正交分量 }; // 函数:生成 BPSK 调制的 IQ 数据 std::vector<IQSample> generateBPSKSignal(const std::vector<bool>& data) { std::vector<IQSample> iqSignal; // 存储生成的 IQ 数据 // 每个比特对应的采样点数 = 采样率 × 比特持续时间 int samplesPerBit = static_cast<int>(SAMPLE_RATE * BIT_DURATION); // 遍历每个比特 for (bool bit : data) { // 根据比特值确定相位:1 → 0°, 0 → 180° double phase = bit ? 0.0 : PI; // 对每个比特生成 samplesPerBit 个采样点 for (int i = 0; i < samplesPerBit; ++i) { // 当前时间 t = 样本总数 / 采样率 double t = static_cast<double>(iqSignal.size()) / SAMPLE_RATE; // BPSK 调制:s(t) = cos(2πf_c t + φ) double I = cos(2 * PI * CARRIER_FREQ * t + phase); double Q = sin(2 * PI * CARRIER_FREQ * t + phase); // 将当前时刻的 I 和 Q 存入 IQ 样本 iqSignal.push_back({ I, Q }); } } return iqSignal; } // 函数:添加高斯白噪声(AWGN) std::vector<IQSample> addAWGNNoise(const std::vector<IQSample>& iqSignal, double noise_std /* 噪声标准差 */) { std::vector<IQSample> noisyIQ; std::default_random_engine generator; // 随机数引擎 std::normal_distribution<double> distribution(0.0, noise_std); // 均值为0,标准差为noise_std for (const auto& sample : iqSignal) { double noise_I = distribution(generator); // I 分量噪声 double noise_Q = distribution(generator); // Q 分量噪声 noisyIQ.push_back({ sample.I + noise_I, // 添加噪声后的 I sample.Q + noise_Q // 添加噪声后的 Q }); } return noisyIQ; } // 函数:将 IQ 数据归一化到 [0, 65535] 范围 std::vector<std::pair<unsigned short, unsigned short>> normalizeIQ( const std::vector<IQSample>& iqSignal) { std::vector<std::pair<unsigned short, unsigned short>> normalizedIQ; for (const auto& sample : iqSignal) { // 归一化公式:(value + 1.0) / 2.0 * 65535 unsigned short I_norm = static_cast<unsigned short>( (sample.I + 1.0) / 2.0 * 65535 ); unsigned short Q_norm = static_cast<unsigned short>( (sample.Q + 1.0) / 2.0 * 65535 ); normalizedIQ.emplace_back(I_norm, Q_norm); } return normalizedIQ; } // 函数:将归一化后的 IQ 数据保存为 CSV 文件(逗分隔值,方便 Excel 打开) void saveNormalizedIQToFile( const std::vector<std::pair<unsigned short, unsigned short>>& iqSignal, const std::string& filename) { // 打开文件输出流 std::ofstream file(filename); // 检查是否打开成功 if (!file) { std::cerr << "无法打开文件:" << filename << std::endl; return; } // 写入 CSV 文件的表头(可选) file << "I,Q" << std::endl; // 遍历归一化后的 IQ 数据并写入文件,使用逗分隔 for (const auto& sample : iqSignal) { file << sample.first << "," << sample.second << std::endl; } // 关闭文件 file.close(); // 输出提示信息 std::cout << "归一化后的 LINK 4A IQ CSV 数据已保存至文件:" << filename << std::endl; } // 随机生成比特流 std::vector<bool> generateBinaryData(int bitCount) { std::vector<bool> data; std::default_random_engine generator; std::bernoulli_distribution distribution(0.5); // 50%概率生成0或1 for (int i = 0; i < bitCount; ++i) { data.push_back(distribution(generator)); } return data; } int main() { // 生成 1 秒的比特流(5000 个比特) std::vector<bool> BINARY_DATA = generateBinaryData(static_cast<int>(BIT_RATE)); // 生成原始 BPSK IQ 数据 std::vector<IQSample> iqSignal = generateBPSKSignal(BINARY_DATA); // 添加高斯白噪声 std::vector<IQSample> noisyIQ = addAWGNNoise(iqSignal, 0.1); // 噪声标准差设为 0.1 // 归一化 IQ 数据到 [0, 65535] auto normalizedIQ = normalizeIQ(noisyIQ); // 保存归一化后的 IQ 数据到文件 saveNormalizedIQToFile(normalizedIQ, "noisy_normalized_link4a_iq_data_1s.csv"); // 输出提示信息 std::cout << "已生成1秒的LINK 4A IQ信数据(5000个比特)" << std::endl; // 程序正常退出 return 0; } ``` --- ## ✅ 总结说明 | 行号 | 说明 | |------|------| | `#include` | 引入标准库头文件 | | `const double PI` | 定义 π 常量,用于载波相位计算 | | `const int SAMPLE_RATE` | 设置采样率 | | `const double BIT_RATE` | 设置比特率 | | `const double BIT_DURATION` | 比特持续时间 = 1 / BIT_RATE | | `struct IQSample` | 定义 IQ 数据结构 | | `generateBPSKSignal()` | 根据比特流生成 BPSK 调制 IQ 数据 | | `addAWGNNoise()` | 添加高斯白噪声 | | `normalizeIQ()` | 将 IQ 数据归一化为 16 位无符整数 | | `saveNormalizedIQToFile()` | 将归一化数据保存为 CSV 文件 | | `generateBinaryData()` | 随机生成比特流 | | `main()` | 主函数,生成 1 秒的 IQ 数据并保存 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值