高斯白噪声信道下OFDM传输(MATLAB仿真)

高斯白噪声信道下OFDM传输
链接: https://zhuanlan.zhihu.com/p/296560100.

para = 128;   %Number of parallel channel to transmit
fftlen = 128;  %FFT length
noc = 128;    %Number of carrier 
nd = 6;  %Number of information OFDM symbol for one loop
ml = 2;   %Modulation:QPSK
sr = 250000;  %Symbol rate 符号速率
br = sr.*ml;  %Bit rate per carrier
gilen = 32; %length of guard interval 


ebn0_temp = 3:1:10;
for kkk = 1:length(ebn0_temp)
    
ebn0 = ebn0_temp(kkk);  %Eb/No 
% ebn0 = 8;  %Eb/No

nloop = 10000; %Number of sumulation loops 
noe = 0;   %Number of error data  
nod = 0;   %Number of transmitted data 
eop = 0;   %Number of error packet  
nop = 0;   %Number of transmitted packet


for iii = 1:nloop
    %%%%%%%%%%%%%%%%%  发射机  %%%%%%%%%%%%%%%%%%%
    seldata = rand(1,para*nd*ml)>0.5;  %串行数据

    paradata = reshape(seldata,para,nd*ml); %串并转换

    [ich,qch] = qpskmod(paradata,para,nd,ml); %调制
    kmod = 1/sqrt(2);
    ich1 = ich.*kmod;
    qch1 = qch.*kmod;
    %%%%%%%%%%%% IFFT %%%%%%%%%%
    x = ich1 + qch1 *1j;
    
    spow1 = sum(sum(ich1.^2+ qch1.^2))/nd./para;
    
    y = ifft(x);
    ich2 = real(y);
    qch2 = imag(y);
    
    spow2 = sum(sum(ich2.^2+ qch2.^2))/nd./para;
    
    
    %%%%%%%% 添加保护间隔 %%%%%%%%
    [ich3,qch3] = giins(ich2,qch2,fftlen,gilen,nd);
    fftlen2 = fftlen + gilen;
    
%     figure(1);
%     plot(ich3,'-+');
%     hold on;
    
    
    
    %****************  Attenuation Calculation **************
    spow = sum(ich3.^2+ qch3.^2)/nd./para;
    attn = 0.5*spow*sr/br*10.^(-ebn0/10);
    attn = sqrt(attn);
    
    
    
    %%%%%%%%%%%%%%%%%%%%%%%  接收机  *************%%%%%%
    %%%%%%%%%%% AWGN addition *******************
    [ich4,qch4] = comb(ich3,qch3,attn);
    

%     plot(ich4,'-*');
  
    %%%%%%%% 去掉保护间隔 %%%%%%%%
    [ich5,qch5] = girem(ich4,qch4,fftlen2,gilen,nd);
 
    
    %%%%%%%%%%%%%%  FFT %%%%%%%%
    rx = ich5 + qch5.*1i;
    ry = fft(rx);
    ich6 = real(ry);
    qch6 = imag(ry);
    
    %%%%%%%%%%%%%% demoluation %%%%%%%%%%%%%%
    ich7 = ich6./kmod;
    qch7 = qch6./kmod;
    demodata = qpskdemod(ich7,qch7,para,nd,ml);
    
    %%%%%%%%%%%%%% 并串转换 %%%%%%%%%
    demodata1 = reshape(demodata,1,para*nd*ml);
    
    %%%%%%%%%%%%%%% Bit Error Rate %%%%%%%%%%%
    noe2 = sum(abs(demodata1-seldata));
    nod2 = length(seldata);
    
    %%%%cumulative the number of error and data in noe and nod
    noe = noe + noe2;
    nod = nod + nod2;
    
    %%%计算PER
    if noe2~=0
        eop = eop +1;
%     else
%         eop = eop;
        
    end

    nop = nop + 1;
%     fprintf('%f\t%e\t%d\n',iii,noe2/nod2,eop);
end

%**************   output result *************
per = eop/nop;
ber = noe/nod;

fprintf('%f\t%e\t%e\t%d\t\n',ebn0,ber,per,nloop);
fid = fopen('BERofdm.dat','a');
fprintf(fid,'%f\t%e\t%e\t%d\t\n',ebn0,ber,per,nloop);
fclose(fid);

