当前位置: 首页 > news >正文

常用滤波算法(二)-中位值滤波法

文章目录

  • 一、中位值滤波法简介
  • 二、C语言实现中位值滤波法
  • 三、程序说明
    • 信号初始化:
    • 滤波窗口大小:
    • 内存分配:
    • 中位值滤波函数:
    • 中位值计算函数:
    • 内存释放:
  • 四、总结

中位值滤波法,作为一种非线性滤波方法,能够有效去除信号中的噪声,尤其适用于处理脉冲噪声或随机噪声。

一、中位值滤波法简介

中位值滤波法的基本思想是用信号中某一点附近的一个邻域内所有点的中位值来代替该点的值。这种方法能够有效地抑制信号中的随机噪声和脉冲噪声,因为它依赖于数据的排序,而非数据的算术平均值。因此,即使噪声幅度较大,中位值滤波也能保持良好的滤波效果。

二、C语言实现中位值滤波法

下面是一个简单的C语言程序,用于实现一维信号的中位值滤波。
#include <stdio.h>
#include <stdlib.h>
// 函数声明
void medianFilter(int* signal, int signalLength, int filterSize, int* filteredSignal);
int median(int* array, int size);
int main() {
// 示例信号(含噪声)
int signal[] = {10, 12, 2, 20, 30, 25, 3, 18, 15, 14};
int signalLength = sizeof(signal) / sizeof(signal[0]);
int filterSize = 3; // 滤波窗口大小

// 验证滤波窗口大小是否为奇数
if (filterSize % 2 == 0) {printf("滤波窗口大小应为奇数。\n");return -1;
}// 分配内存给滤波后的信号
int* filteredSignal = (int*)malloc(signalLength * sizeof(int));
if (filteredSignal == NULL) {printf("内存分配失败。\n");return -1;
}// 应用中位值滤波
medianFilter(signal, signalLength, filterSize, filteredSignal);// 打印滤波后的信号
printf("滤波后的信号:\n");
for (int i = 0; i < signalLength; i++) {printf("%d ", filteredSignal[i]);
}
printf("\n");// 释放内存
free(filteredSignal);return 0;

}

// 中位值滤波函数
void medianFilter(int* signal, int signalLength, int filterSize, int* filteredSignal) {
int halfWindow = filterSize / 2;

for (int i = 0; i < signalLength; i++) {int* window = (int*)malloc((filterSize) * sizeof(int));if (window == NULL) {printf("内存分配失败。\n");exit(-1);}// 获取当前窗口内的信号值int count = 0;for (int j = -halfWindow; j <= halfWindow; j++) {int index = i + j;// 处理边界情况if (index >= 0 && index < signalLength) {window[count++] = signal[index];}}// 计算中位值filteredSignal[i] = median(window, count);// 释放窗口内存free(window);
}

}
// 计算数组的中位值
int median(int* array, int size) {
int* temp = (int*)malloc(size * sizeof(int));
if (temp == NULL) {
printf(“内存分配失败。\n”);
exit(-1);
}

// 复制并排序数组
for (int i = 0; i < size; i++) {temp[i] = array[i];
}
for (int i = 0; i < size - 1; i++) {for (int j = i + 1; j < size; j++) {if (temp[i] > temp[j]) {int swap = temp[i];temp[i] = temp[j];temp[j] = swap;}}
}// 获取中位值
int medianValue = temp[size / 2];// 释放临时数组内存
free(temp);return medianValue;

}

三、程序说明

信号初始化:

main函数中,我们定义了一个包含噪声的示例信号。

滤波窗口大小:

我们设置了一个滤波窗口大小filterSize,并验证其是否为奇数,因为中位值滤波的窗口大小通常是奇数。

内存分配:

为滤波后的信号分配内存。

中位值滤波函数:

medianFilter函数遍历信号中的每个点,提取当前点附近窗口内的信号值,并计算这些值的中位值,以替换当前点的值。

中位值计算函数:

median函数负责计算一个数组的中位值。首先,它复制数组并对其进行排序,然后返回排序后数组的中位值。

内存释放:

在程序结束前,释放分配的内存。

四、总结

