qam_16.m
来自「简单的数字传输系统---主要是对16-QAM数字基带传输系统进行仿真」· M 代码 · 共 203 行
M
203 行
clc;close all;
clear; %清除变量
%定义变量
N_bit=10000; %二进制码流的比特数
Fs=3000; %采样率
Fc=500; %信道的截止频率(Hz)
SNR=20; %取值范围为:5-20dB
T=1/1000; %符号持续时间
Rd=1/T; %符号率
alfa=0.25; %升余弦滚降因子
R=Fs*T; %过采样因子
%%%%%%%%%QAM Coder%%%%%%%%%%
bit_source=randint(N_bit,1); %产生10000bit的2进制随机序列
send=bi2de(flipud(reshape(bit_source,4,N_bit/4))');
qam=qammod(send,16); %产生16-QAM信号
Iqam=real(qam);
Qqam=imag(qam);
N=length(qam);
%16-QAM星座图映射图
figure(1);
plot(Iqam,Qqam,'*');
axis([-4 4 -4 4]);
title('16-QAM星座图');
xlabel('I');ylabel('Q');
grid on;
qam_tx=zeros(size(1:R*N));
qam_tx(1:R:R*N)=qam; %QAM信号补零
Iqam_tx=real(qam_tx);
Qqam_tx=imag(qam_tx);
%%%%%%%%%发送%%%%%%%%%%%
%发送滤波器
Pt=rcosine(Rd,Fs,'sqrt',alfa); %升余弦成型滤波器
Delay_tx=(length(Pt)-1)/2; %发送滤波器的延迟
Delay_tx=round(Delay_tx); %取整
tx_zero=zeros(size(1:Delay_tx));
Iqam_tx=[Iqam_tx tx_zero];
Qqam_tx=[Qqam_tx tx_zero];
Iqam_tx=filter(Pt,1,Iqam_tx); %信号经过发送滤波器
Qqam_tx=filter(Pt,1,Qqam_tx); %信号经过发送滤波器
I_tx=Iqam_tx(1+Delay_tx:end);
Q_tx=Qqam_tx(1+Delay_tx:end);
tx=I_tx+j*Q_tx;
%16-QAM通过发送滤波器后的星座图
figure(2);
plot(I_tx,Q_tx,'*');
title('16-QAM通过发送滤波器后的星座');
xlabel('I');ylabel('Q');
grid on;
%信号通过发送滤波器后的眼图
figure(3);
hold on;
for i=(5*R+1):2*R:R*N-2*R
plot(I_tx(i:i+2*R));
end
hold off;
title('信号通过发送滤波器后的眼图');
xlabel('Time');ylabel('Amplitude');
%%原始信号和发送滤波器的频谱
figure(4);
f=-Fs/2:Fs/2; %要求正负半轴的频谱都有
Fa_qam=abs(freqz(qam,1,f,Fs));
Fa_filter=abs(freqz(Pt,1,f,Fs));
plot(f,20*log10(Fa_qam),f,20*log10(Fa_filter),'r');
title('原始信号和发送滤波器频谱');
xlabel('f');ylabel('A(dB)');
grid on;
%%信号通过发送滤波器后的频谱
fa_tx=abs(freqz(tx,1,f,Fs));
figure(5);
plot(f,20*log10(fa_tx));
title('信号通过滤波器后的频谱');
xlabel('f');ylabel('A(dB)');
grid on;
%%%%%%%%信道%%%%%%%%%%
[b,a]=butter(3,2*Fc/Fs); %截止频率为Fc的3阶巴特沃斯滤波器
%figure(6); %信道的频谱图
%freqz(b,a,512);
%%信号经过信道
Delay_ch=(length(b)-1)/2; %计算延时
Delay_ch=round(Delay_ch);
ch_zero=zeros(size(1:Delay_ch));
I_tx=[I_tx ch_zero];
Q_tx=[Q_tx ch_zero];
I_ch=filter(b,a,I_tx); %信号经过信道滤波器
Q_ch=filter(b,a,Q_tx); %信号经过信道滤波器
I_ch=I_ch(1+Delay_ch:end);
Q_ch=Q_ch(1+Delay_ch:end);
%Signal_ch=I_ch+j*Q_ch;
I_ch=awgn(I_ch,SNR); %加高斯白噪声
Q_ch=awgn(Q_ch,SNR); %加高斯白噪声
ch=I_ch+j*Q_ch;
%画信号经过信道加白噪声后的频谱
f=-Fs/4:Fs/4; %设置频率范围
fa_ch=abs(freqz(ch,1,f,Fs));
figure(7);
plot(f,20*log10(fa_ch)); %采用对数坐标
xlabel('f');ylabel('A(dB)');
title('信号经过信道加白噪声后的频谱');
grid on; ;
%%%%%%%%Receiver%%%%%%%%%
delay_rx=(length(Pt)-1)/2;
delay_rx=round(delay_rx);
delay_rx_zero=zeros(size(1:delay_rx));
I_ch=[I_ch delay_rx_zero];
Q_ch=[Q_ch delay_rx_zero];
I_rx=filter(Pt,1,I_ch); %信号通过接受滤波器
Q_rx=filter(Pt,1,Q_ch); %信号通过接受滤波器
I_rx=I_rx(1+delay_rx:end);
Q_rx=Q_rx(1+delay_rx:end);
%画信号通过接受滤波器后的眼图
figure(8);
hold on;
for i=(length(Pt)+1)/2:R*2:N-R*2,
plot(I_rx(i:i+R*2));
end;
hold off;
title('信号通过接受滤波器后的眼图');
xlabel('Time');ylabel('Amplitude');
%%%%%%%%%采样%%%%%%%%%%%%%
Impulse = [1 zeros(1,100)]; % Create an impulse.
TxImpOut = filter(Pt,1,Impulse); % Find out the combined impulse response of the Tx-filter, channel,
%and Rx-filter. Both Rx- and Tx-filters are
ChannelImpOut = filter(b,a,TxImpOut); % square root raised cosine filters.
RxImpOut = filter(Pt,1,ChannelImpOut);
[Trash,Pos] = max(abs(RxImpOut)); % Find the maximum value and its position, now the position is delay.
%Start sampling of the filtered received signal from
%the position Pos. In the actual sampling, use, of course,
% your own received signal variable instead of RxImpOut.
RxSampOut_I = I_rx(1:R:end);
RxSampOut_Q = Q_rx(1:R:end);
RxSampOut=RxSampOut_I+j*RxSampOut_Q;
%采样后星座映射图
figure(9);
plot(RxSampOut_I,RxSampOut_Q,'*');
axis([-4 4 -4 4]);
title('采样后信号星座映射');
xlabel('I');ylabel('Q');
grid on;
%%%%%%%%%%%均衡%%%%%%%%%%%%
beta=0.01; % 步长
c=zeros(size(1:31))'; %均衡系数的初始化
for i=Pos:960
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
delay_c=(length(c)-1)/2; %均衡器延迟
delay_c=round(delay_c);
temp_zero=zeros(size(1:delay_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+delay_c:end);
RxSampOut_Q=RxSampOut_Q(1+delay_c:end);
RxSampOut=RxSampOut_I+j*RxSampOut_Q;
%%信号通过均衡器后的星座映射图
figure(10);
plot(RxSampOut_I,RxSampOut_Q,'*');
axis([-4 4 -4 4]);
title('信号通过均衡器后的星座映射');
xlabel('I');ylabel('Q');
grid on;
%%%%%%%%%%Decoder%%%%%%%%%%%
rcv = qamdemod(RxSampOut,16);
%%%%%误码率和无码数的计算%%%%%%
[Err_num,Err_ratio]=symerr(rcv,send') %计算误码数和误码率
%close all;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?