文章目录
前言
使用MATLAB实现迫零均衡器。给出完整的MATLAB设计源代码。
一、迫零均衡器设计说明
理想的迫零均衡器有无限多个抽头权系数,是不能实现的,本文考虑有2M+1个抽头权系数的横向线性均衡滤波器。具体理论推导可以参考《现代数字信号处理》方面的书籍。
最小二乘法可用于求解形式为Hw=δk0的超定线性方程组,即H矩阵是一个矩形(L+N−1)×N矩阵,其中方程多于未知数((L+N-1)>N)。
当H的列线性独立时,迫零均衡器系数w的解是唯一的,由下式给出:
ZF均衡器的MSE可以写成:
使MSE最小化的最佳延迟只是矩阵HH+的最大对角元素的索引:
下面给出这个例子的MATLAB源代码。
二、迫零均衡器MATLAB源代码
1.函数说明
【函数功能】
为给定的信道冲激响应h设计一个迫零均衡器w,期望的均衡器长度为N,均衡器延迟为delay。
同时返回均衡器误差(err)和最佳优化延迟(optDelay),该延迟对于设计的均衡器可能效果最好。
【参数说明】
h - 给定的信道冲激响应。
N - 期望的均衡器长度,即抽头数。
辅助参数varargin - 均衡器延迟(delay),可选参数。
【返回值说明】
w - 所设计的迫零均衡器。
err - 均衡器误差。
optDelay - 最佳优化延迟,该延迟对于设计的均衡器可能性能最好。
2.代码实现
c
function [w,err,optDelay] = zf_equalizer(h,N,varargin)
h = h'; % 信道冲激响应
L = length(h); % 信道冲激响应的长度
H = convMatrix(h,N); % 生成卷积矩阵
% 基于MSE计算最优时延
Hp = inv(H'*H)*H'; % 求Moore Penrose伪逆
[~,optDelay] = max(diag(H*Hp)); % 基于MSE计算最优时延
optDelay = optDelay - 1; % MATLAB索引从1开始
if nargin == 2
k0 = optDelay;
elseif nargin == 3 % 第3个参数是设置的固定延迟
delay = varargin{1};
if delay >=(L+N-1)
error('Too large delay!');
end
k0 = delay; % 此时,均衡器的延迟k0使用所设置的延迟
else
error('The number of actual parameters is incorrect.');
end
d = zeros(N+L-1,1);
d(k0+1) = 1; % 均衡器最优延迟的位置
w = Hp*d; % 最小二乘法解
MSE = 1 - d'*H*Hp*d; % 均方误差
err = MSE;
end
3.辅助函数
函数功能:从大小为N的输入矩阵h构造大小为(N+p-1)x p的卷积矩阵。
代码如下:
c
function [H]=convMatrix(h,p)
h = h(:).';
col = [h zeros(1,p-1)];
row = [h(1) zeros(1,p-1)];
H = toeplitz(col,row);
end