OFDM仿真_MATLAB仿真ofdm

一、OFDM步骤
网上ofdm普遍采用这样一个顺序仿真,产生0-1随机序列 => 串并转换 => 映射 => 取共轭、过采样=> IFFT => 加循环前缀和后缀 => 加窗 => 并串转换 => 加AWGN => 串并转换 => 去前缀 => FFT =>下采样 => 解映射 => 求误码率
我去除①取共轭、过采样②加窗等步骤,这些复杂的做法设计很广的知识范围,有的还是工程化的细腻、额外考虑。只从原理上进行仿真。
二、编程效果
MATLAB编程绘图后效果如下图
ofdm此时的具体参数如下表所示

参数数值
每个ofdm符号包含mqam符号个数200
ofdm符号个数100
mqam的进制数64
前缀码128
后缀码20
信噪比55DB

注:
①上图频谱采用数字频率的1/2π倍表示,物理频率与码速有关;
②若IFFT前,取共轭,再求IFFT时,频谱类似矩形窗。

改了参数后效果:
ofdm

参数数值
每个ofdm符号包含mqam符号个数200
ofdm符号个数100
mqam的进制数16
前缀码128
后缀码20
信噪比15DB

三、完整代码如下
代码可以改参数
①MQAM信号可改,直接改M即可(M=2^n)
②信噪比可改
signal_time_C_W=awgn(signal_time_C,30);%加性高斯白噪声通道
改这个函数里的数字即可,这个是MATLAB自带的函数

clear all;
close all;
%-------------------参数设定---------------------%
carrier_count = 200; %每个ofdm符号包含mqam符号个数
ofdm_symbol_count = 100;%ofdm符号个数
M=64;%mqam的进制数
CP_length = 128;%前缀码
CS_length = 20;%后缀码
%------------------基本步骤----------------------%
bit_signal=bit_Signal_generation(carrier_count,ofdm_symbol_count,M);
%2进制信号生成
bit_moded1 = qammod(bit_signal,M,'InputType','bit');
%星座映射
bit_moded2 = reshape(bit_moded1,carrier_count,ofdm_symbol_count);
%串并转换
signal_time=ifft(bit_moded2,2^nextpow2(length(bit_moded2)));
%ifft调制
signal_time_C=add_prefix_suffix_code(signal_time,CP_length,CS_length);
%加前缀后缀码
signal_time_C_W=awgn(signal_time_C,55);
%加性高斯白噪声通道
signal_time_D=signal_time_C_W(1+CP_length:end-CS_length,:);
%去前缀码后缀码
signal_time_E=fft(signal_time_D,2^nextpow2(length(signal_time_D)));
%fft解调
signal_time_F=signal_time_E(1:carrier_count,:);
%解调后下采样
draw(bit_moded1,signal_time_C,signal_time,signal_time_C_W,signal_time_F);
%绘图
error_rate=error_rate1(signal_time_F,bit_signal,M);
%求误码率
%---------------------自己编写的函数 ,包括了绘图函数-------------------------%
function bit_signal=bit_Signal_generation(carrier_count,ofdm_symbol_count,M)
bit_per_symbol=log2(M);
bit_length = carrier_count*ofdm_symbol_count*bit_per_symbol;
bit_signal = round(rand(1,bit_length))'; % 列向量
end
function signal_time_C=add_prefix_suffix_code(signal_time,CP_length,CS_length)
signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];
signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)];
end
function draw(bit_moded1,signal_time_C,signal_time,signal_time_C_W,signal_time_F)
figure
subplot(3,2,1)
scatter(real(bit_moded1),imag(bit_moded1),'*r');
title('调制后的星座图');
grid on;
subplot(3,2,2)
scatter(real(reshape(signal_time_F,1,[])),imag(reshape(signal_time_F,1,[])),'.');
title('接收信号的星座图snr=55');
grid on;
subplot(3,2,3)
plot(abs(signal_time_C_W(:,1)),'r');
title('单个OFDM符号加前缀后缀码噪声下的信号');
subplot(3,2,4)
plot(abs(signal_time_C(:,1)),'y');
title('单个OFDM符号加前缀后缀码的信号');
subplot(3,2,5)
plot(abs(signal_time(:,1)),'g');
title('原始单个OFDM符号的信号');
xlabel('Time');
ylabel('Amplitude');
subplot(3,2,6)
NFFT = 2^nextpow2(length(signal_time(:,1)));           
Y1 = fft(mean(signal_time),NFFT)/NFFT;
f = linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y1(1:NFFT/2+1))) ;
hold on;
NFFT2 = 2^nextpow2(length(signal_time_C(:,1)));           
Y2 = fft(mean(signal_time_C),NFFT2)/NFFT2;
f2 = linspace(0,1,NFFT2/2+1);
plot(f2,2*abs(Y2(1:NFFT2/2+1)));
legend('噪声下频谱','无噪声下频谱');
end
function error_rate=error_rate1(signal_time_F,bit_signal,M)
bit_demod_sig = reshape(qamdemod(signal_time_F,M,'OutputType','bit'),[],1);
error_bit = sum(bit_demod_sig~=bit_signal);
error_rate = error_bit/length(bit_signal);
end

