【IBDFE】基于IBDFE的频域均衡matlab仿真

1.软件版本

matlab2015b

2.IBDFE频域均衡方案

目前已有的IBDFE结构如下所示:

 

 

从结构可知,IBDFE由前馈滤波器和反馈滤波器构成,其中C和B表示前馈滤波器和反馈滤波器的系数。从现有的文献和资料上看,目前该结构在计算过程中,每一次迭代均需要进行系数的估计,从而增加了系统实现复杂度。针对问题,目前主要的研究成果例如LC-IBDFE等,其通过将判决信号中的误差与期望信号分离,从而降低了复杂度。但是类似LC-IBDFE的改进思路,其是基于每次迭代的误比特率相同且很小的假设的,实际中这种情况很难满足条件。另外就是在IBDFE中,出现信道严重衰落的时候,会导致过高的相关因子的估计,从而导致误差的扩散。针对这个问题,现有成果主要有联合信道估计和信道均衡的联合均衡算法。但是这样算法的复杂度又进一步增加。

3.部分源码

clc;
clear all;
close all;
warning off;
addpath 'func\'
rng('default');
rng(1);
Blk_size = 512; %数据块大小512
Chu_size = 64; %chu序列,大小64
NFrame = 1000;
SNR = [0:1:14]; %信噪比dB
Modsel = 2; %QPSK
Fs = 10*10^3; %采样率
Ts = 1/Fs;
Fc = 5*10^3; %载波频率
Fd = 10; %多普勒频移
tau = [0 0.5 0.5 1.2 1.2 2.1 2.1 3.3 3.3 4.8 4.8 6.5 6.5 8.5 10.8]*10^-4;
pdb = [0 -0.967 -0.967 -0.967 -1.933 -1.933 -1.933 -1.933 -2.900 -2.900 -2.900 -2.900 -2.86 -3.86 -3.84];
%信道模型
Channel = rayleighchan(Ts,Fd,tau,pdb);
%FFT变换
H_channel0 = fft(Channel.PathGains./sqrt(sum((abs(Channel.PathGains)).^2)),Blk_size+Chu_size+Chu_size);

%CHU序列
Chuseq = zeros(1,Chu_size);
for k = 0:Chu_size-1
tmps(k+1) = pi*k^2./Chu_size;
end
I = cos(tmps);
Q = sin(tmps);
Chuseq = I+sqrt(-1)*Q;
%误码率
%turbo参数
Mss = 295;
for n = 1:length(SNR)
ErrMMSE = 0;
for k = 1:NFrame
[n,k]
rng(k);
%随机
Tdin = randint(1,Mss);
%利用turbo的交织器,构建TB-DEF,三路输出
output = [func_turbo_code(Tdin)];
output = reshape(output, 1, []);
seridata1 = [output,0,0];

%调制
Data = modulation(seridata1,Modsel);
Tx = [Chuseq,Data,Chuseq];
Channel0 = Channel.PathGains./sqrt(sum((abs(Channel.PathGains)).^2));
Rx1 = filter(Channel0,1,Tx);
Rx2 = awgn(Rx1,SNR(n),'measured');
Rx3 = Rx2;%(Chu_size+1:Chu_size+Blk_size);
H_channel = H_channel0;
%频域均衡
Y = fft(Rx3,Blk_size+Chu_size+Chu_size);
Wk = conj(H_channel)./(H_channel.*conj(H_channel)+10^(-SNR(n)/10));
Zk = Y.*Wk;
Qk = zeros(size(Zk));
Bk = (Blk_size-Chu_size)*(abs(H_channel).^2+10^(-SNR(n)/10))./(sum(abs(H_channel).^2+10^(-SNR(n)/10)))-1;
P = 5;
%调用CNN神经网络的输出权值
load CNNmodel.mat
Iter = 5;
for iter = 1:Iter
Wk = conj(H_channel)./(H_channel.*conj(H_channel)+10^(-SNR(n)/10)/P).*(1+Bk);
Zk = Y.*Wk;
Uk = Zk-Qk;
RxMMSE0 = ifft(Uk,Blk_size+Chu_size+Chu_size);
xn = sign(real(RxMMSE0))+sqrt(-1)*sign(imag(RxMMSE0));
%去UW
RxMMSE1 = xn(Chu_size+1:Blk_size);
%进行判决
RxMMSE = demodulation(RxMMSE1,Modsel);
Tdecode = round(func_turbo_decode(2*RxMMSE(1:end-2)-1));
tmps = Tdecode;

XK = fft([tmps,Chuseq],length(RxMMSE1));
%调用CNN深度学习神经网络,计算Bk值
Bk0 =([H_channel.*conj(H_channel)]+10^(-SNR(n)/10)/P)/(mean(([H_channel.*conj(H_channel)]+10^(-SNR(n)/10)/P)))/(Blk_size)-1;
Bk = func_CNN(H_channel,Bk0,cnn);
Qk = [XK,ones(1,192)].*Bk;
end
CrrMMSE = find((Tdin-Tdecode) == 0);
ErrMMSE = ErrMMSE+(Mss-length(CrrMMSE));
end
%统计误码率
errors(n) = ErrMMSE/(Mss*NFrame*Modsel);
end
figure
semilogy(SNR,errors,'b-o');
hold on;
grid on;
xlabel('信噪比SNR(dB)')
ylabel('误码率SBR')
save R1.mat SNR errors

4.仿真结果

 

 A1-169

posted @ 2022-12-21 23:57  fpga和matlab  阅读(46)  评论(0编辑  收藏  举报