end

%************************* 画误码率曲线进行对比 ******************%
ebn0 = 3:1:10;
awgn_theory = [0.0228784075610853,0.0125008180407376,0.00595386714777866,0.00238829078093281,0.000772674815378444,0.000190907774075993,3.36272284196176e-05,3.87210821552205e-06];
awgn_no_compensation = [3.698496e-02,2.254329e-02,1.226654e-02,5.823633e-03,2.305339e-03,7.492187e-04,1.757812e-04,3.170573e-05];
rayleign_one_path_theory = [0.125000000000000,0.100000000000000,0.0833333333333333,0.0714285714285715,0.0625000000000000,0.0555555555555556,0.0500000000000000,0.0454545454545455]; 

semilogy(ebn0,awgn_theory,'-*',ebn0,awgn_no_compensation,'-+');
xlabel('比特信噪比');
ylabel('误码率');
title('不同信噪比下误码率仿真曲线');
legend('理论曲线','实验曲线');
grid on;

高斯白噪声下的OFDM采用QPSK调制的误码率值(理论值)

EbN0(dB)误码率
30.0228784075610853
40.0125008180407376
50.00595386714777866
60.00238829078093281
70.000772674815378444
80.000190907774075993
93.36272284196176e-05
103.87210821552205e-06

(实验值)

EbN0(dB)误码率误包率循环次数
33.698496e-021.000000e+0010000
42.254329e-021.000000e+0010000
51.226654e-021.000000e+0010000
65.823633e-039.999000e-0110000
72.305339e-039.709000e-0110000
87.492187e-046.837000e-0110000
91.757812e-042.384000e-0110000
103.170573e-054.780000e-0210000

由于OFDM中引入保护间隔,单考虑数据部分时,CP是一种冗余信息,因此相比于理论误码率曲线有10*log(160/128)=0.969dB的损失。对应到误码率曲线上,即本实验误码率曲线相比理论误码率曲线向右平移0.969dB
在这里插入图片描述

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在MATLAB中生成OFDM信号并添加高斯白噪声仿真代码: ```matlab clear all;close all;clc; % OFDM参数设置 N = 64; % 子载波数量 cp_len = 16; % 循环前缀长度 data_len = N/2-1; % 数据载波数量 Fs = 100e3; % 采样率 Fc = 2e3; % 载波频率 Ts = 1/Fs; % 采样周期 % 生成随机数据 data = randi([0 1],1,data_len); % QPSK调制 mod_data = pskmod(data,4); % 将数据映射到子载波上 signal = zeros(1,N); signal(2:N/2) = mod_data(1:data_len/2); signal(N/2+2:N) = mod_data(data_len/2+1:data_len); % IFFT变换 ifft_signal = ifft(signal)*sqrt(N); % 插入循环前缀 tx_signal = [ifft_signal(N-cp_len+1:N) ifft_signal]; % 发送信号 t = (0:length(tx_signal)-1)*Ts; carrier_wave = exp(1i*2*pi*Fc*t); tx_signal = tx_signal.*carrier_wave; % 加入高斯白噪声 snr = 10; % 信噪比 rx_signal = awgn(tx_signal,snr,'measured'); % 接收端解调 rx_signal = rx_signal.*conj(carrier_wave); rx_signal = rx_signal(cp_len+1:end); rx_signal = fft(rx_signal)/sqrt(N); % 将载波数据映射回原始数据 rx_data = zeros(1,data_len); rx_data(1:data_len/2) = rx_signal(2:data_len/2+1); rx_data(data_len/2+1:data_len) = rx_signal(N/2+2:N); % QPSK解调 demod_data = pskdemod(rx_data,4); % 统计误码率 err = sum(abs(data-demod_data)); ber = err/data_len; fprintf('误码率: %f\n',ber); ``` 代码中首先设置OFDM的参数,包括子载波数量、循环前缀长度、数据载波数量、采样率和载波频率等。然后生成随机数据,并进行QPSK调制。接着将数据映射到子载波上,并进行IFFT变换和插入循环前缀。然后将信号进行调制,并添加高斯白噪声。接收端对信号进行解调,并将载波数据映射回原始数据,并进行QPSK解调。最后统计误码率。 需要注意的是,代码中的误码率是理论误码率,实际误码率可能会受到信道的影响而有所偏差。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值