在工作区输入error_rate,便得到了误码率
在这里插入图片描述
四、我关于OFDM理解
我觉得最核心的有点如下:
①ofdm技术频谱利用率高。
②采用前缀码,后缀码克服了多径传播的问题,抗选择性衰落;采用纠错编码和交织过程,克服了深衰落等等,其抗衰落能力高。
③容量大。

补充:没function的代码(效果与上面函数一样)

clear all;
close all;
%-------------------%
carrier_count = 200; %每个ofdm符号包含mqam符号个数
ofdm_symbol_count = 100;%ofdm符号个数
M=64;%mqam的进制数
CP_length = 128;%前缀码
CS_length = 20;%后缀码
%---------------------------------------------%
%bit_signal=bit_Signal_generation(carrier_count,ofdm_symbol_count,M);
bit_per_symbol=log2(M);
bit_length = carrier_count*ofdm_symbol_count*bit_per_symbol;
bit_signal = round(rand(1,bit_length))';
%2进制信号生成
bit_moded1 = qammod(bit_signal,M,'InputType','bit');
%星座映射
bit_moded2 = reshape(bit_moded1,carrier_count,ofdm_symbol_count);
%串并转换
signal_time=ifft(bit_moded2,2^nextpow2(length(bit_moded2)));
%ifft调制
%signal_time_C=add_prefix_suffix_code(signal_time,CP_length,CS_length);
signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];
signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)];
%加前缀后缀码
signal_time_C_W=awgn(signal_time_C,55);
%加性高斯白噪声通道
signal_time_D=signal_time_C_W(1+CP_length:end-CS_length,:);
%去前缀码后缀码
signal_time_E=fft(signal_time_D,2^nextpow2(length(signal_time_D)));
%fft解调
signal_time_F=signal_time_E(1:carrier_count,:);
%解调后下采样
%draw(bit_moded1,signal_time_C,signal_time,signal_time_C_W,signal_time_F);
figure
subplot(3,2,1)
scatter(real(bit_moded1),imag(bit_moded1),'*r');
title('调制后的星座图');
grid on;
subplot(3,2,2)
scatter(real(reshape(signal_time_F,1,[])),imag(reshape(signal_time_F,1,[])),'.');
title('接收信号的星座图snr=55');
grid on;
subplot(3,2,3)
plot(abs(signal_time_C_W(:,1)),'r');
title('单个OFDM符号加前缀后缀码噪声下的信号');
subplot(3,2,4)
plot(abs(signal_time_C(:,1)),'y');
title('单个OFDM符号加前缀后缀码的信号');
subplot(3,2,5)
plot(abs(signal_time(:,1)),'g');
title('原始单个OFDM符号的信号');
xlabel('Time');
ylabel('Amplitude');
subplot(3,2,6)
NFFT = 2^nextpow2(length(signal_time(:,1)));           
Y1 = fft(mean(signal_time),NFFT)/NFFT;
f = linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y1(1:NFFT/2+1))) ;
hold on;
NFFT2 = 2^nextpow2(length(signal_time_C(:,1)));           
Y2 = fft(mean(signal_time_C),NFFT2)/NFFT2;
f2 = linspace(0,1,NFFT2/2+1);
plot(f2,2*abs(Y2(1:NFFT2/2+1)));
legend('噪声下频谱','无噪声下频谱');
%绘图
%error_rate=error_rate1(signal_time_F,bit_signal,M);
bit_demod_sig = reshape(qamdemod(signal_time_F,M,'OutputType','bit'),[],1);
error_bit = sum(bit_demod_sig~=bit_signal);
error_rate = error_bit/length(bit_signal);
%求误码率
%----------------------------------------------%
  • 37
    点赞
  • 183
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值