中位值滤波法是一种简单而有效的非线性滤波技术,特别适用于处理含有脉冲噪声的信号。本文通过一个C语言实例,详细展示了中位值滤波法的实现步骤,包括信号初始化、滤波窗口大小设置、内存分配与释放、中位值计算等关键步骤。希望这个实例能帮助读者更好地理解中位值滤波法的原理与应用。

相关文章:

常用滤波算法(二)-中位值滤波法

文章目录 一、中位值滤波法简介二、C语言实现中位值滤波法三、程序说明信号初始化&#xff1a;滤波窗口大小&#xff1a;内存分配&#xff1a;中位值滤波函数&#xff1a;中位值计算函数&#xff1a;内存释放&#xff1a; 四、总结 中位值滤波法&#xff0c;作为一种非线性滤波…...

HCIP--以太网交换安全(总实验)

实验背景 假如你是公司的网络管理员&#xff0c;为了提高公司网络安全性&#xff0c;你决定在接入交换机部署一些安全技术&#xff1a;端口隔、端口安全、DHCP snooping、IPSG。 实验拓扑图 实验的要求&#xff1a; 1.在R1、R2连接在GE0/0/1和GE0/0/2接口下&#xff0c;均划…...

C语言 | Leetcode C语言题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; typedef struct {unsigned long long val;UT_hash_handle hh; } Hash;typedef struct {Hash *hash;int n_rows;int n_cols; } Solution, SL;Solution* solutionCreate(int n_rows, int n_cols) {SL *obj malloc(sizeof(SL));obj->hash …...

《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统

视频讲解 【第1季】10.第10章_其他SLAM系统-视频讲解 【第1季】10.1.第10章_其他SLAM系统_RTABMAP算法-视频讲解 【第1季】10.2.第10章_其他SLAM系统_VINS算法-视频讲解 【第1季】10.3.第10章_其他SLAM系统_机器学习与SLAM-视频讲解 第1季&#xff1a;第10章_其他SLAM系统 …...

《双指针篇》---快乐数

题目传送门 1.创建一个bitsum函数用于得到这个数每位的平方和。 2.令快指针等于bitsum&#xff08;n&#xff09; 3.慢指针等于n。 逐步令 fast bitSum(bitSum(fast)); slow bitSum(slow); 若最后fast等于slow&#xff0c;则且等于1.则return true。 否则return false。 cla…...

U盘引导丢失问题的处理办法

项目背景&#xff1a;在使用自制的u盘系统的时候经常遇到引导丢失的问题&#xff0c;那么咱们怎么解决这个问题呢&#xff0c;首先第一步通过手动引导u盘 进入系统&#xff0c;同时再进行引导区的修复这样u盘系统就可以正常工作了。 1 进入grub 的提示符下面&#xff0c;首先…...

layui tree customSelet选中的内容重写,查找父级

layui tree customSelet选中的内容重写&#xff0c;查找父级 需要重新源码 // 递归查找函数 // tree 所有数据 &#xff0c;nodeId选中数据id值 function findParent(tree, nodeId, parent null) {for (let i 0; i < tree.length; i) {if (tree[i].id nodeId) {return …...

Maven 插件

Maven 插件 Maven 是一个强大的项目管理和构建自动化工具&#xff0c;广泛应用于 Java 项目中。它通过插件来实现各种功能&#xff0c;如编译、测试、打包、部署等。Maven 插件是 Maven 的核心组成部分&#xff0c;它们扩展了 Maven 的功能&#xff0c;使其能够执行各种任务。…...

MybatisPlus入门(七)MybatisPlus-DQL编程控制

一、查询投影 查询投影&#xff1a;查出来的东西有多少字段&#xff0c;设置查询出来的结果长什么样&#xff0c;查出的字段控制&#xff1b; 查询投影适用于lamda格式&#xff0c;使用select 查询 lqw.select(User::getId,User::getName,User::getAge); 代码示例&#xff1…...

K8S概念及其常见组件和整体架构

1.概念 什么是Kubernetes 官网&#xff1a;Kubernetes 文档 | Kubernetes K8S的本质是一组服务器集群&#xff0c;可以在对应服务器集群的每个节点上运行程序&#xff0c;来对节点中的容器进行管理 类似Master-Work方式&#xff0c;每个服务器上安装特定的K8S组件&#xff0c…...

LabVIEW继电器视觉检测系统

随着制造业的自动化与高精度要求不断提升&#xff0c;传统的人工检测方法逐渐难以满足高效和高精度的需求。特别是在航空航天、医疗设备等高端领域&#xff0c;密封继电器推动杆部件的质量直接影响到设备的性能与可靠性。LabVIEW自动化视觉检测系统&#xff0c;能对推动杆部件进…...

linux操作系统进程

linux操作系统是对下的软硬件进行管理&#xff0c;为了能够对上提供稳定&#xff0c;快速&#xff0c;安全的服务而诞生的软件。 广义上的操作系统是包含搭载在操作系统上的软件和函数库等文件的。 狭义上的操作系统就是操作系统内核&#xff0c;进行进程管理&#xff0c;文件…...

jeecgbootvue2菜单路由配置静态文件夹(public)下的html

需求:想要在菜单配置src/assets/iconfont/chart.html显示页面(目的是打包上线以后运维依然可以修改数据) 官网没有相关数据&#xff1a;菜单配置说明 JeecgBoot 开发文档 看云 问题现象: 我把文件放在src/assets/iconfont/chart.html然后在vue中作为 iframe 的 src 属性&am…...

PHP反序列化原生类字符串逃逸框架反序列化利用

PHP反序列化 概念 序列化的原因&#xff1a;为了解决开发中数据传输和数据解析的一个情况(类似于要发送一个椅子快递&#xff0c;不可能整个椅子打包发送&#xff0c;这是非常不方便的&#xff0c;所以就要对椅子进行序列化处理&#xff0c;让椅子分成很多部分在一起打包发送…...

6.1、属性动画

使用显式动画产生布局更新动画 1.旋转动画 只修改对应的属性 rotate({angle: this.angle}) 即可达到效果 动画效果 对应实现代码 @Entry @Component struct AnimationPage {@State angle:number = 0aboutToAppear() {...

v-model还可以作用于其他表单元素的使用

1、文本输入框 直接双向绑定输入的元素值 初始化默认值为空字符串 2、复选按钮 直接双向绑定输入的元素值 初始化默认值为flase&#xff0c;不选中 3、单选按钮&#xff0c; 1.使用name分组&#xff0c;产生互斥效果。 2.使用value存值&#xff0c; 3再用v-model双向绑定…...

最短路的求解

实验类型&#xff1a;◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的&#xff1a;学会使用Matlab求解最短路。 实验内容&#xff1a;1.熟练运用Floyd算法&#xff1b;2. 熟练运用Dijkstra算法&#xff1b;3.利用Matlab编程实现最短路的计算。 例1&#xff1a;已知无向图…...

四:java 基础知识(4)-- 异常 字符串

目录 1. 异常处理 1.1 什么是异常 1.2 异常的类型 1.2.1 检查异常 1.2.2 运行时异常 1.3 异常的捕获与处理 1.3.1 try-catch 语句 1.3.2 finally 块 1.3.3 throw 和 throws 关键字 1.4 自定义异常 1.5 异常的最佳实践 2. 字符串 2.1 String 类的概述 2.2 字符串的…...

Uniapp 实现app自动检测更新/自动更新功能

实现步骤 配置 manifest.json 在 manifest.json 中设置应用的基本信息&#xff0c;包括 versionName 和 versionCode。 一般默认0.0.1&#xff0c;1. 服务器端接口开发 提供一个 API 接口&#xff0c;返回应用的最新版本信息&#xff0c;版本号、下载链接。客户端检测更新 使…...

7.0、RIP

RIP (Routing Information Protocol) 简介 RIP是由Xerox在20世纪70年代开发的&#xff0c;最初定义在RFC1058中。RIP用两种数据包传输更新:更新和请求&#xff0c;每个有RIP功能的路由器在默认情况下&#xff0c;每隔30s利用UDP520端口向与它直连的网络邻居广播(RIP1)或组播(R…...

从SuperGlue到LoFTR:无检测器特征匹配是如何“卷”出来的?技术演进深度解读

从SuperGlue到LoFTR&#xff1a;无检测器特征匹配的技术革命与范式迁移 在计算机视觉领域&#xff0c;特征匹配一直是三维重建、SLAM、图像配准等任务的核心基础。传统方法如SIFT、ORB等基于手工设计的特征检测与描述算法&#xff0c;在过去二十年里主导了这一领域。然而&#…...

嵌入式工程师技术成长路径:从单片机到Linux驱动开发

嵌入式工程师职业发展路径的技术思考1. 职业发展阶段与技术演进1.1 单片机开发阶段对于刚毕业的电子工程专业学生&#xff0c;单片机开发通常是职业起点。这一阶段主要涉及&#xff1a;8/16/32位微控制器(如STM32系列)的应用开发基础外设驱动开发(GPIO、UART、SPI、I2C等)实时操…...

WWW-万维网

万维网的概念与组成结构万维网&#xff08;World Wide Web&#xff0c;WWW&#xff09;是一个分布式的信息存储空间&#xff0c;在这个空间中&#xff1a;一个事物被称为一样 “资源”&#xff0c;并由一个全域 “统一资源定位符”&#xff08;URL&#xff09;标识。这些资源通…...

老旧Mac如何重获新生?OCLP-Mod带来的系统升级解决方案

老旧Mac如何重获新生&#xff1f;OCLP-Mod带来的系统升级解决方案 【免费下载链接】OCLP-Mod A mod version for OCLP,with more interesting features. 项目地址: https://gitcode.com/gh_mirrors/oc/OCLP-Mod 随着科技的快速迭代&#xff0c;许多曾经性能卓越的Mac设备…...

告别加班!3个Word神技巧,文档处理快人一步

如影随形地跟着那堆积如山的文档&#xff0c;像学生名单&#xff0c;课程表&#xff0c;教学计划&#xff0c;家长通知等等&#xff0c;这些重复性工作着实耗费了大量精力。事实上&#xff0c;Word当中蕴含着好些能够让你达成事半功倍效果的技巧&#xff0c;一旦将它们掌握住&a…...

Linux DRM子系统深度解析:如何为240x240 SPI屏编写自定义KMS驱动?

Linux DRM子系统实战&#xff1a;为240x240 SPI屏构建原子化KMS驱动 当一块小巧的240x240 SPI屏幕遇上Linux DRM显示框架&#xff0c;开发者面临的不仅是硬件接口的适配&#xff0c;更是一场关于现代显示架构的深度对话。本文将带您穿透DRM子系统的抽象层&#xff0c;从KMS核心…...

MRM-MOT4X3.6CAN电机驱动库:工业级CAN总线电机控制抽象层

1. 项目概述mrm-mot4x3.6can是一款面向工业级电机控制场景的专用 CAN 总线驱动库&#xff0c;专为 MRMS&#xff08;Modular Robotic Motor Systems&#xff09;公司推出的MRM-MOT4X3.6CAN 四通道直流电机控制器设计。该控制器集成 4 路独立 H 桥驱动单元&#xff0c;每路持续输…...

【算法对抗】打穿查重黑盒!论文降AI太难?8个实测有效策略与高性价比工具

上周匆匆写完论文初稿交给导师&#xff0c;结果被一眼识破&#xff0c;当场打回。还被导师认为不认真不负责态度不端正&#xff01; 为了搞定这件事&#xff0c;我测评了市面上大部分的主流工具、试了无数方法&#xff0c;终于把AI率降到6%。 我们要先端正态度&#xff1a;论文…...

translategemma-27b-it入门必看:Gemma3轻量化设计如何平衡精度与推理速度

translategemma-27b-it入门必看&#xff1a;Gemma3轻量化设计如何平衡精度与推理速度 本文深度解析基于Gemma 3构建的TranslateGemma-27B-IT模型&#xff0c;通过实际部署演示展示其如何在保持翻译精度的同时实现高效推理&#xff0c;为开发者提供完整的入门指南。 1. 认识Tran…...

MultiHighlight插件深度解析:掌握代码高亮的艺术与科学

MultiHighlight插件深度解析&#xff1a;掌握代码高亮的艺术与科学 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors &#x1f3a8;&#x1f4a1; 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight 在复杂…...