最近学习载波和符号同步,陆续做了些实验,针对每次实验的问题做做总结。
(一)仿真理想同步下QAM信号的传输,并统计误码率
clear;
% 产生随机信号,16QAM调制,过根升余弦得到发送信号,上变频,过接收滤波器,下变频,解调得到星座图
%% 参数设置
Symbol_Len = 100 * 10^3; % 生成符号数
RB = 10 * 10^3; % 符号速率
f = 400 * 10^3; % 采样速率
fc = 100 * 10^3; % 载波频率
nsamp = f / RB; % 每符号采样点数
len_point = nsamp * Symbol_Len; % 总采样点
%% 调制
Ms = 16;
Symbol_Ori = randi([0 Ms-1], 1, Symbol_Len); % 原始生成符号
Signal = qammod(Symbol_Ori, Ms); % 调制
% scatterplot(Signal)
% 产生根升余弦滤波器
alpha = 0.5; % 滚降系数
span = 20; % 滤波器占符号个数, span*nsamp 为滤波器总长度
h = rcosdesign(alpha, span, nsamp, 'sqrt'); % 产生根升余弦滤波器
% 正交调制
Signal_upsample_I = upsample(real(Signal), nsamp); % 正交调制,分IQ两路,上采样目的是为了与采样频率统一
SendSignal_I = conv(Signal_upsample_I, h); Signal_upsample_Q = upsample(imag(Signal), nsamp);
SendSignal_Q = conv(Signal_upsample_Q, h);% 观察基带信号
% pwelch(SendSignal_I + SendSignal_Q) % 大致信号带宽 5k
B = 5 * 10^3;%% 上变频
SendSignal_I_Up = SendSignal_I .* cos(2 * pi * fc * (0:length(SendSignal_I)-1) / f);
SendSignal_Q_Up = SendSignal_Q .* (-sin(2 * pi * fc * (0:length(SendSignal_Q)-1) / f));
SendSignal_Up = SendSignal_I_Up + SendSignal_Q_Up;
% pwelch(SendSignal_Up)%% 过awgn信道并接收
% SNR = (Eb/n0) * (Rb/B)
% = Eb/n0 + 10*log10(log2(Ms)) - 10*log10(nsamp); % 根据数字通信系统中 Eb/N0 与 SNR 转换方法的研究
EbN0 = 0:2:16;
% EbN0 = 30:2:40;
% 理论误比特率和误码率
% [ber, ser] = berawgn(EbN0, 'psk', Ms, 'nondiff');
[ber, ser] = berawgn(EbN0, 'qam', Ms);phase_est = zeros(1, length(EbN0));
for i = 1:length(EbN0)
% SNR = EbN0(i) + 10 * log10(RB * log2(Ms)) - 10 * log10(f/2);
SNR = EbN0(i) + 10 * log10(log2(Ms)) - 10 * log10(nsamp*0.5);
SendSignal_PassAwgn = awgn(SendSignal_Up, SNR, 'measured'); % 接收过带通滤波器
Hbandpassfilter = BandPassFilter; % 导入带通滤波器
Hbandpass = Hbandpassfilter.Numerator;ReceiveSignal = conv(SendSignal_PassAwgn, Hbandpass, 'same'); % 接收信号过带通滤波
% pwelch(ReceiveSignal)
% 下变频
ReceiveSignal_I_Down = 2 * ReceiveSignal .* cos(2 * pi * fc * (0:length(SendSignal_I)-1) / f);
ReceiveSignal_Q_Down = 2 * ReceiveSignal .* (-sin(2 * pi * fc * (0:length(SendSignal_Q)-1) / f));% 匹配滤波
Baseband_I = conv(ReceiveSignal_I_Down, h);
Baseband_Q = conv(ReceiveSignal_Q_Down, h);BasebandSignal = complex(Baseband_I, Baseband_Q);symb_soft = BasebandSignal(1 + span * nsamp: nsamp :end - span * nsamp); % 定时补偿后抽样
Symbol_ = qamdemod(symb_soft, Ms); % 判决[RBerr(i), RBrat(i)] = symerr(Symbol_Ori,Symbol_);
[Biterr(i), Bitrat(i)] = biterr(Symbol_Ori,Symbol_);
endber_num = round(ber * Symbol_Len * log2(Ms)); % 理论错误点数
ser_num = round(ser * Symbol_Len); % 理论错误符号数
%% 画统计误码率跟实际误码率
% figure
% % 理论误码率
% semilogy(EbN0, ser,'-*');hold on;
% % 实际误码率
% semilogy(EbN0, RBrat, '-o');
% legend('理论误码率','实际误码率')
% % xticklabels({'0','2','4','6','8','10','12','14','16'})
% xlabel('EbN0(dB)');
% ylabel('误码率SER');
% title('16QAM')
% % semilogy(RBrat - ser);figure
semilogy(EbN0, ber,'-*');hold on;
% 实际比特率
semilogy(EbN0, Bitrat, '-o');
legend('理论误比特率','实际误比特率')
% xticklabels({'0','2','4','6','8','10','12','14','16'})
xlabel('EbN0(dB)');
ylabel('误比特率BER');
title('16QAM')
function Hd = BandPassFilter
%BANDPASSFILTER 返回离散时间滤波器对象。% MATLAB Code
% Generated by MATLAB(R) 9.9 and DSP System Toolbox 9.11.
% Generated on: 25-Oct-2022 20:33:05% Equiripple Bandpass filter designed using the FIRPM function.% All frequency values are in kHz.
Fs = 400; % Sampling FrequencyFstop1 = 90; % First Stopband Frequency
Fpass1 = 95; % First Passband Frequency
Fpass2 = 105; % Second Passband Frequency
Fstop2 = 110; % Second Stopband Frequency
Dstop1 = 0.1; % First Stopband Attenuation
Dpass = 0.00057564620966; % Passband Ripple
Dstop2 = 0.1; % Second Stopband Attenuation
dens = 23; % Density Factor% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 1 ...0], [Dstop1 Dpass Dstop2]);% Calculate the coefficients using the FIRPM function.
b = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);% [EOF]
本文发布于:2024-02-02 03:57:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681769641203.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |