OFDM系统的稀疏信道估计(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客    

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

OFDM技术作为地面4G系统的核心技术,仍为5G系统的基本传输体制[5],在地面系统已得到较为广泛的应用。针对星间通信系统,该技术相比于串行的单载波体制,能够将频带利用率提高将近倍,从而更加充分地利用频带资源,实现高码速率传输;对于衰落或窄带干扰,可能会导致单载波通信系统瘫痪,而OFDM 系统只影响几个子信道,可采用针对受干扰的子信道降低数据传输速率等方法来保证星间通信系统的通信质量;OFDM 技术起源于模拟调制的频分复用( frequency division multiplexing ,FDM)和多载波调制( multi-carrier modulation , MCM)。其主要思想是将一个高速串行的数据流通过串并变换转换成N个低速并行的子数据流,并调制到多个正交的子载波上进行传输,其中每个子载波承载一个低速子数据流.

OFDM信号采用了多载波调制,通过设置相邻子载波频率间隔等于各子载波上码元周期的倒数,保证各载波信号在频谱上的正交性。OFDM信号根据调制方式不同,可以分为两大类,即循环前缀正交频分复用技术(Cyclic Prefix Orthogonal Freque;ncyDivision Multiplexing,CP-OFDM)和时域同步正交频分复用技术(Time Domain Synchronous Orthogolnal Frequency Division Multiplexing,TDS-OFDM)。CP-OFDM信号在有用OFDM符号数据前加入循环前缀充当帧头,而TDS-OFDM信号将OFDM符号有效数据作为帧体, PN(Pseudo Noise)序列作为帧头。本文在处理CP-OFDM或TDS-OFDM信号前需要去除帧头,并对处理后的参考信号和监测信号根据帧体长度进行分段处理,如图1所示。
 

本文 将使用稀疏信道估计的系统与使用LSE信道估计的系统进行比较。结果表明,使用稀疏技术可以提高系统的性能。

📚2 运行结果

部分代码:

%% Loop
for cnt1 = 1 :  loop.End1
    for cnt2 = 1 : loop.End2
        % loop parameters
        chan.snrdB = chan.snrdBV(cnt2);
        % Data generation
        data  = randi([0 ofdm.M-1],ofdm.N,ofdm.B);
        % modulation
        if ofdm.M == 4
            dataMod = qammod(data,ofdm.M)/sqrt(2);
        else
            error('Not defined')
        end
        
        % pilot insertion
        ofdm.Pilot = ones(ofdm.NP,1);% or randsrc(ofdm.NP,ofdm.B,[-1 1]).*exp(-sqrt(-1)*pi*rand(ofdm.NP,ofdm.B));
        dataMod(ofdm.PP,:) = ofdm.Pilot;
        
        % ifft operation
        dataIFFT   = sqrt(ofdm.N)*ifft(dataMod);
        
        % adding gaurd interval
        dataIFFTGI = [dataIFFT((ofdm.N-ofdm.GI+1):ofdm.N,:);dataIFFT;];
        
        % channel (rayleigh and gaussian noise)
        ch = rayleighchan(ofdm.T,chan.fd,chan.tau_p(chan.Delay(1:chan.L)),chan.Gain(chan.Delay(1:chan.L)));
        dataChann = awgn(filter(ch,dataIFFTGI(:)),chan.snrdB );
        
        % reshaping the signal
        dataChann = reshape(dataChann,ofdm.N+ofdm.GI,ofdm.B);
        
        % Guard interval removal
        dataRx     = dataChann((ofdm.GI+1):(ofdm.N+ofdm.GI),:);

        % ofdm demodulation
        dataRxFFT  =1/sqrt(ofdm.N)*fft(dataRx);
        
        %% Saprse Channel estimation
        H_Sparse = zeros(ofdm.N,ofdm.B);
        lambda1 = ofdm.NP*10^(-chan.snrdB/10)/sum(abs(ch.pathGains));
        for b = 1 : ofdm.B
            y = dataRxFFT(ofdm.PP,b);
            A = chan.Gamma(ofdm.PP,:).*repmat(ofdm.Pilot(:,b),1,chan.Nt);
            cvx_begin quiet
                variable x(chan.Nt) complex
                    % sparse minimization formula (A is built from dictionary, y is received data and x is the channel coeff at pilot locations)
                    minimize( quad_form(y-A*x,eye(ofdm.NP))+lambda1*norm(x,1) )
            cvx_end
            % building channel at all location (simply from the dictionar)
            H_Sparse(:,b) = chan.Gamma*x;            
        end
        dataRxMod_Sparse =  dataRxFFT(ofdm.DP,:)./H_Sparse(ofdm.DP,:);             
        dataRxDeMod_Sparse = qamdemod(dataRxMod_Sparse,ofdm.M);       
        [~,BER_Sparse] = biterr(dataRxDeMod_Sparse,data(ofdm.DP,:),ofdm.M);
        %% LSE        
        H_LSE = zeros(ofdm.N,ofdm.B);
        for b = 1 : ofdm.B
             H_LSE(:,b) = ofdm.N/ofdm.NP * fft(ifft(dataRxFFT(ofdm.PP,b)./dataMod(ofdm.PP,b)),ofdm.N);
        end
        
        dataRxMod_LSE =  dataRxFFT(ofdm.DP,:)./H_LSE(ofdm.DP,:);             
        dataRxDeMod_LSE = qamdemod(dataRxMod_LSE,ofdm.M);       
        [~,BER_LSE] = biterr(dataRxDeMod_LSE,data(ofdm.DP,:),ofdm.M);
        
        % saving the output
        loop.Sparse(cnt1,cnt2) = BER_Sparse;
        loop.LSE(cnt1,cnt2)    = BER_LSE;
    end
    disp([num2str(round(cnt1/loop.End1*100)),'% has been done'])
end

%% Figure
f1 = figure(1);
semilogy(chan.snrdBV,mean(loop.Sparse,1),'b-o')
hold on 
semilogy(chan.snrdBV,mean(loop.LSE,1),'r.-')
hold off
legend('Sparse','LSE')
grid on

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]王彦革,武加纯,张瀚青,张康雷,殷鹏程.高速星间收发通信机OFDM调制解调研究[J].空间电子技术,2023,20(01):70-75.

