对16-QAM信号使用前向纠错
此示例扩展了在16-QAM信号上使用脉冲整形示例显示使用前向纠错(FEC)编码时误码率(BER)性能的改善。
本例展示了如何通过使用由基带调制器、信道、解调器、脉冲整形、凸起余弦滤波和纠错组成的通信链路来处理二进制数据流。
建立仿真框架
在本例中,为实现更准确的误码率估计,要处理的比特数从中使用的值增加在16-QAM信号上使用脉冲整形的例子。其他模拟变量与该示例中的设置相匹配。
定义带有提升余弦滤波和AWGN信道的16-QAM调制方案的仿真参数。
M = 16;调制阶数k = log2(M);每个符号的比特数%numBits = k*2.5e5;要处理的总比特数SPS = 4;每个符号的样本百分比(过采样因子)Filtlen = 10;%以符号表示的过滤器长度滚落= 0.25;过滤器滚转系数
生成随机数据
设置rng
函数的默认状态,或任何静态种子值,以便示例产生可重复的结果。然后,使用兰迪
函数生成随机二进制数据。
rng默认的;使用默认的随机数生成器dataIn = randi([0 1],numBits,1);生成二进制数据向量
应用卷积编码
为了纠正噪声信道产生的错误,在传输前对数据进行卷积编码,对接收到的数据进行维特比解码。解码器使用硬决策算法,这意味着每个接收到的数据位都被解释为任意一种0
或1
.
函数为速率为2/3的代码定义卷积编码网格poly2trellis
函数。所定义的网格表示卷积代码convenc
函数用于对二进制向量进行编码,dataIn
.
Constrlen = [5 4];代码约束长度%Genpoly = [23 35 0;0 5 13]%生成器多项式
genpoly =2×323 35 0 0 5 13
tPoly = poly2trellis(constrlen,genpoly);codeRate = 2/3;
方法对输入数据进行编码房产申诉专员署
格子。
dataEnc = conc (dataIn,tPoly);
调整数据
使用bit2int
函数将k
-tuple将二进制数据编码为整数值。
dataSymbolsIn = bit2int(dataEnc,k);
使用qammod
功能应用16-QAM调制。
dataMod = qammod(dataSymbolsIn,M);
应用提升余弦滤波
使用rcosdesign
函数来创建一个RRC过滤器。
rrcFilter = rcosdesign(rolloff, fillen,sps);
使用upfirdn
函数通过过采样因子对信号进行上采样,并应用RRC滤波器。的upfirdn
函数垫上采样信号与零在结束冲洗滤波器。然后,函数应用筛选器。
txSignal = upfirdn(dataMod,rrcFilter,sps,1);
应用AWGN信道
使用每个符号的比特数(k
),以及每个符号的样本数目(sps
),将每位能量的比率转换为噪音功率谱密度(EbNo
)转换为信噪比值,供情况下
函数。当转换
对于信噪比,必须考虑每个符号的信息比特数。由于没有应用FEC,每个符号对应于k
位。应用FEC后,每个符号对应于(k
codeRate
)信息位。对于本例中使用的2/3码率和16-QAM传输,三个符号对应12个编码位和8个未编码(信息)位。
EbNo = 10;信噪比= EbNo+10*log10(k*codeRate)-10*log10(sps);
将滤波后的信号通过AWGN信道传递。
rxSignal = awgn(txSignal,snr,“测量”);
接收和解调信号
使用RRC滤波器对接收到的信号进行滤波。去除一部分信号来解释滤波器延迟。
rxFiltSignal =...upfirdn (rxSignal rrcFilter 1, sps);%下采样和过滤rxFiltSignal =...rxFiltSignal(filtlen + 1:end - filtlen);%延迟原因
使用qamdemod
函数来解调接收到的滤波信号。
dataSymbolsOut = qamdemod(rxFiltSignal,M);
应用维特比解码
使用int2bit
函数将恢复的整数符号转换为二进制数据。
codedDataOut = int2bit(dataSymbolsOut,k);返回列向量中的数据
使用vitdec
功能,配置为硬决策和连续操作模式,解码卷积编码的数据。连续操作模式在解码器被重复调用时维持内部状态,例如在循环中接收操作的数据帧时。连续操作模式也增加了系统的延迟。虽然这个例子没有使用循环,但是续
'模式用于说明如何补偿此解码操作中的延迟。
traceBack = 16;解码回溯长度numCodeWords =...地板(长度(codedDataOut) * 2/3);完整码字的百分比dataOut =...vitdec (codedDataOut (1: numCodeWords * 3/2),...传真照片,回溯,“合同”,“硬”);解码数据
计算系统误码率
由发送和接收RRC滤波器引入的延迟已经在恢复的数据中被考虑到,但是解码器延迟还没有被考虑。维特比解码器的连续操作模式会产生一个延迟,其持续时间等于回溯长度,回溯
,乘以编码器上的输入流的数量。对于本例中使用的2/3码率,编码器有两个输入流,因此延迟为2×回溯
位。因此,第一个2×回溯
解码矢量中的位,dataOut
,都是零。计算误码率时,丢弃前2×回溯
位在dataOut
最后一个2×回溯
原始向量中的位,dataIn
.
使用biterr
函数,通过比较计算错误数和误码率dataIn
而且dataOut
.是一样的
为10db,当处理链中包含FEC时,误差较小。
decDelay = 2*traceBack;%解码器延迟,以比特为单位(numErrors,误码率)=...biterr(dataIn(1:end - decDelay),dataOut(decDelay + 1:end));流(误码率为%5.2e,基于%d个错误。\n',...方方面面,numErrors)
误码率为4.30e-05,基于43个错误。
更多关于延迟
本例中的解码操作会引起延迟,导致解码器的输出滞后于输入。该示例中没有显式地显示计时信息,延迟的长度取决于正在执行的具体操作。延迟发生在各种通信系统操作中,包括卷积解码、卷积交织和解交织、均衡和滤波。具体功能或操作造成的延迟时间,请参见具体功能或操作的相关文档。有关延迟的详细信息,请参见卷积交织器的延迟而且衰落信道.