实操BPSK载波调制解调笔记(matlab)

BPSK调制

信源和参数设置

按照实验所需合理设置比特率、每个符号采样点数和载波频率等各个参数值。注意此处参数设置会影响后续滤波器的设计。

% 参数设置
bit_rate = 10e7; % 比特率
sample = 20; % 每个符号采样点数
fc = 2*10e7; % 载波频率 200Mhz
fs = bit_rate * sample; % 采样率 = 比特率*每个符号采样点数 2Ghz
source_length = 446; % 发送信号长度  
rollof_factor = 0.5; % 滚降因子

信源为随机生成的二进制序列。

% 信源
source = randi([0 1],1,source_length);

在这里插入图片描述
在这里插入图片描述

通常会在传输的数据流中添加标志性帧头,有多方面的好处:
作用1. 可用于同步接收端的时钟与发送端的时钟同步(有利于去时延的操作)。作用2. 标志性帧头可以明确地标识出每个数据帧的开始,有助于接收端正确地区分不同数据帧,以便后续的解码和处理等(本实验未用到)。
作用3. 包含冗余信息的标志性帧头可以用于错误检测和纠正,提高系统的可靠性。
作用4. 方便调试,通过查看帧头信息可以验证系统的正常运行,检测问题,并进行故障排除。

% 给出标志性帧头,方便调试
frame_pre = ones(1,32); % 用于捕获和同步
frame_begin = [0 1 1 1 1 1 1 0]; % 帧开始的标志
frame_head = [frame_pre frame_begin]; % 帧数据
frame_end = [0 1 1 1 1 1 1 0]; % 帧结束的标志
frame_msg = [frame_head source frame_end]; % 组帧

将随机二进制序列转化为BPSK的双极性信号(-1或1).

% 发射机
bipolar_msg_source = 2 * frame_msg - 1; % 双极性信号(-1/1)
figure;
plot(bipolar_msg_source);
title('时域波形');
plot(abs(fft(bipolar_msg_source)));
title('频域波形');

上采样

上采样即信号插值,即在原序列x(n)的两点之间插入L个0,等效于其在频域上做了频谱压缩。数据内插补零后,其贡献为零,因此傅里叶频谱形态只是更加细致。

