生成一段C++代码,它可以完成以下要求:1.发射端ASK调制及根升余弦2.画出接收端的眼图
时间: 2024-03-12 09:43:56 浏览: 20
以下是一段C++代码,可以完成你的要求:
```c++
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
const double pi = 3.14159265358979323846;
// 定义根升余弦函数
double rc(double t, double alpha, double Tb)
{
if (t == 0)
return (1 - alpha + 4 * alpha / pi);
else if (abs(t) == Tb / (4 * alpha))
return alpha / sqrt(2) * ((1 + 2 / pi) * sin(pi / (4 * alpha)) + (1 - 2 / pi) * cos(pi / (4 * alpha)));
else
return (sin(pi * t / Tb * (1 - alpha)) + 4 * alpha * t / Tb * cos(pi * t / Tb * (1 + alpha))) / (pi * t / Tb * (1 - (4 * alpha * t / Tb) * (4 * alpha * t / Tb)));
}
// 定义ASK调制函数
vector<int> ask(vector<int> data, double fc, double Tb, double alpha, double fs, double t)
{
int N = data.size();
vector<int> signal;
signal.reserve(fs * N);
for (int i = 0; i < N; i++)
{
double t_start = i * Tb;
double t_end = (i + 1) * Tb;
double s = data[i] == 1 ? 1 : -1;
for (double j = t_start; j < t_end; j += 1 / fs)
{
double x = s * sin(2 * pi * fc * j) * rc(j - t_start - Tb / 2, alpha, Tb);
signal.push_back(round(x * 10000));
}
}
return signal;
}
// 定义绘制眼图函数
void plot_eye(vector<int> signal, double fs, double Tb)
{
int N = signal.size();
int M = round(Tb * fs);
int K = N / M;
int L = M * 10;
vector<int> eye;
eye.reserve(K * L);
for (int i = 0; i < K; i++)
{
for (int j = 0; j < L; j++)
{
int idx = i * M + j;
if (idx < N)
eye.push_back(signal[idx]);
else
eye.push_back(0);
}
}
for (int i = L - 1; i >= 0; i--)
{
for (int j = 0; j < K; j++)
{
int idx = j * L + i;
if (eye[idx] > 0)
cout << "*";
else if (eye[idx] < 0)
cout << ".";
else
cout << " ";
}
cout << endl;
}
}
int main()
{
// 模拟生成随机数据
vector<int> data = {1, 0, 1, 1, 0, 0, 1, 0, 1, 0};
double fc = 10e6; // 载波频率
double Tb = 1e-6; // 符号周期
double alpha = 0.5; // 带宽因子
double fs = 50e6; // 采样频率
double t = 0; // 时间变量
// 进行ASK调制
vector<int> signal = ask(data, fc, Tb, alpha, fs, t);
// 绘制眼图
plot_eye(signal, fs, Tb);
return 0;
}
```
这段代码实现了以下功能:
1. 生成随机数据(1s和0s的序列);
2. 对数据进行ASK调制,并使用根升余弦滤波器;
3. 将ASK调制后的信号绘制成眼图。
其中,根升余弦函数的表达式为:
$$
h(t)=\left\{\begin{aligned} &\frac{1-\alpha+4\alpha/\pi}{T_b}, &t=0 \\ &\frac{\alpha}{\sqrt{2}T_b}\left[(1+2/\pi)\sin(\pi/4\alpha)+(1-2/\pi)\cos(\pi/4\alpha)\right], &|t|=T_b/4\alpha\\ &\frac{1}{T_b}\frac{\sin[\pi t/T_b(1-\alpha)]+4\alpha t/T_b\cos[\pi t/T_b(1+\alpha)]}{\pi t/T_b[1-(4\alpha t/T_b)^2]}, &\text{otherwise} \end{aligned}\right.
$$
绘制眼图的方法是将序列划分成若干个符号周期,并将每个符号周期内的采样点按照时间排序,然后绘制每个时间点的值。由于眼图是从下往上绘制的,所以代码中是从后往前遍历时间点,从下往上绘制。