基于LS最小二乘法的OFDM信道估计误码率matlab仿真

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

ofdm基本结构如下所示:

        信道估计是使用接收信号表现出来的各种状态来对信道的特性进行估计的过程。信道估计是信道对输入信号影响的一种数学表示。信道估计可以定义为描述物理信道对输入信号的影响而进行定性研究的过程,是信道对输入信号影响的一种数学表示。如果信道是线性的,那么信道估计就是对系统冲激响应进行估计。信道估计的目标就是使某种估计误差最小化,同时还要尽量降低算法的复杂度,并具有可实现性。为了在接收端能够准确地恢复发射信号,需要对信道的冲激响应进行估计,这就是信道估计。
       OFDM系统常常使用插入导频的方法来进行信道估计。我们都知道OFDM系统是在同一个时刻同时发送多个不同频率的子载波,一次性发送若干个子载波算是发送了一个OFDM符号,然后再隔一定的时间再发送下一个OFDM符号。根据导频插入的不同方式我们可以分为块状导频和梳状导频。 

LS:Least Square
         该算法计算简单、复杂度低,不需要信道的任何先验统计特性。该方法导频处信道频域响应(CFR)通过LS算法估计得到,数据符号处CFR通过插值方法获得。然而,由于LS估计方法不能消除导频处噪声的影响,并且插值类信道估计方法不能有效消除由于多径引起的频域选择兴衰落信道的影响,导致数据处CFR获取不准确,因此LS算法的估计性能较差。
假设发射信号是X(i),信道传输函数是H(i),接收端接收到的信号是Y(i),那么就有这个等式Y(i)=X(i)H(i)。
       信道估计中的LS算法是最基本且常用的算法,用最朴实的话说就是忽略噪声,直接除。其公式表示为H(i)=Y(i)/X(i)。频域接收信号导频位置Y,本地已知导频X。两者简单相除,就可以得到导频位置的信道估计值H(i)。
       在硬件实现时,除了在均衡时可以考虑用除法器,其他位置(包括此处的LS算法)都不要使用除法器,除法器占用的资源太多,将除法表示为乘法即可避免,而大部分的乘法可以用移位相加来实现,这样可以大大降低复杂度。

2.仿真效果预览

matlab2022a仿真结果如下:

3.MATLAB核心程序

.......................................................
%---------------------------------------------------------------
%----------------------------------------------------------------
%加高斯白噪声
Error_ber=[];%误比特率
Error_ber1=[];
Error_ber2=[];%误比特率
Error_ber3=[];
%Error_ser=[];%误符号率
for snr_db=0:snr:N_snr
 
    code_power=0;
    code_power=[norm(Tx_data)]^2/(length(Tx_data));%信号的符号功率
    %bit_power=var(Tx_data);
    bit_power=code_power/bits_per_symbol;%比特功率 
    noise_power=10*log10((bit_power/(10^(snr_db/10))));%噪声功率
    noise=wgn(1,length(Tx_data),noise_power,'complex');%产生GAUSS白噪声信号
    
    Y7=Tx_data+noise;
 
%-------------------------------------------------------
  %串并变换
   Y6=reshape(Y7,IFFT_bin_length+GI,symbols_per_carrier).';
   
  %去保护间隔
    for k=1:symbols_per_carrier;
       for i=1:IFFT_bin_length;
           Y5(k,i)=Y6(k,i+GI);
       end
    end
    %FFT,傅立叶变换
     Y4=fft(Y5,IFFT_bin_length,2);
     Y3=Y4(:,carriers);
 %-------------------------------------------------------------   
 %LS信道估计,%信道估计准则:最小均方误差(MMSE)最大似然估计(MLE) 最小平方(LS)
  H=[];
  Y2=Y3(:,signal);
  Rx_training_symbols=Y3(:,pilot);
  Rx_training_symbols0=reshape(Rx_training_symbols,symbols_per_carrier*Np,1);
  
  training_symbol0=reshape(training_symbols,1,symbols_per_carrier*Np);
  training_symbol1=diag(training_symbol0);
  %disp(training_symbols)
  training_symbol2=inv(training_symbol1);
  Hls=training_symbol2*Rx_training_symbols0;
  Hls1=reshape(Hls,symbols_per_carrier,Np);
  HLs=[];
  HLs1=[];