% 上采样 
bipolar_msg_source_temp = [bipolar_msg_source',zeros(size(bipolar_msg_source,2),sample-1)]; % size(A, 2)返回A列数
length_x = size(bipolar_msg_source_temp,1);
length_y = size(bipolar_msg_source_temp,2);
up16_bipolar_msg_source = reshape(bipolar_msg_source_temp',1,length_x*length_y); % 结果就是在每个信号之间插零15个(sample = 16)
figure;
plot(up16_bipolar_msg_source);
title('上采样时域波形');
plot(abs(fft(up16_bipolar_msg_source)));
title('上采样频域波形');

在这里插入图片描述
在这里插入图片描述

成型滤波器

理论上的低通滤波器是无法实现的,成型滤波器的存在可以:
作用1. 改变传输信号的成形波形,可以减小抽样定时脉冲误差所带来的影响,即降低了码间干扰(ISI),保证采样点不失真。减缓信号的边缘变化,通过波形塑造平滑信号,降低快速变化的频率分量,从而减小了码间串扰的可能性。这有助于确保信号在传输过程中保持良好的形状,减少了接收端的识别和解码难度。
作用2. 频谱压缩,限制信号带宽,因此成型滤波器也叫限带滤波器。基带信号是矩形脉冲,突变的上升沿和下降沿包含高频分量丰富,其频谱范围普遍比较宽(频谱是一个Sa函数)。带宽无限,需要限制带宽。为了有效利用信道,在信号传输之前,需要对信号进行频谱压缩。使其在消除码间串扰和达到最佳检测的前提下,大大提高频带利用率。信号带宽匹配信道带宽。

% 滤波器
% 成型滤波器:
rcos_fir = rcosdesign(rollof_factor,6,sample);
% fvtool(rcos_fir,'Analysis','impulse'); % 将脉冲响应可视化
rcos_msg_source = conv(up16_bipolar_msg_source,rcos_fir); % 采用滚降滤波器进行滤波
filter_delay1 = (length(rcos_fir) - 1)/2; % 滚降滤波器的延迟时长
figure;
plot(rcos_msg_source(1:1024));
title('通过成型滤波器的时域波形');
plot(abs(fft(rcos_msg_source)));
title('通过成型滤波器的频域波形');

在这里插入图片描述
在这里插入图片描述

载波调制

相干解调,信号被分为高频成分和基带信号。

% 调制
% 载波发送
time = 1:length(rcos_msg_source);
rcos_msg_source_carrier = rcos_msg_source.*cos(2*pi*fc.*time/fs);
figure;
plot(rcos_msg_source_carrier(1:1024));
title('载波调制时域波形');
plot(abs(fft(rcos_msg_source_carrier)));
title('载波调制频域波形');

在这里插入图片描述
在这里插入图片描述

输出CSV文件

将完成BPSK载波调制的信号保存至文件夹。只保存信号值列,因为AWG(任意波形发生器,Arbitrary Waveform Generator)只能读取一列信号数据。

%输出CSV文件
output_path = 'D:\All_Codes\matlab\BPSK\'; %文件保存路径
output_file = 'bpsk_modulated.csv'; %定义文件名
full_output_file = fullfile(output_path, output_file); %完整的文件路径
data_to_save = [rcos_msg_source_carrier']; % 信号值列
csvwrite(full_output_file, data_to_save);
disp(['BPSK调制信号已保存到文件: ' full_output_file]);

在这里插入图片描述

数据采集

将保存的csv输入示波器(本实验采用u盘输入的方式,如果使用IP的方式会更方便简洁)。

信号,AWG和示波器的设置

AWG注意采样率和重复率的设置;示波器注意采样率的设置。
AWG重复率的定义是,一秒内重复输出多少次该波形,
采样率是指一秒内的采样点数。因此关系是,一个波形的点数(csv可以看出有多少个点,由参数设置也可以计算出来)* 重复率 = 采样率。假如信号采样频率是fs,建议AWG的采样率也是fs。
示波器的采样率建议和AWG一致。

*仿真模拟

在实操之前,建议先用仿真信道(AWGN)测试代码的可行性。

% % 过信道,收集示波器数据
% % 设置信噪比
% ebn0 = -8;
% snr = ebn0 - 10*log10(0.5*16);
% % 线性高斯白噪声信道
% rcos_msg_source_carrier_addnoise = awgn(rcos_msg_source_carrier,snr,'measured');
% rcos_msg_source_carrier_addnoise = [1 0 1 0 1 1 0 0, rcos_msg_source_carrier_addnoise, 0 0 1 0 0 1 1];
% time = time_cut;
% % 波形观察
% % figure;
% % plot(rcos_msg_source_carrier_addnoise);
% % title('时域波形');
% % figure;
% % plot(abs(fft(rcos_msg_source_carrier_addnoise)));
% % title('频域波形');
% receive_signal = rcos_msg_source_carrier_addnoise;

BPSK解调

读取CSV数据

U盘从示波器采集数据,保存为csv文件。matlab读取该数据。

% 读取CSV数据
data = csvread('D:\All_Codes\matlab\BPSK\from_scope.csv'); %读取数据文件路径
time = data(:,1); %从CSV数据中读取时间和信号值
receive_signal = data(:,2);

互相关去时延并修剪信号

由于经过AWG和示波器之后的信号有时延,并且长度是原信号的几个周期之长(长度和示波器设置的收集时间范围有关,可以计算得到,时间长度不低于信号的2个周期为好,建议多收集一些,互相关后的准确性更高),通过互相关函数计算并去除时延。

% 接收机
% 互相关去时延
[corr, lag] = xcorr(receive_signal',rcos_msg_source_carrier');
[~,idx] = max(corr);
delay_samples = lag(idx);
disp(['经过信道产生的时延为', num2str(delay_samples)]);

%修剪信号
receive_signal_cut = receive_signal(delay_samples+1:delay_samples+length(rcos_msg_source_carrier)); %修剪误码率最低的接收信号
time_cut = time(delay_samples+1:delay_samples+length(rcos_msg_source_carrier));
[corr, lag] = xcorr(receive_signal_cut',rcos_msg_source_carrier');
[~,idx] = max(corr);
delay_cut = lag(idx);
disp(['经过信道产生的时延为', num2str(delay_cut)]);

在这里插入图片描述

相干解调

相乘得到基带部分和高频成分。

% 相干解调
receive_signal_cut = receive_signal_cut.*cos(2*pi*fc.*time_cut/fs);
% figure;
% plot(receive_signal_cut);
% title('相干解调时域波形');
% plot(abs(fft(receive_signal_cut)));
% title('相干解调频域波形');

低通滤波

低通滤波去除高频成分,保留基带部分。

% 低通滤波
fir_lp =fir1(128,0.2); % 截止频率为0.2*(fs/2),使用汉明窗设计一个128阶低通带线性相位的FIR滤波器
rcos_msg_source_1p = conv(fir_lp,receive_signal_cut);
filter_delay2 = (length(fir_lp)-1)/2;  %低通滤波器的延迟时长,延迟64个采样点输出
figure;
plot(rcos_msg_source_1p);
title('低通滤波后时域波形');
plot(abs(fft(rcos_msg_source_1p)));
title('低通滤波后频域波形');
rcos_msg_source_MF = rcos_msg_source_1p;

在这里插入图片描述
在这里插入图片描述

下采样

信号抽取,即在原序列x(n),每隔M个点抽取一个点,等效其在频域做了频谱扩展,在同一数字通信系统中上采样的L和下采样的M是相等的。上采样和下采样是一个逆过程。

% 下采样
decision_site = filter_delay1+filter_delay2; % (96+128+96)/2 = 160 三个滤波器的延迟 96 128 96;外加过信道造成的时延
% 每个符号选取一个点作为判决
rcos_msg_source_MF_option = rcos_msg_source_MF(decision_site+1:sample:end-decision_site); % 涉及到三个滤波器,固含有滤波器延迟累加

信号判决

将信号判决为二进制01数列,从而恢复二进制信号。

% 判决
msg_source_MF_option_sign= sign(rcos_msg_source_MF_option);
figure;
plot(msg_source_MF_option_sign, '-*');
title('判决结果');
% 波形观察
eyediagram(rcos_msg_source,sample);
title('发射端眼图');
eyediagram(rcos_msg_source_MF,sample);
title('接收端眼图');
scatterplot(rcos_msg_source(48+1:16:end-48));
title('BPSK星座图');

在这里插入图片描述

误码率分析

将原始信号和解调后的信号进行误码率分析。

% 信号分析
% 误码率
[err_number,bit_err_ratio]=biterr(frame_msg',(msg_source_MF_option_sign+1)/2);
disp(['误码率(BER):', num2str(bit_err_ratio)]);
figure;
plot(frame_msg, 'b');
hold on;
plot((msg_source_MF_option_sign+1)/2, 'r');
xlabel('比特序号');
ylabel('信号值');
legend('原信号', '解调信号');
title('原信号和解调信号比较');
grid on;

在这里插入图片描述

后记

  • 建议每一步都绘制信号时域和频域图,有利于监测信号的情况,一旦出现错误,可以通过波形图或者频谱图快速定位出现问题的环节。
  • 由于相关去时延已经做了匹配滤波类似的操作,因此不需要再做一遍匹配滤波了。

参考链接:
BPSK调制解调
数字频带传输—BPSK.
信号之间的时延估计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值