- 经验
- 3
- 分贝
- 0
- 家园分
- 9
- 在线时间:
- 2 小时
- 最后登录:
- 2016-4-5
- 帖子:
- 2
- 精华:
- 0
- 注册时间:
- 2016-3-23
- UID:
- 1235759
注册:2016-3-23
|
发表于 2016-3-23 16:15:40
|显示全部楼层
clear;
clc;
carr=256; %子载波个数
sym_c=10; %每个子载波使用的符号数
bit_sym=2; %每个符号含有的比特数,QPSK调制
IFFT_n=256; %IFFT点数
r=1/10; %保护间隔和OFDM数据的比例;
SNR=10; %信噪比 dB
%产生信号
sum=carr*sym_c*bit_sym;
signal=rand(1,sum)>0.5; %初始信号
%QPSK调制,QPSK_sig里面存放的是调制后的信号,数目sumQ
sumQ=sum/2;
imag=sqrt(-1); % 虚部 j
QPSK=[-1+imag,-1-imag,1+imag,1-imag]; %创建QPSK 映射表
SIGNAL=zeros(1,sumQ); %计算并存放调制前的十进制数据
QPSK_sig=zeros(1,sumQ); %存放调制后的QPSK信号
for n=1:sumQ
SIGNAL(n)=signal(2*n-1)*2+signal(2*n); %将二进制换算成十进制
end
for i=1:sumQ
if SIGNAL(i)==0;
QPSK_sig(i)=QPSK(1);
elseif SIGNAL(i)==1;
QPSK_sig(i)=QPSK(2);
elseif SIGNAL(i)==2;
QPSK_sig(i)=QPSK(3);
elseif SIGNAL(i)==3;
QPSK_sig(i)=QPSK(4);
end
end
%串/并转换 计算第i个载波上面的信号to_par(i,:)
colume=sumQ/carr; %调制后的数目除以子载波数=每个子载波含有的符号数
to_par=reshape(QPSK_sig,carr,colume);
%每个子载波上进行 IFFT变换 (调制后的QPSK信号进行IFFT)
y=ifft(to_par,IFFT_n);
yr=real(y); %实部
yi=(y-yr)*sqrt(-1)*(-1);
%加入循环前缀
CP_len=r*colume; %保护间隔长度
yr=[yr(:,colume-CP_len+1:colume),yr];%(:,colume-CP_len+1:colume)表示所有的行 第colume-CP_len+1:colume的列 yr变为colume+CP_len列
yi=[yi(:,colume-CP_len+1:colume),yi];
%并/串转换
y_=yr+yi*sqrt(-1);%重新建立虚实部
y_series=reshape(y_,1,(colume+CP_len)*carr);%y_series变为一行 (colume+CP_len)*carr列的矩阵(实现并串变换)
%加入高斯白噪声
y_s_noi=awgn(y_series,SNR,'measured');%若加入measured则函数在加入噪声之前测定信号强度(结果更准确)
%串/并转换
y_par=reshape(y_s_noi,carr,colume+CP_len);
%去掉保护间隔
y_r=real(y_par);%实部
y_i=(y_par-y_r)*(-1)*sqrt(-1);%虚部
y_r=y_r(:,CP_len+1:colume+CP_len);
y_i=y_i(:,CP_len+1:colume+CP_len);
%FFT变换
y_complex=y_r+y_i*sqrt(-1); %变为复数
y_fft=fft(y_complex,IFFT_n);
%并/串 转换
y_receive=reshape(y_fft,1,sumQ);
% QPSK逆映射
QPSK=[-1+imag,-1-imag,1+imag,1-imag];
Y_r=real(y_receive);
Y_i=(y_receive-Y_r)*(-1)*sqrt(-1);
for i=1:21
if Y_r(i)<0;
Y_r(i)=0;
else
Y_r(i)=1;
end
if Y_i(i)<0;
Y_i(i)=1;
else
Y_i(i)=0;
end
Y=signal;
Y(2*i-1)=Y_r(i);
Y(2*i)=Y_i(i);
[bit_err_num,bit_ratio]=biterr(signal,Y); %误比特判断函数-biterr,错误比特个数存入bit_err_num,误比特率存入bit_ratio
err_bit(i)=bit_ratio; %循环每一次不同信噪比都对应不同的误比特率,将其存入数组err_bit当中
end
SNR=[0:0.5:10]
figure(1)
semilogy(SNR,err_bit,'-.k');
title('误比特');
legend('仿真误比特率');
xlabel('信噪比/dB');
ylabel('㏒-误比特率')
grid on;
|
|