课程设计要求:(1)设计基于理想低通以及不同滚降系数的理想滚降数字基带传输系统,理解无码间串扰的时频域条件;(2)画出理想低通以及升余弦系统对应的时频域波形;(3)观察基带信号经过理想低通以及升余弦滤波器前后的波形;(4)对经过基带传输后的信号加入高斯白噪声,利用眼图定性分析噪声对接收信号的影响。
close all;
Ts = 1; % 码元周期
N_sample = 17; % 每个码元抽样点数
eye_num = 8; % 眼图的个数
alpha = 0.6; % 滚降系数,其中为零的时候是理想低通
N_data = 1000; % 码元数
dt = Ts/N_sample; % 抽样时间间隔
df=1.0/(20.0*Ts);%频率间隔
f=-2/Ts:df:2*Ts;%从 -2/Ts 到 2*Ts 的频率范围
t = -3*Ts:dt:3*Ts; % 设置采样
%% 基带升余弦滚降系统函数频谱
for k=1:length(f)
if abs(f(k))>0.5*(1+alpha)/Ts%这个阈值确定了升余弦滤波器的主瓣的宽度。如果频率超过这个阈值,说明该频率的成分将被过滤,其对应的 Xf 设置为零
Xf(1,k)=0;
elseif abs(f(k))<0.5*(1-alpha)/Ts
Xf(1,k)=Ts;%如果频率低于这个阈值,说明该频率的成分将被完全通过,对应的 Xf 设置为采样周期 Ts
else
Xf(1,k)=0.5*Ts*(1+cos(pi*Ts/(alpha+eps)*(abs(f(k))-0.5*(1-alpha)/Ts)));%根据升余弦滤波器的频域表达式来计算频谱
end
end
figure; % 创建新的图形窗口
plot(f,Xf);
axis([-1 1 0 1.2]);
xlabel('f/Ts');
ylabel('升余弦系统的频域波形');
%% 产生双极性数字信号
d = sign(randn(1, N_data)); % randn随机生成数字 sign函数进行一个判断,判断其正负
xt = sigexpand(d, N_sample); % 对d进行扩张,每个间隔加入N_sample-1个零
% 基带系统冲击响应(升余弦)
ht = sinc(t/Ts).*(cos(alpha*pi*t/Ts))./(1-4*alpha^2*t.^2/Ts^2+eps); % 升余弦滚降特性的公式
st = conv(xt, ht); % 卷积函数
tt = -3*Ts:dt:(N_data+3)*N_sample*dt-dt; % 设置采样
%% 绘制基带升余弦滚降系统函数
figure; % 创建新的图形窗口
plot(t, ht);
axis([-2 2 -1.2 1.2]); % 横坐标范围,纵坐标范围
xlabel('t/Ts');
ylabel('升余弦函数');
%% 绘制基带信号
figure; % 创建新的图形窗口
stem(d);
axis([0 20 -1.1 1.1]); % 横坐标范围,纵坐标范围
xlabel('时间');
ylabel('幅度');
hold on;
grid on;
title('双极性NRZ码元序列-扩张前');
%% 绘制扩张后的信号
figure; % 创建新的图形窗口
stem(xt);
axis([0 360 -1.1 1.1]); % 横坐标范围,纵坐标范围
xlabel('时间');
ylabel('幅度');
hold on;
grid on;
title('双极性NRZ码元序列-扩张后');
%% 绘制接收端波形
figure; % 创建新的图形窗口
plot(tt, st);
axis([0 20 -1.2 1.2]); % 横坐标范围,纵坐标范围
xlabel('t/Ts');
ylabel('基带信号');
%% 绘制眼图
figure; % 创建新的图形窗口
ss = zeros(1, eye_num*N_sample); % 建立零矩阵
ttt = 0:dt:eye_num*N_sample*dt-dt; % 采样间隔
for k = 3:50
ss = st(k*N_sample+1:(k+eye_num)*N_sample);
drawnow; % 将还未处理完的图像实时的显示出来,实时看到图像的每一步变化情况
plot(ttt, ss);
hold on; % 新画图像之后不覆盖原图像
end
xlabel('t/Ts');
ylabel('基带信号眼图')
%% 添加高斯白噪声
SNR_dB = 10; % 信噪比(dB)
st_noisy = awgn(st, SNR_dB, 'measured'); % 使用awgn函数添加高斯白噪声
%% 绘制眼图
figure;
ss_noisy = zeros(1, eye_num*N_sample);
ttt_noisy = 0:dt:eye_num*N_sample*dt-dt;
for k = 3:50
ss_noisy = st_noisy(k*N_sample+1:(k+eye_num)*N_sample);
drawnow;
plot(ttt_noisy, ss_noisy);
hold on;
end
xlabel('t/Ts');
ylabel('带噪声的眼图');
title('眼图 - 带噪声');
%% 抽样判决
sample_points = round((3:17:length(st_noisy) - N_sample/2) / N_sample) * N_sample + 1; % 在每个码元的中心位置进行抽样
decisions = (sign(st_noisy(sample_points)) ); % 将符号判决映射为0和1
%% 显示抽样判决结果
figure;
stem(sample_points*dt, decisions, 'ro-', 'LineWidth', 2, 'MarkerFaceColor', 'r');
axis([0 20 -1.5 1.5]);
xlabel('时间');
ylabel('抽样判决结果 ');
title('抽样判决结果');
%% 扩展函数,转换为1维矩阵进行卷积
function [out] = sigexpand(d, M)
N = length(d); % 基带信号码元长度
out = zeros(M, N); % 矩阵M为采样点 N为基带信号码元数量,建立M*N的零矩阵
out(1, :) = d; % 将零矩阵第一行换成基带信号中的8个码元
out = reshape(out, 1, M*N); % 1行 m*n 列
end
欢迎探讨相关问题