`
xpp02
  • 浏览: 1072205 次
社区版块
存档分类
最新评论

业务层资源国际化处理

阅读更多

 

用过struts2等mvc框架开发的同学都知道,使用struts2处理国际化的消息非常简单直观,但是mvc框架的定位是在展示层(jsp,action)等,在一个典型的3层结构中,处于最上层的位置,按照分层设计原则,下层组件是不可以调用上层组件的,这样就存在一个问题,我们在业务层中可能也会出现一些需要国际化处理的消息信息,这些信息如何设置呢?

     在这篇文章中,我们将借鉴struts2的国际化处理机制,但是要比struts2简单的多,因为业务层需要国际化处理的消息毕竟是少数,废话不多说,直接上干货

先举个例子-业务层未国际化处理前的代码

 

  1. @Override  
  2.   public ExecuteResult<User> login(String userName, String password) {  
  3.       ExecuteResult<User> executeResult = new ExecuteResult<User>();  
  4.       User userInfo = userDAO.getUserByName(userName);  
  5.       if(userInfo == null){  
  6.           executeResult.addErrorMessage("不存在的用户名");  
  7.           return executeResult;  
  8.       }  
  9.       if(!userInfo.getPassword().equals(password)){  
  10.           executeResult.addErrorMessage("密码错误");  
  11.           return executeResult;  
  12.       }  
  13.       executeResult.setResult(userInfo);  
  14.       return executeResult;  
  15.   }  

设计实现:

 

1.添加国际化消息拦截器

我们的应用是基于struts2的,struts2默认提供了一个i18n拦截器,这里我们扩展了以下该拦截器的功能,将locale信息保存起来

 

  1. /** 
  2.  * 扩展struts2默认的i18n拦截器,添加设置local到LocaleContextHolder中的功能 
  3.  * @author WangXuzheng 
  4.  * @see com.opensymphony.xwork2.interceptor.I18nInterceptor 
  5.  * @see org.springframework.context.i18n.LocaleContextHolder 
  6.  */  
  7. public class I18nResolverInterceptor extends I18nInterceptor {  
  8.     private static final long serialVersionUID = 5888969294461266478L;  
  9.     @Override  
  10.     protected void saveLocale(ActionInvocation invocation, Locale locale) {  
  11.         super.saveLocale(invocation, locale);  
  12.         LocaleContextHolder.setLocale(locale);  
  13.     }  
  14. }  

2.在struts.xml中替换默认的i18n拦截器

 

 

  1. <interceptor name="i18n" class="com.haier.openplatform.i18n.interceptor.I18nResolverInterceptor"/>  

3.设计业务层国际化资源解析器接口

 

 

  1. /** 
  2.  * 国际化资源处理器 
  3.  * @author WangXuzheng 
  4.  * 
  5.  */  
  6. public interface I18nResolver {  
  7.     /** 
  8.      * 设置要进行资源处理的目标类 
  9.      * @param clazz 
  10.      */  
  11.     @SuppressWarnings("rawtypes")  
  12.     public void setClass(Class clazz);  
  13.     /** 
  14.      * 解析国际化资源文件,如果找不到该code,返回默认的消息 
  15.      * @param code i18n资源的key值 
  16.      * @return 如果找到返回具体的消息值,如果不存在返回默认消息 
  17.      * @see java.text.MessageFormat 
  18.      */  
  19.     String getMessage(String code);  
  20.       
  21.     /** 
  22.      * 解析国际化资源文件,如果找不到该code,返回默认的消息 
  23.      * @param code i18n资源的key值 
  24.      * @return 如果找到返回具体的消息值,如果不存在返回默认消息 
  25.      * @see java.text.MessageFormat 
  26.      */  
  27.     String getMessage(String code,String arg);  
  28.     /** 
  29.      * 解析国际化资源文件,如果找不到该code,返回默认的消息 
  30.      * @param code i18n资源的key值 
  31.      * @param args 资源中的变量值 
  32.      * @param defaultMessage 默认消息 
  33.      * @return 如果找到返回具体的消息值,如果不存在返回默认消息 
  34.      * @see java.text.MessageFormat 
  35.      */  
  36.     String getMessage(String code, Object[] args, String defaultMessage);  
  37.     /** 
  38.      * 解析国际化资源文件查找指定code对应的消息,如果不存在,抛出异常 
  39.      * @param code 
  40.      * @param args 
  41.      * @return 
  42.      * @throws MessageNotFoundException 
  43.      * @see java.text.MessageFormat 
  44.      * @throws MessageNotFoundException 
  45.      */  
  46.     String getMessage(String code, Object[] args);  
  47. }  

默认的实现类-这里我们的资源配置文件放在和待处理的类同文件下同名的.properties文件中

 

例如:java类

 

com.haier.openplatform.showcase.security.service.impl.UserServiceImpl

 对应的资源文件为

com/haier/openplatform/showcase/security/service/impl/UserServiceImpl_zh_CN.properties

com/haier/openplatform/showcase/security/service/impl/UserServiceImpl_en_US.properties

 

  1. /** 
  2.  * 默认的资源文件解析器,该类读取<code>org.springframework.context.i18n.LocaleContextHolder</code>中保存的Local信息解析资源文件 
  3.  * @author WangXuzheng 
  4.  * @see org.springframework.context.i18n.LocaleContextHolder 
  5.  */  
  6. public class DefaultI18nResolver extends MessageSourceSupport implements I18nResolver {  
  7.     private static final ConcurrentMap<String, ResourceBundle> BUNDLE_MAP = new ConcurrentHashMap<String, ResourceBundle>();  
  8.     private static final List<String> DEFAULT_RESOURCE_BUNDLES = new CopyOnWriteArrayList<String>();  
  9.     private static final Log LOG = LogFactory.getLog(DefaultI18nResolver.class);  
  10.     @SuppressWarnings("rawtypes")  
  11.     protected Class clazz;  
  12.     /** 
  13.      * 添加全局资源配置信息 
  14.      * 
  15.      * @param resourceBundleName the name of the bundle to add. 
  16.      */  
  17.     public static void addDefaultResourceBundle(String resourceBundleName) {  
  18.         //make sure this doesn't get added more than once  
  19.         synchronized (DEFAULT_RESOURCE_BUNDLES) {  
  20.             DEFAULT_RESOURCE_BUNDLES.remove(resourceBundleName);  
  21.             DEFAULT_RESOURCE_BUNDLES.add(0, resourceBundleName);  
  22.         }  
  23.   
  24.         if (LOG.isDebugEnabled()) {  
  25.             LOG.debug("Added default resource bundle '" + resourceBundleName + "' to default resource bundles = "  
  26.                     + DEFAULT_RESOURCE_BUNDLES);  
  27.         }  
  28.     }  
  29.   
  30.     /** 
  31.      * Creates a key to used for lookup/storing in the bundle misses cache. 
  32.      * 
  33.      * @param aBundleName the name of the bundle (usually it's FQN classname). 
  34.      * @param locale      the locale. 
  35.      * @return the key to use for lookup/storing in the bundle misses cache. 
  36.      */  
  37.     private String createMissesKey(String aBundleName, Locale locale) {  
  38.         return aBundleName + "_" + locale.toString();  
  39.     }  
  40.   
  41.     /** 
  42.      * 从全局资源文件中读取文案信息 
  43.      * 
  44.      * @param aTextName 文案 key 
  45.      * @param locale    the locale the message should be for 
  46.      * @return  
  47.      */  
  48.     private String findDefaultText(String aTextName, Locale locale) {  
  49.         List<String> localList = DEFAULT_RESOURCE_BUNDLES;  
  50.         for (String bundleName : localList) {  
  51.             ResourceBundle bundle = findResourceBundle(bundleName, locale);  
  52.             if (bundle != null) {  
  53.                 try {  
  54.                     return bundle.getString(aTextName);  
  55.                 } catch (MissingResourceException e) {  
  56.                     // ignore and try others  
  57.                 }  
  58.             }  
  59.         }  
  60.         return null;  
  61.     }  
  62.   
  63.     /** 
  64.      * 根据资源名称和locale信息查找资源信息 
  65.      * @param aBundleName the name of the bundle (usually it's FQN classname). 
  66.      * @param locale      the locale. 
  67.      * @return the bundle, <tt>null</tt> if not found. 
  68.      */  
  69.     protected ResourceBundle findResourceBundle(String aBundleName, Locale locale) {  
  70.         String key = createMissesKey(aBundleName, locale);  
  71.         ResourceBundle bundle = BUNDLE_MAP.get(key);  
  72.         if (bundle == null) {  
  73.             bundle = ResourceBundle.getBundle(aBundleName, locale, Thread.currentThread().getContextClassLoader());  
  74.             BUNDLE_MAP.put(key, bundle);  
  75.         }  
  76.         return bundle;  
  77.     }  
  78.   
  79.     private Locale getLocale() {  
  80.         return LocaleContextHolder.getLocale();  
  81.     }  
  82.   
  83.     @Override  
  84.     public String getMessage(String code) {  
  85.         return getMessage(code, new Object[] {});  
  86.     }  
  87.   
  88.     /** 
  89.      * 获取资源消息对应的值,先从指定的bundleName的资源中获取文案,如果找不到,从globalResources中读取 
  90.      * @param bundleName 
  91.      * @param locale 
  92.      * @param key 
  93.      * @param args 
  94.      * @return 
  95.      * @see #findResourceBundle 
  96.      */  
  97.     private String getMessage(String bundleName, Locale locale, String key, Object[] args) {  
  98.         ResourceBundle bundle = findResourceBundle(bundleName, locale);  
  99.         if (bundle == null) {  
  100.             return null;  
  101.         }  
  102.   
  103.         String orginalMessage = null;  
  104.         try {  
  105.             orginalMessage = bundle.getString(key);  
  106.         } catch (MissingResourceException e) {  
  107.             // read text from global resources  
  108.             orginalMessage = findDefaultText(bundleName, locale);  
  109.         }  
  110.         return this.formatMessage(orginalMessage, args, locale);  
  111.     }  
  112.   
  113.     @Override  
  114.     public String getMessage(String code, Object[] args) {  
  115.         return getMessage(resolveBunFile(), getLocale(), code, args);  
  116.     }  
  117.   
  118.     @Override  
  119.     public String getMessage(String code, Object[] args, String defaultMessage) {  
  120.         return StringUtils.defaultIfBlank(getMessage(code, args), defaultMessage);  
  121.     }  
  122.   
  123.     @Override  
  124.     public String getMessage(String code, String arg) {  
  125.         String[] args = new String[] { arg };  
  126.         return getMessage(code, args);  
  127.     }  
  128.   
  129.     protected String resolveBunFile() {  
  130.         String pack = this.clazz.getName();  
  131.         return pack.replaceAll("[.]""/");  
  132.     }  
  133.   
  134.     @SuppressWarnings("rawtypes")  
  135.     public void setClass(Class clazz) {  
  136.         this.clazz = clazz;  
  137.     }  
  138. }  

加一个静态工厂类来获取解析器

 

 

  1. /** 
  2.  * 资源解析器工厂类 
  3.  * @author WangXuzheng 
  4.  * 
  5.  */  
  6. public final class I18nResolverFactory {  
  7.     @SuppressWarnings("rawtypes")  
  8.     private static final ConcurrentMap<Class, I18nResolver> I18N_RESOVER_MAP = new ConcurrentHashMap<Class, I18nResolver>();  
  9.     private I18nResolverFactory(){  
  10.     }  
  11.       
  12.     @SuppressWarnings("rawtypes")  
  13.     public static I18nResolver getDefaultI18nResolver(Class clazz){  
  14.         I18nResolver resolver = I18N_RESOVER_MAP.get(clazz);  
  15.         if(resolver == null){  
  16.             resolver = new DefaultI18nResolver();  
  17.             resolver.setClass(clazz);  
  18.             I18N_RESOVER_MAP.put(clazz, resolver);  
  19.         }  
  20.         return resolver;  
  21.     }  
  22. }  

4.调用实现-非常类似log4j的调用方式

  1. public class UserServiceImpl implements UserService {  
  2.     private static final I18nResolver I18N_RESOLVER = I18nResolverFactory.getDefaultI18nResolver(UserServiceImpl.class);  
  3.     private UserDAO userDAO;  
  4.     private RoleDAO roleDAO;  
  5.   
  6. @Override  
  7.     public ExecuteResult<User> login(String userName, String password) {  
  8.         ExecuteResult<User> executeResult = new ExecuteResult<User>();  
  9.         User userInfo = userDAO.getUserByName(userName);  
  10.         if(userInfo == null){  
  11.             executeResult.addErrorMessage( I18N_RESOLVER.getMessage("user.notexisted"));  
  12.             return executeResult;  
  13.         }  
  14.         if(!userInfo.getPassword().equals(password)){  
  15.             executeResult.addErrorMessage(I18N_RESOLVER.getMessage("user.wrongpassword"));  
  16.             return executeResult;  
  17.         }  
  18.         executeResult.setResult(userInfo);  
  19.         return executeResult;  
  20.     }  

更多信息请查看 java进阶网 http://www.javady.com/index.php/category/thread

分享到:
评论

相关推荐

    3.4.7-卡尔曼滤波与运动估计算法介绍和使用 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数字识.md

    3.4.7-卡尔曼滤波与运动估计算法介绍和使用 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数字识

    【MATLAB编程】MATLAB高级编程技巧全解析:数据结构、高效编程、可视化与并行计算

    内容概要:本文档详细介绍了MATLAB的高级编程技巧,涵盖高级数据结构与操作、高效编程与优化、高级可视化技术、并行计算与GPU编程、代码调试与性能分析以及高级算法与数值方法六个主要部分。具体内容包括细胞数组和结构体的创建与使用、面向对象编程、向量化

    一个用于设计和测试单点海洋系泊的工具-MATLAB

    用于设计和测试受洋流和风影响的单点海洋系泊设备。提供的数据库(可以添加到)将允许您在典型的当前条件下构建系泊并对其进行测试,或者通过电流剖面的时间序列迫使其生成系泊形状和组件位置的时间序列。该程序为地下和地面系泊提供了解决方案,甚至可以预测地面系泊何时被淹没。将溶液上下翻转,它还模拟了拖曳体,在拖曳体中,一个负浮力(重)体被拖在一艘移动的船后面(有一个立管下沉器)。如果聚焦电流剖面随时间变化(即来自ADCP),则会保存/访问系泊组件位置和形状的动画(电影)或时间(序列)历史。系泊装置可以保存和取回

    C++ 无锁队列,目前测试10线程读,10线程写无误

    基于C++的无锁队列,有信号量,可以阻塞读、写线程,目前测试10线程读,10线程写是没有问题的

    混合动力汽车拥堵路况下基于ECMS算法的节能动力总成控制研究与实现

    内容概要:本文详细介绍了混合动力汽车在交通拥堵情况下采用等效燃油消耗最小策略(ECMS)进行节能控制的研究与实现。通过MATLAB代码展示了如何模拟前车速度、跟车策略以及能量管理系统的工作原理。文中提到,ECMS算法能够根据实时速度、加速度和电池状态等因素动态调整发动机和电动机之间的能量分配,从而达到最佳的燃油经济性和排放性能。此外,文章还讨论了安全距离模型、动能回收机制以及应对突发情况的具体措施,如急减速时的能量管理和电池温度保护等。 适合人群:从事汽车工程、自动化控制领域的研究人员和技术人员,尤其是关注混合动力汽车节能技术的专业人士。 使用场景及目标:适用于希望深入了解混合动力汽车在复杂城市交通环境中的节能控制策略及其具体实施方法的人群。目标是在理论层面掌握ECMS算法的核心思想,并能够在实践中应用相关技术和工具进行验证。 其他说明:文章不仅提供了详细的代码示例,还分享了一些实用的操作技巧和经验教训,帮助读者更好地理解和运用这一先进技术。

    环形队列的一种实现方式

    环形队列的一种实现方式

    2005-2019年各地级市绿色专利申请量数据

    2005-2019年各地级市绿色专利申请量数据 1、时间2005-2019年 2、来源:国家知识产权j 3、指标:省份、城市、年份、绿色发明专利申请量、绿色实用新型专利申请量 4、范围:360+地级市

    (源码)基于C语言的WebP图片编码解码库.zip

    # 基于C语言的WebP图片编码解码库 ## 项目简介 本项目是一个基于C语言的WebP图片编码解码库。WebP是一种现代开源图像格式,支持无损和有损压缩,在保持图像质量的同时能显著减少图像文件大小,加快传输速度。此库实现了WebP格式的核心编码解码功能,还支持动画WebP图像的编码和组装,以及颜色空间转换、图像缩放等辅助功能,适用于网页开发、图像处理软件、视频编辑工具等多种应用场景。 ## 项目的主要特性和功能 1. 高性能采用优化算法和指令集(如SSE2、NEON、MIPS等)加速编码解码过程。 2. 灵活性支持多种图像格式(如RGB、YUV)和颜色空间转换。 3. 支持动画可编码和组装WebP格式的动画图像。 4. 内存管理提供安全的内存分配和释放函数,防止内存泄漏。 5. 错误处理具备错误报告和处理机制,确保程序的健壮性。 6. 核心功能实现图像分析、预测、变换、量化、反变换等编码解码步骤,并提供进度报告机制。 ## 安装使用步骤

    基于电影知识图谱和微信小程序的智能问答系统新版源码+说明.zip

    本资源是《基于电影知识图谱和微信小程序的智能问答系统新版源码+说明.zip》,专为计算机科学领域的学习者设计,融合了人工智能、数据管理和前端应用开发的先进技术。通过构建电影知识图谱,该系统能够深度理解和处理用户的电影相关查询,提供精准且丰富的答案。微信小程序作为前端交互平台,以其便捷性和广泛覆盖性,让用户随时随地享受智能化的电影信息服务。此资源不仅是课程设计和毕业设计的理想选择,也为开发者提供了实践前沿技术的机会,助力提升编程能力和项目经验。请务必用于学习和研究目的,不得用于商业用途。

    (源码)基于TensorFlow的GAN图像生成项目SteGANography.zip

    # 基于TensorFlow的GAN图像生成项目SteGANography ## 项目简介 本项目是一个基于TensorFlow深度学习框架的图像生成项目,主要利用生成对抗网络(GAN)进行图像混淆与恢复的研究。项目名称中的“Ste”代表Steganography(隐写术),是一种隐藏信息的技术。本项目的目的是利用神经网络将信息嵌入图像中,然后再恢复出来。这涉及到图像生成、加密和解密的过程。 ## 主要功能及特点 利用GAN生成混淆图像。 通过对混淆图像进行解码恢复原始图像。 包含Alice、Bob和Eve三个网络部分,分别负责生成、处理和识别图像。 提供了可视化的功能,能够绘制关于训练迭代与位错误之间的关系图。 可配置的训练参数,包括学习率、迭代次数等。 提供了模型保存和恢复的机制,便于训练中断后继续训练或在不同任务间迁移模型。 ## 安装与运行 ### 环境依赖 Python 3.x

    (源码)基于Arduino的环境监测系统.zip

    # 基于Arduino的环境监测系统 ## 项目简介 本项目是一个基于Arduino的环境监测系统,主要用于收集并保存环境数据,如温度、湿度、降雨量、气体值和风速等。通过使用Arduino平台和多种传感器,实现数据的实时采集、处理和存储。 ## 项目的主要特性和功能 1. 数据采集通过Arduino板连接多种环境传感器,实时采集环境数据。 2. 数据处理对采集的数据进行本地处理,如温度湿度的转换等。 3. 数据存储将处理后的数据保存到SD卡或其他存储设备中,以便于后续分析。 4. 数据传输通过串行通信或无线通信模块将数据发送到计算机或其他设备。 ## 安装使用步骤 1. 硬件准备准备Arduino板、环境传感器(如DHT温湿度传感器)、SD卡模块等硬件。 2. 软件准备安装Arduino IDE,并下载项目代码。 3. 传感器连接将传感器连接到Arduino板的相应引脚。 4. 代码上传将项目代码上传到Arduino板。

    100kw模块式三相光伏并网逆变器方案:原理图、PCB、源码及元器件详解

    内容概要:本文详细介绍了100kw模块式三相光伏并网逆变器的整体设计方案,涵盖功率接口板、主控DSP板、驱动扩展板及其逆变器并联仿真的各个方面。首先,文章阐述了功率接口板的原理图和PCB设计,解释了各个元件的作用及其选择依据。接着,重点讲解了主控DSP板的原理图、元器件明细表及核心代码,特别是PID控制算法的应用。然后,探讨了驱动扩展板的设计要点,包括驱动芯片的选择和PCB布局技巧。最后,分析了逆变器并联仿真文件,讨论了环流抑制算法及其效果。 适合人群:具备一定电子工程和嵌入式系统基础知识的专业人士,尤其是从事光伏逆变器及相关电力电子设备的研发工程师和技术爱好者。 使用场景及目标:①帮助读者深入了解100kw模块式三相光伏并网逆变器的工作原理和设计思路;②为实际项目开发提供详尽的技术参考资料,包括原理图、PCB设计、源码及元器件选择;③通过实例代码和仿真分析,提升读者解决复杂控制系统问题的能力。 其他说明:文中不仅提供了理论知识,还分享了许多实际设计中的经验和技巧,如PCB布线注意事项、元件选型标准、代码优化方法等,有助于读者更好地理解和应用所学内容。

    (源码)基于Python和OpenAI的微信智能聊天机器人.zip

    # 基于Python和OpenAI的微信智能聊天机器人 ## 项目简介 本项目是一个基于Python和OpenAI的微信智能聊天机器人,能够将微信打造成一个智能对话平台。通过集成OpenAI的ChatGPT模型,机器人可以进行智能对话,支持多轮会话上下文记忆、语音识别、图片生成等功能。此外,项目还支持多种插件扩展,如多角色切换、文字冒险游戏、敏感词过滤等,极大地丰富了用户的互动体验。 ## 主要特性和功能 多端部署支持个人微信、微信公众号和企业微信应用等多种部署方式。 智能对话支持私聊及群聊的智能回复,支持多轮会话上下文记忆,支持GPT3、GPT3.5、GPT4模型。 语音识别支持语音消息的识别与回复,支持Azure、Baidu、Google、OpenAI等多种语音模型。 图片生成支持图片生成和图生图功能,支持DALLE、Stable Diffusion、Replicate等模型。

    图表组件(柱状图、折线图、饼图、雷达图...)微信小程序源码.zip

    微信小程序图表组件源码简介 这份资源是精心整理的微信小程序图表组件源码包,涵盖了柱状图、折线图、饼图、雷达图等多种常见且实用的图表类型。在当今数据可视化盛行的时代,无论是商业数据分析、项目进度展示,还是日常信息统计,这些图表都起着关键作用。 对于微信小程序开发者而言,这无疑是一份极具价值的学习宝藏。它提供了现成的图表实现代码,能帮助开发者深入理解不同图表在小程序中的构建逻辑与交互方式,快速掌握如何将数据以直观的图表形式呈现给用户,从而提升小程序的用户体验与功能性。通过研究这些源码,开发者可以学习到图表绘制的技巧、数据处理的方法以及与小程序其他组件协同工作的方式,为开发更复杂、更专业的小程序应用奠定坚实基础,加速开发进程,少走弯路,进而打造出功能完备、界面美观且数据展示清晰的优质小程序产品,满足用户多样化的数据可视化需求。总之,这是一份不可多得的学习资源,助力开发者在微信小程序开发领域不断进步。

    幼儿园招生报名小程序源码(幼儿家长可以填写幼儿的基本信息,住址信息,监护人信息等资料(可自定义设置), 园方人员根据资料可以做预先审核,并提示用户修改完善资料,并可查看和导出名单).zip

    《幼儿园招生报名小程序源码简介》 本资源是一份极具实用价值的幼儿园招生报名小程序源码。它为幼儿园的招生工作提供了高效便捷的解决方案,同时也方便家长进行报名操作。 在功能方面,幼儿家长能够通过该小程序填写丰富的信息,涵盖幼儿的基本信息、住址信息以及监护人信息等各类必要资料,且这些资料可根据实际需求进行灵活的自定义设置,满足不同幼儿园的个性化要求。园方人员则拥有强大的管理权限,可依据家长提交的资料进行预先审核,若发现资料不完善或存在问题,能及时提示用户修改,确保信息的准确性和完整性。此外,园方还能方便地查看所有报名名单,并支持将名单导出,便于后续的整理和统计工作。 需要强调的是,此资源仅为学习资源,旨在帮助开发者学习和研究相关技术,不应用于商业用途。

    4.1 openmv相关资料如何查找 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv.md

    4.1 openmv相关资料如何查找 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv

    基于FPGA的自适应滤波器设计:FIR/IIR滤波器与LMS/NLMS/RLS/FxLMS算法及分数阶滤波器的应用

    内容概要:本文详细介绍了基于FPGA实现自适应滤波器的方法和技术细节。首先概述了自适应滤波器的基本概念及其重要性,接着深入探讨了FIR(有限冲激响应)和IIR(无限冲激响应)滤波器的工作原理和应用场景。文中提供了具体的Verilog代码示例,展示了如何在FPGA上实现这两种类型的滤波器。随后,文章讨论了几种常见的自适应算法,如LMS(最小均方)、NLMS(归一化最小均方)、RLS(递归最小二乘)和FxLMS(Filtered-x LMS),并解释了它们各自的优缺点及适用范围。此外,文章还介绍了分数阶自适应滤波器的概念及其独特优势,特别是在处理非平稳信号方面的表现。最后,文章分享了一些实用的技术细节,如流水线设计、资源优化技巧以及实际测试结果。 适合人群:对数字信号处理和FPGA开发有一定了解的研发人员,尤其是从事嵌入式系统设计、音频处理、通信工程等相关领域的工程师。 使用场景及目标:适用于需要高性能、低延迟的实时信号处理任务,如噪声消除、回声抑制、生物医学信号处理等。通过掌握本文提供的理论知识和实践经验,读者可以在自己的项目中实现高效的自适应滤波解决方案。 其他说明:文章不仅涵盖了理论背景,还包括了大量的代码片段和实际案例,帮助读者更好地理解和应用所学内容。同时,文中提及的一些优化技术和调试经验对于提升系统的性能和稳定性也非常有价值。

    (源码)基于React和Gatsby框架的TiDB开发者社区网站.zip

    # 基于React和Gatsby框架的TiDB开发者社区网站 ## 项目简介 这是一个基于React和Gatsby框架的TiDB开发者社区网站。该网站旨在为TiDB的开发者们提供一个交流、分享和学习平台。网站包含了各种功能,如博客文章、人员列表、SIG(Special Interest Group)介绍、事件发布等。 ## 项目的主要特性和功能 1. 国际化支持支持中英文切换,适应不同语言背景的开发者。 2. 响应式设计网站能够自适应不同大小的屏幕,包括桌面和移动设备。 3. 博客功能允许社区成员发表关于TiDB技术、最佳实践等内容的博客文章。 4. 人员列表展示TiDB社区的活跃成员,包括他们的简介和贡献。 5. SIG介绍详细介绍TiDB的各个SIG(特殊兴趣小组),帮助开发者了解社区内部的各种项目和活动。 6. 事件发布提供社区活动的信息发布功能,包括会议、研讨会等。 ## 安装使用步骤

    Delphi 12.3控件之CnWizards-1.6.0.1248-Unstable.exe

    Delphi 12.3控件之CnWizards_1.6.0.1248_Unstable.exe

Global site tag (gtag.js) - Google Analytics