基于scfdma和MMSE均衡的matlab误码率仿真

目录

1.SC-FDMA的工作原理

2.MMSE均衡器原理

3.matlab程序

4.仿真结果


      SC-FDMA是一种在无线通信系统中用于上行链路传输的调制技术,特别适合于功率受限的用户设备(UE)。它结合了单载波系统的低峰均功率比(PAPR)优势和OFDM的频谱效率。相比OFDM,SC-FDMA通过将数据分配到多个子载波上,并采用循环前缀来对抗多径衰落,但在子载波上的数据传输是连续而非并行的,从而降低了UE端发射信号的峰值功率要求。

1.SC-FDMA的工作原理

       编码与交织阶段: 原始比特流首先经过信道编码,例如使用卷积码或Turbo码增加冗余度,以增强抗干扰能力:

       c=Encoder(b)

其中 b 是待编码的信息比特序列,c 是编码后的比特序列。

接下来,编码比特被交织(Interleaving),以进一步抵抗突发错误的影响:

       cint​=Interleaver(c)

       串行-并行转换与预编码阶段: 交织后的比特序列被分割成多个子序列,每个子序列对应一个子载波。然后,这些子序列经预编码映射到连续的时间符号上,通常通过IFFT和DFT-Spread操作实现:

其中,K 表示子载波数量,cint,k​ 是第k 个交织后编码比特对应的星座点,N 为IFFT变换的点数。

       添加CP和传输阶段:在时域信号前端添加循环前缀(CP)以避免符号间干扰(ISI),最后,带有CP的信号通过无线信道进行传输。

2.MMSE均衡器原理

       接收端接收到带有多径衰落影响的信号,需进行均衡处理以恢复出准确的数据。最小均方误差均衡器(Minimum Mean Square Error Equalizer, MMSE)是一个线性滤波器,其作用是估计原始发送信号的最佳近似值,同时考虑噪声和信道失真的影响。

      对于SC-FDMA系统中的单个子载波 k,接收信号可以表示为:

       其中hk​[n] 是频率响应函数,描述了从发射机到接收机子载波 k 的信道影响,xk​[n] 是实际发送信号,wk​[n] 是加性的高斯白噪声。

       MMSE均衡器的目标是对每个子载波应用一个补偿系数gk​,使得估计信号x^k​[n] 最小化均方误差(MSE):

        在实际情况中,由于信道统计特性未知,需要利用导频或者其他信道估计方法获取hk​[n] 的估值。一旦得到hk​ 的估值,就可以计算gk​ 并对每个子载波的接收信号执行均衡操作。

       解交织与解码阶段: 均衡之后的信号按照反交织顺序重新排列,然后送入解码器进行译码,还原出原始信息比特流。

3.matlab程序

function [SER_ifdma SER_lfdma] = scfdma(SP)

numSymbols = SP.FFTsize;
Q = numSymbols/SP.inputBlockSize;
H_channel = fft(SP.channel,SP.FFTsize);

for n = 1:length(SP.SNR),
    tic;
    errCount_ifdma = 0;
    errCount_lfdma = 0;

    for k = 1:SP.numRun,
        tmp = round(rand(2,SP.inputBlockSize));
        tmp = tmp*2 - 1;
        inputSymbols = (tmp(1,:) + i*tmp(2,:))/sqrt(2);
    
        inputSymbols_freq = fft(inputSymbols);
        inputSamples_ifdma = zeros(1,numSymbols);
        inputSamples_lfdma = zeros(1,numSymbols);

        inputSamples_ifdma(1+SP.subband:Q:numSymbols) = inputSymbols_freq;
        inputSamples_lfdma([1:SP.inputBlockSize]+SP.inputBlockSize*SP.subband) = inputSymbols_freq;
        inputSamples_ifdma = ifft(inputSamples_ifdma);
        inputSamples_lfdma = ifft(inputSamples_lfdma);

        TxSamples_ifdma = [inputSamples_ifdma(numSymbols-SP.CPsize+1:numSymbols) inputSamples_ifdma];
        TxSamples_lfdma = [inputSamples_lfdma(numSymbols-SP.CPsize+1:numSymbols) inputSamples_lfdma];
        
        RxSamples_ifdma = filter(SP.channel, 1, TxSamples_ifdma); % Multipath Channel
        RxSamples_lfdma = filter(SP.channel, 1, TxSamples_lfdma); % Multipath Channel
    
        tmp = randn(2, numSymbols+SP.CPsize);
        complexNoise = (tmp(1,:) + i*tmp(2,:))/sqrt(2);
        noisePower = 10^(-SP.SNR(n)/10);
        RxSamples_ifdma = RxSamples_ifdma + sqrt(noisePower/Q)*complexNoise;
        RxSamples_lfdma = RxSamples_lfdma + sqrt(noisePower/Q)*complexNoise;
        
        RxSamples_ifdma = RxSamples_ifdma(SP.CPsize+1:numSymbols+SP.CPsize);
        RxSamples_lfdma = RxSamples_lfdma(SP.CPsize+1:numSymbols+SP.CPsize);
        Y_ifdma = fft(RxSamples_ifdma, SP.FFTsize);
        Y_lfdma = fft(RxSamples_lfdma, SP.FFTsize);
        
        Y_ifdma = Y_ifdma(1+SP.subband:Q:numSymbols);
        Y_lfdma = Y_lfdma([1:SP.inputBlockSize]+SP.inputBlockSize*SP.subband);
        
        H_eff = H_channel(1+SP.subband:Q:numSymbols);
        if SP.equalizerType == 'ZERO'
            Y_ifdma = Y_ifdma./H_eff;
        elseif SP.equalizerType == 'MMSE'
            C = conj(H_eff)./(conj(H_eff).*H_eff + 10^(-SP.SNR(n)/10));
            Y_ifdma = Y_ifdma.*C;
        end
        
        H_eff = H_channel([1:SP.inputBlockSize]+SP.inputBlockSize*SP.subband);
        if SP.equalizerType == 'ZERO'
            Y_lfdma = Y_lfdma./H_eff;
        elseif SP.equalizerType == 'MMSE'
            C = conj(H_eff)./(conj(H_eff).*H_eff + 10^(-SP.SNR(n)/10));
            Y_lfdma = Y_lfdma.*C;
        end

        EstSymbols_ifdma = ifft(Y_ifdma);
        EstSymbols_lfdma = ifft(Y_lfdma);
        
        EstSymbols_ifdma = sign(real(EstSymbols_ifdma)) + i*sign(imag(EstSymbols_ifdma));
        EstSymbols_ifdma = EstSymbols_ifdma/sqrt(2);
        EstSymbols_lfdma = sign(real(EstSymbols_lfdma)) + i*sign(imag(EstSymbols_lfdma));
        EstSymbols_lfdma = EstSymbols_lfdma/sqrt(2);

        I_ifdma = find((inputSymbols-EstSymbols_ifdma) == 0);
        errCount_ifdma = errCount_ifdma + (SP.inputBlockSize-length(I_ifdma));
        I_lfdma = find((inputSymbols-EstSymbols_lfdma) == 0);
        errCount_lfdma = errCount_lfdma + (SP.inputBlockSize-length(I_lfdma));
    end
    SER_ifdma(n,:) = errCount_ifdma / (SP.inputBlockSize*SP.numRun);
    SER_lfdma(n,:) = errCount_lfdma / (SP.inputBlockSize*SP.numRun);
    [SP.SNR(n) SER_ifdma(n,:) SER_lfdma(n,:)]
    toc
end
up4051

4.仿真结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值