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