目录
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