当前位置: 首页 > 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语言实例,详细展示了中位值滤波法的实现步骤,包括信号初始化、滤波窗口大小设置、内存分配与释放、中位值计算等关键步骤。希望这个实例能帮助读者更好地理解中位值滤波法的原理与应用。

http://www.lryc.cn/news/475451.html

相关文章:

  • HCIP--以太网交换安全(总实验)
  • C语言 | Leetcode C语言题解之第519题随机翻转矩阵
  • 《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统
  • 《双指针篇》---快乐数
  • U盘引导丢失问题的处理办法
  • layui tree customSelet选中的内容重写,查找父级
  • Maven 插件
  • MybatisPlus入门(七)MybatisPlus-DQL编程控制
  • K8S概念及其常见组件和整体架构
  • LabVIEW继电器视觉检测系统
  • linux操作系统进程
  • jeecgbootvue2菜单路由配置静态文件夹(public)下的html
  • PHP反序列化原生类字符串逃逸框架反序列化利用
  • 6.1、属性动画
  • v-model还可以作用于其他表单元素的使用
  • 最短路的求解
  • 四:java 基础知识(4)-- 异常 字符串
  • Uniapp 实现app自动检测更新/自动更新功能
  • 7.0、RIP
  • C#与C++结构体的交互
  • sql纵表转横表
  • 数据采集-Kepware OPCUA 服务器实现
  • 初识计算机网络
  • Oracle 第11章:异常处理
  • 导航栏渐变色iOS
  • mysql读写分离
  • 计算机的错误计算(一百四十二)
  • 利用大模型辅助科研论文写作·第一期|论文写作·24-11-02
  • JavaScript。—关于语法基础的理解—
  • Tomcat 11 下载/安装 与基本使用