首页 > 其他分享 >(49)MATLAB实现迫零均衡器原理与代码

(49)MATLAB实现迫零均衡器原理与代码

时间:2024-10-26 10:17:18浏览次数:7  
标签:49 optDelay MATLAB 均衡器 MSE 延迟 迫零

文章目录


前言

使用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.代码实现

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的卷积矩阵。
代码如下:

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

标签:49,optDelay,MATLAB,均衡器,MSE,延迟,迫零
From: https://blog.csdn.net/weixin_45333185/article/details/143246224

相关文章

  • 【芯智雲城】RICHTEK立锜RT949x系列 45W 充电方案,性能再提升!
    立锜推出可满足45W应用的Buck-Boost架构电池充电芯片RT9490/RT9492,以5A电流对2-4节串联锂离子/聚合物电池进行充电管理和系统电源路径管理,它采用低阻抗的功率开关,效率高,节省充电时间,延长电池放电时间,RT9490/RT9492的功能设置既是硬件引脚设置,也是软件寄存器设置。充电......
  • Study Plan For Algorithms - Part49
    1.交错字符串给定三个字符串s1、s2、s3,请验证s3是否是由s1和s2交错组成的。两个字符串s和t交错的定义与过程如下,其中每个字符串都会被分割成若干非空子字符串:s=s1+s2+...+snt=t1+t2+...+tm|n-m|<=1交错是s1+t1+s2+t2+s3+t3......
  • 代码随想录算法训练营day25| 491.递增子序列 46.全排列 47.全排列2
    学习资料:https://programmercarl.com/0491.递增子序列.html#算法公开课排列与组合的区别,不用startIndex,而每个树层都从0开始,但是要跳过已经用过的数(用used判断)学习记录:491.递增子序列(添加一个数组used(hash表),来保持数组每个位置上的数的使用情况,没用过为0,用过变成1)点击查看代......
  • 智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)
    智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)本期是平台君和您分享的第89期内容2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。起诉书(来源:RPX网站)看到这则新闻,平台君马......
  • 149. 直线上最多的点数
    给你一个数组 points ,其中 points[i]=[xi,yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例1:输入:points=[[1,1],[2,2],[3,3]]输出:3示例2:输入:points=[[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]输出:4 提示:1<=points.length<=300points[i].le......
  • Springboot计算机毕业设计滁州市电动车牌照管理系统cfc49
    Springboot计算机毕业设计滁州市电动车牌照管理系统本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,法律法规,车辆类型,牌照申请,可选牌号,上牌业务,上牌预约,选定牌号,挂失登记,牌照信息,牌照......
  • P9749 [CSP-J 2023] 公路 题解
    此题贪心食用更佳在输入油价的时候,我们边计算油价的最小值和路程和.当路程之和$>0$时,计算油价并且减去对应路程即可.注意事项要开$long$$long$!!!.代码#include<iostream>#include<cstdio>#include<cmath>#include<cstring>usingnamespacestd;typedeflonglo......
  • 题解:P10949 四叶草魔杖
    2024/10/16更新:修改了状态的枚举方式,时间复杂度变为\(O(3^n)\)。题目传送门前言本篇题解默认您已熟练掌握最小生成树、状压dp及其应用,如果您还不会,请先阅读相关博客。分析我们要选出一条边,通过边转移能量,使得所有宝石的能量都为\(0\)。这看上去挺麻烦的,让我们挖掘一......
  • P4921/P4931
    切不动了!!!#include<bits/stdc++.h>#definerep(i,a,b)for(inti=a;i<=b;++i)usingnamespacestd;inlineintread(){intx=0;boolf=0;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch......
  • MCP4921DAC芯片硬件设计及驱动代码(PIC单片机硬件SPI模式)
    MCP4921DAC芯片硬件设计及驱动代码(PIC单片机硬件SPI模式)MCP4921简介MCP4921是一款由MicrochipTechnology生产的单通道、12位数模转换器(DAC),具有外部电压参考引脚和SPI接口。它具有以下主要特点:12位分辨率:提供高精度的模拟输出。单通道电压输出:适用于需要单一......