%黄俊汐 S170131190
%定义变量
N=10000; %消息位数
Fs=4000000; %采样率
SNR=15; %信噪比
T=1/1000000; %符号持续时间
Rs=1/T; %符号率
alfa=0.35; %升余弦滚降因子
R=Fs*T; %过采样因子
t=-5*T:1/Fs:5*T; %采样间隔
t=t+1e-10;
%产生N个随机比特并映射为16-QAM
Q=randi([0 1],N,1); %产生N bit的2进制随机序列
send=bi2de(flipud(reshape(Q,4,N/4))'); %将发送信号由二进制转换为10进制
qam=qammod(send,16); %产生16-QAM信号
Iqam=real(qam); %QAM实部
Qqam=imag(qam); %QAM虚部
%16-QAM星座图映射图
figure(1);
plot(Iqam,Qqam,'o');
axis([-4 4 -4 4]);
title('16-QAM星座图');
xlabel('I');ylabel('Q');
grid on;
qam_tx=zeros(size(1:R*length(qam)));
qam_tx(1:R:R*length(qam))=qam; %QAM信号补零,防止干扰
Iqam_tx=real(qam_tx);
Qqam_tx=imag(qam_tx);
% 发射机 %
%发送滤波器
p=rcosine(Rs,Fs,'sqrt',alfa); %升余弦成型滤波器
De_tx=(length(p)-1)/2; %计算发送滤波器的延迟
De_tx=round(De_tx); %取整
tx_zero=zeros(size(1:De_tx));
Iqam_tx=[Iqam_tx tx_zero]; %向qam信号中添0,防止干扰
Qqam_tx=[Qqam_tx tx_zero];
Iqam_tx=filter(p,1,Iqam_tx); %信号经过发送滤波器
Qqam_tx=filter(p,1,Qqam_tx); %信号经过发送滤波器
I_tx=Iqam_tx(1+De_tx:end); %去除之前添加的0,取出有用信号。
Q_tx=Qqam_tx(1+De_tx:end);
tx=I_tx+1i*Q_tx;
%16-QAM通过发送滤波器后的星座图
figure(2);
plot(tx,'o');
title('16-QAM通过发送滤波器后的星座');
xlabel('I');ylabel('Q');
grid on;
%信号通过发送滤波器后的眼图
figure(3);
hold on;
for i=(5*R+1):2*R:R*length(qam)-2*R
plot(I_tx(i:i+2*R));
end
hold off;
title('信号通过发送滤波器后的眼图');
xlabel('Time');ylabel('振幅');
%%原始信号和发送滤波器的频谱
figure(4);
f=-Fs/2:Fs/2; %要求正负半轴的频谱都有
Fa_qam=abs(freqz(qam,1,f,Fs));
Fa_filter=abs(freqz(p,1,f,Fs));
plot(f,20*log10(Fa_qam),f,20*log10(Fa_filter),'r');
title('原始信号和发送滤波器频谱');
xlabel('f');ylabel('A(dB)');
grid on;
%%信号通过发送滤波器后的频谱
Fa_pin=abs(freqz(tx,1,f,Fs));
figure(5);
plot(f,20*log10(Fa_pin));
title('信号通过滤波器后的频谱');
xlabel('f');ylabel('A(dB)');
grid on;
% 信道 %
[b,a]=butter(3,0.24); %3阶巴特沃斯滤波器
%%信号经过信道
De_channel=(length(b)-1)/2; %计算信道延时
De_channel=round(De_channel);
channel_zero=zeros(size(1:De_channel));
aa=I_tx; %防止在循环过程中改变I_tx1的值
bb=Q_tx;
I_tx1=[aa channel_zero];
Q_tx1=[bb channel_zero];
I_channel=filter(b,a,I_tx1); %信号经过信道滤波器
Q_channel=filter(b,a,Q_tx1); %信号经过信道滤波器
I_channel=I_channel(1+De_channel:end);
Q_channel=Q_channel(1+De_channel:end);
Signal_channel=I_channel+1i*Q_channel;
f=-Fs/4:Fs/4;
Signal_channel=abs(freqz(Signal_channel,1,f,Fs));
figure(6)
plot(f,20*log10(Signal_channel));
xlabel('f');ylabel('A(dB)');
title('信号经过信道后的频谱');
grid on;
I_channel=awgn(I_channel,SNR); %加高斯白噪声
Q_channel=awgn(Q_channel,SNR);
qam_channel=I_channel+1i*Q_channel;
%画信号经过信道加白噪声后的频谱
f=-Fs/4:Fs/4; %设置频率范围
fa_channel=abs(freqz(qam_channel,1,f,Fs));
figure(7);
plot(f,20*log10(fa_channel)); %采用对数坐标
xlabel('f');ylabel('A(dB)');
title('信号经过信道加白噪声后的频谱');
grid on;
%接收机%
de_rx=(length(p)-1)/2; %计算发送滤波器的延迟
de_rx=round(de_rx); %取整
rx_zero=zeros(size(1:de_rx));
Iqam_rx=[I_channel rx_zero]; %向qam信号中添0,防止干扰
Qqam_rx=[Q_channel rx_zero];
Iqam_rx=filter(p,1,Iqam_rx); %信号经过发送滤波器
Qqam_rx=filter(p,1,Qqam_rx); %信号经过发送滤波器
Iqam_rx=Iqam_rx(1+de_rx:end);
Qqam_rx=Qqam_rx(1+de_rx:end);
%信号通过接受滤波器后的眼图
figure(8);
hold on;
for i=(length(p)+1)/2:R*2:N-R*2
plot(Iqam_rx(i:i+R*2));
end;
hold off;
title('信号通过接受滤波器后的眼图');
xlabel('Time');ylabel('振幅');
%进行重采样%
Impulse = [1 zeros(1,100)]; % 初始化响应.
TxImpOut = filter(p,1,Impulse); % 计算发送滤波器的响应
ChannelImpOut = filter(b,a,TxImpOut); % 计算信道的响应
RxImpOut = filter(p,1,ChannelImpOut); % 计算接收滤波器的响应
[Trash,Pos] = max(abs(RxImpOut)); % Find the maximum value and its position, now the position is
% the delay. Start resampling of the filtered received signal from
RxSampOut_I = Iqam_rx(1:R:end);
RxSampOut_Q = Qqam_rx(1:R:end);
RxSampOut=RxSampOut_I+1i*RxSampOut_Q; % the position Pos. In the actual resampling, use, of course,
% your own received signal variable (called RxFiltOut here).
%采样后的星座图%
figure(9);
plot(RxSampOut,'o');
axis([-4 4 -4 4]);
title('采样后信号星座映射');
xlabel('I');ylabel('Q');
grid on;
%%%%%%%%%%%均衡%%%%%%%%%%%%
beta=0.01; % 步长
c=zeros(size(1:31))'; %均衡系数的初始化
for i=Pos:2450
rk=flipud( RxSampOut_I(i:i+30)'); %Received signal vector
Ek(i)=Iqam(i+15)-c'*rk; %Error signal
c=c+beta*Ek(i)*rk;
end
de_c=(length(c)-1)/2; %均衡器延迟
de_c=round(de_c);
temp_zero=zeros(size(1:de_c));
RxSampOut_I=[RxSampOut_I temp_zero];
RxSampOut_Q=[RxSampOut_Q temp_zero];
RxSampOut_I=filter(c,1,RxSampOut_I); %信号通过均衡器
RxSampOut_Q=filter(c,1,RxSampOut_Q); %信号通过均衡器
RxSampOut_I=RxSampOut_I(1+de_c:end);
RxSampOut_Q=RxSampOut_Q(1+de_c:end);
RxSampOut=RxSampOut_I+1i*RxSampOut_Q;
%%信号通过均衡器后的星座映射图
figure(10);
plot(RxSampOut_I,RxSampOut_Q,'*');
axis([-4 4 -4 4]);
title('信号通过均衡器后的星座映射');
xlabel('I');ylabel('Q');
grid on;
%%%%%%%%%%解码%%%%%%%%%%%
rcv = qamdemod(RxSampOut,16); %对接收的信号进行解调
%%%%%误码率和误码数的计算%%%%%%
[Err_num,Err_ratio] = biterr(rcv,send'); %计算误码数和误码率
foff1(1,u)=Err_ratio; %用来存放误码率的矩阵
u=u+1;
end;
semilogy(foff,foff1);
title('BER曲线');
xlabel('截止频率');ylabel('误码率');
grid on;