[2]饶云华,丁添,谢德强,万显荣,易建新.OFDM外辐射源雷达线性调频干扰抑制[J].信号处理,2023,39(02):202-211.DOI:10.16798/j.issn.1003-0530.2023.02.002.

[3]Hamid Ramezani (2023). OFDM Sparse Channel estimation.

🌈4 Matlab代码实现

以下是基于MATLABOFDM系统ZF信道均衡的代码: % OFDM系统ZF信道均衡matlab代码 clc; clear all; close all; N = 64; % 块大小 cp = 16; % 循环前缀长度 num_carriers = 48; % 子载波数量 num_bits = 10000; % 传输位数 num_blocks = ceil(num_bits/(num_carriers*N)); % 块数量 SNR = 20; % 信噪比 % 生成随机比特流 bits_tx = randi([0 1],1,num_bits); % 调制为QPSK符号 symbols_tx = 1-2*reshape(bits_tx,2,length(bits_tx)/2)'; symbols_tx = symbols_tx(:,1)+1j*symbols_tx(:,2); % 分组 blocks_tx = reshape(symbols_tx,N,num_blocks); % DFT处理 blocks_dft = (1/sqrt(N))*fft(blocks_tx,N); % 插入循环前缀 blocks_cp = [blocks_dft(end-cp+1:end,:);blocks_dft]; % 并行发送 signal_tx = reshape(blocks_cp,(N+cp)*num_blocks,1); % 生成AWGN noise = 1/sqrt(2*SNR)*randn(length(signal_tx),1)+1j*1/sqrt(2*SNR)*randn(length(signal_tx),1); % 加入噪声 signal_rx = signal_tx + noise; % 并行接收 blocks_rx = reshape(signal_rx,N+cp,num_blocks); % 去除循环前缀 blocks_nocp = blocks_rx(cp+1:end,:); % DFT处理 blocks_dft = (1/sqrt(N))*fft(blocks_nocp,N); % 生成ZF均衡矩阵 channel = randn(num_carriers,1)+1j*randn(num_carriers,1); H = (1/sqrt(2))*(randn(num_carriers,num_blocks)+1j*randn(num_carriers,num_blocks)); H_inv = pinv(H); W = H_inv; % 块处理 blocks_zf = zeros(num_carriers,num_blocks); for i = 1:num_blocks blocks_zf(:,i) = W*blocks_dft(:,i); end % IDFT处理 blocks_idft = sqrt(N)*ifft(blocks_zf,N); % 去掉循环前缀 blocks_nocp = blocks_idft(cp+1:end,:); % 串行发送 symbols_rx = reshape(blocks_nocp,num_bits/2,1); % 解调为二进制比特流 bits_rx = zeros(num_bits,1); bits_rx(1:2:end) = real(symbols_rx)<0; bits_rx(2:2:end) = imag(symbols_rx)<0; % 计算误码率 num_errors = sum(xor(bits_tx,bits_rx)); ber = num_errors/num_bits; disp(['误码率为: ',num2str(ber)]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荔枝科研社

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

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

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

打赏作者

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

抵扣说明:

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

余额充值