2021-08-26

该博客详细展示了数字信号处理的过程,包括NRZ数据生成、QAM调制、上采样、加噪声、匹配滤波解调等步骤,并通过星座图分析了信号质量。最终计算了误码率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

clc;
clear;
close all;

%信号参数
M = 4;                             %码元符号表示的进制数
k = log2(M);                  %码元符号表示的信息量(bit)
n = 2048;                      %要处理的比特流数量
sym = n/k;                    %码元数;符号率
Rb = 1e6;                     %比特率
Rs = Rb/k;                    %码元速率
Fs = 32e6;                    %采样速率
Ts = 1/Fs;                      %采样时间间隔
fc = 1e6;                       %载波

% 整形滤波参数
beta = 0.25;
span = 10;
rrc_sps = 4;
rrcfilter = rcosdesign(beta,span,rrc_sps);

% 中频上采样
if_sps = 4;
lpfilt = designfilt('lowpassfir', 'PassbandFrequency', .25, 'StopbandFrequency', .40, 'PassbandRipple', 0.5, 'StopbandAttenuation', 65, 'DesignMethod', 'kaiserwin');

%产生信源
data = randi([0 1],1,n);
data1 = 2*data-1;                       %generate NRZ
data_1 = data1(1:2:end);
data_2 = data1(2:2:end);

msg = ones(size(data_1));
for i = 1:length(data_1)
    if(data_1(i) == 1 && data_2(i) == 1)
        msg(i) =3;
    end
    if(data_1(i) == -1 && data_2(i) == 1)
        msg(i) =1;
    end
    if(data_1(i) == -1 && data_2(i) == -1)
        msg(i) = 0;
    end
    if(data_1(i) == 1 && data_2(i)== -1)
        msg(i) =2;
    end
end

data_modull = complex(data_1 ,data_2);

% 成形滤波
bb_data = upfirdn(data_modull,rrcfilter,rrc_sps);
%scatterplot(bb_data);

%调制
%t = linspace(0,Ts*(length(bb_data)-1));
t = (0:Ts:Ts*(length(bb_data)-1));
si = sin(2 * pi * fc * t);
sq = cos(2 * pi * fc * t);
si_data = si.* bb_data;         
sq_data = sq.* bb_data;  

%上采样
resi_data = resample(si_data,if_sps,1);
firresi_data = filter(lpfilt,resi_data);
resq_data = resample(sq_data,if_sps,1);
firresq_data = filter(lpfilt,resq_data);

%随意加的热噪声
s_data  = firresi_data + firresq_data;
r_bb_data  = s_data + randn(size(s_data)) * 0.01;

% s_data  = si_data + sq_data;
% r_bb_data  = s_data + randn(size(s_data)) * 0.01;

%下采样
res_data1 = resample(r_bb_data,1,if_sps);
firres_data1 = filter(lpfilt,res_data1);

%解调
t = linspace(0,Ts*(length(firres_data1)-1));
t = (0:Ts:Ts*(length(firres_data1)-1));
si1 = sin(2 * pi * fc * t);
sq1 = cos(2 * pi * fc * t);
r_si_data = si1.* firres_data1;
r_sq_data = sq1.* firres_data1;  
r_data = r_si_data + r_sq_data;

% t = (0:Ts:Ts*(length(r_bb_data)-1));
% si1 = sin(2 * pi * fc * t);
% sq1 = cos(2 * pi * fc * t);
% r_si_data = si1.* r_bb_data;
% r_sq_data = sq1.* r_bb_data;  
% r_data = r_sq_data + r_sq_data;

% 匹配滤波
bb_rx_data = upfirdn(r_data,rrcfilter,1,rrc_sps);
scatterplot(bb_rx_data),title('匹配滤波后星座图');
rx_data = qamdemod(bb_rx_data,4);

%计算误比特数
err=length(find(msg~=rx_data(1,sym)));%计算解调信号中错误码元个数
BER_test=err/(sym);%计算误码率
%画图
figure()
subplot(211)
stairs(data_1,'r--o');
hold on
stairs(data_2,'b-');
legend('data_1','data_2');
axis([0 130 -2 2]);
subplot(212)
stairs(rx_data);
axis([0 130 -1 4]);
title('bit信息');

%
%scatterplot(data_modull),title('未处理信息的星座图');
%axis([-2 2 -2 2]);
N = length(r_bb_data);
n = -1*N/2:1:N/2-1;
f = Fs/N*(n-1);
qpsk = 10*log10(abs(fftshift(fft(r_bb_data))).^2)-max(10*log10(abs(fftshift(fft(r_bb_data))).^2));
figure(),
plot(f,qpsk),title('信道中信号');
xlabel('frequency'), ylabel('amplitude');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值