..........................................		   
 A151

4.完整MATLAB

V

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OFDM系统中LS信道估计误码率曲线可以通过MATLAB进行仿真。下面是一个简单的仿真代码示例: ```matlab % OFDM系统仿真LS信道估计误码率曲线 clear all; close all; % OFDM参数设置 N = 64; % 子载波数 cp_len = 16; % 循环前缀长度 K = N - cp_len; % 数据子载波数 M = 4; % 星座大小 num_ofdm_symbols = 1000; % OFDM符号数 % 信道参数设置 chan_type = 'rayleigh'; % 信道类型 chan_var = 0.1; % 信道方差 % 仿真参数设置 snr_dB = 0:2:20; % 信噪比范围(dB) % 初始化误码率数组 ber = zeros(size(snr_dB)); % 开始仿真 for i = 1:length(snr_dB) % 生成OFDM符号 tx_data = randi([0 M-1], K*num_ofdm_symbols, 1); tx_data_mat = reshape(tx_data, K, num_ofdm_symbols); tx_sym = qammod(tx_data_mat, M); tx_sym_ifft = ifft(tx_sym, N, 1); % 加循环前缀 tx_sym_cp = [tx_sym_ifft(N-cp_len+1:N,:); tx_sym_ifft]; % 信道传输 if strcmp(chan_type, 'rayleigh') chan = sqrt(chan_var)*(randn(N+cp_len,num_ofdm_symbols)+1j*randn(N+cp_len,num_ofdm_symbols))/sqrt(2); elseif strcmp(chan_type, 'awgn') chan = ones(N+cp_len,num_ofdm_symbols); end rx_sym_cp = zeros(size(tx_sym_cp)); for j = 1:num_ofdm_symbols rx_sym_cp(:,j) = chan(:,j).*tx_sym_cp(:,j); end % 去循环前缀 rx_sym = rx_sym_cp(cp_len+1:end,:); % LS信道估计 chan_est_ls = rx_sym(:,1)./tx_sym_cp(:,1); for j = 2:num_ofdm_symbols chan_est_ls = chan_est_ls + rx_sym(:,j)./tx_sym_cp(:,j); end chan_est_ls = chan_est_ls/num_ofdm_symbols; % 接收端信号修复 rx_sym_fix = zeros(K,num_ofdm_symbols); for j = 1:num_ofdm_symbols rx_sym_fix(:,j) = rx_sym(cp_len+1:end,j)./chan_est_ls(cp_len+1:end); end % 解调 rx_data_mat = qamdemod(rx_sym_fix, M); % 计算误码率 rx_data = reshape(rx_data_mat, K*num_ofdm_symbols, 1); [~, ber(i)] = biterr(rx_data, tx_data); end % 画图 figure(1); semilogy(snr_dB, ber, '-o', 'LineWidth', 2); grid on; xlabel('SNR(dB)'); ylabel('BER'); title('OFDM LS信道估计误码率曲线'); ``` 上述代码中,首先定义了OFDM系统的参数和仿真参数,然后通过循环生成不同信噪比下的OFDM符号并进行LS信道估计误码率计算,最后将误码率-信噪比曲线绘制出来。其中,LS信道估计的代码为: ```matlab chan_est_ls = rx_sym(:,1)./tx_sym_cp(:,1); for j = 2:num_ofdm_symbols chan_est_ls = chan_est_ls + rx_sym(:,j)./tx_sym_cp(:,j); end chan_est_ls = chan_est_ls/num_ofdm_symbols; ``` 该代码中,首先使用第一个符号的接收信号和发送信号进行信道估计,然后利用所有符号的接收信号和发送信号进行平均。最终得到的chan_est_ls即为信道估计结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值