文章目录
前言
使用MATLAB对迫零均衡器系统进行建模仿真,完整的MATLAB设计源代码形式给出设计方法和仿真结果。
一、迫零均衡器性能仿真说明
首先定义信道的冲激响应,对其进行符号间隔采样得到离散信道的冲激响应模型。
其次,为给定信道设计迫零均衡器,找到给定信道冲激响应的均衡器系数。
然后,(1)使用均衡器对接收信号的均衡,(2)计算信道和均衡器的总体响应(即查看的是均衡器对信道的补偿结果)。
最后,给出仿真的结果画图。
设定信道响应长度为L=13,因此需要长度N>L的迫零强制滤波器。仿真中,将迫零滤波器的长度固定为N=14。
下面给出仿真模型的MATLAB源代码。
二、迫零均衡器系统建模与性能仿真代码
1.仿真代码
代码如下:
c
%% 系统参数
nSamp = 5; % 每个符号的采样数
fs = 100; % 采样率
Ts = 1/fs; % 采样间隔
Tsym = nSamp*Ts; % 符号宽度,也是符号间隔
%% 信道------定义信道的冲激响应
% 1.采样间隔信道响应(连续时间信道模型)
k = 6; % 信道响应使码元波形前后各扩展到第k个码元
t = -k*Tsym:Ts:k*Tsym; % 信道的时基定义在[-kTsym,+kTsym]上
h_t = 1./(1+(0.6*t/Tsym).^2); % 定义一种信道模型,该信道模型可替换为其他所需模型
sigma = 0.001; % AWGN信道噪声的标准差
noise = sigma*randn(1,length(h_t)); % AWGN信道噪声
h_t = h_t + noise; % 信道响应加高斯白噪声
% 2.符号间隔信道响应(离散时间信道模型)
h_k = h_t(1:nSamp:end);
t_k = t(1:nSamp:end); % 符号采样时刻
% L = length(t_k); % 信道频率响应长度
figure()
plot(t,h_t,'LineWidth',1.5) % 每个采样点时刻的信道响应,采样间隔
grid on
hold on
stem(t_k,h_k,'r','LineWidth',1.5) % 每个符号最佳采样时刻的信道响应,符号间隔
legend('continuous-time model','discrete-time model')
title('Channel impulse response')
xlabel('Time (s)')
ylabel('Amplitude')
% xlim([-0.3 0.3])
ylim([0 1.1])
%% 迫零均衡器设计
nTaps = 14; % 均衡滤波器所需的抽头数量
delay = 13; % 设定的均衡器延时
% 为给定信道设计迫零均衡器,找到给定信道冲激响应的均衡器系数
% [w,error,k0] = zf_equalizer(h_k,nTaps,delay); % 使用设定的均衡器延时
[w,error,k0] = zf_equalizer(h_k,nTaps); % 使用均衡器最优延时
%% 均衡滤波
r_k = h_k; % 以信道响应作为输入测试均衡器
d_k = conv(w,r_k);
h_sys = conv(w,h_k);
% 信道、均衡器和整个系统的频率响应
[h_channel, w1] = freqz(h_k); % 信道的频率响应
[h_equalizer, w2] = freqz(w); % 均衡器的频率响应
[h_system ,w3] = freqz(h_sys); % 整个系统的频率响应
%% 画图
% (1)频率响应
figure();
plot(w1/pi,20*log(abs(h_channel)/max(abs(h_channel))),'g','LineWidth',1.5);
hold on;
plot(w2/pi,20*log(abs(h_equalizer)/max(abs(h_equalizer))),'r','LineWidth',1.5);
plot(w3/pi,20*log(abs(h_system)/max(abs(h_system))),'b','LineWidth',1.5);
grid on
legend('信道频响','迫零均衡器频响','系统整体频响','Location','south');
title('频率响应');
ylabel('幅度(dB)');
xlabel('归一化频率(x \pi rad/sample)');
% (2)均衡器输入与输出
figure(); % 绘制均衡器输入和输出(时域响应)
subplot(2,1,1);
% stem(0:1:length(r_k)-1,r_k);
stem(r_k,'LineWidth',1.5);
grid on;
title(['均衡器输入(序列长度L =',num2str(length(r_k)),')']);
xlabel('Samples');
ylabel('Amplitude');
subplot(2,1,2);
% stem(0:1:length(d_k)-1,d_k);
stem(d_k,'LineWidth',1.5);
grid on;
title(['均衡器输出(均衡器抽头数nTaps=',num2str(nTaps), ...
',均衡器输出序列长度=nTaps+L-1=',num2str(nTaps+length(r_k)-1),')']);
xlabel('Samples');
ylabel('Amplitude');
2.代码说明
代码中以下两行的输入数值和计算结果的数值完全相等:
d_k = conv(w,r_k);
h_sys = conv(w,h_k);
虽然这两行代码计算结果数值上完全相同,但其所代表的意义却完全不同:
第一行表示均衡器对接收信号的均衡;
第二行表示信道和均衡器的总体响应,用于查看并评估均衡器对信道的补偿效果。
3.迫零均衡器zf_equalizer的MATLAB源码
上述仿真中使用了迫零均衡器zf_equalizer的MATLAB,其源码见:
(49)MATLAB实现迫零均衡器原理与代码