中值滤波的延时性问题
来源:互联网 发布:如何在手机上开淘宝店 编辑:程序博客网 时间:2024/05/24 08:33
关于中值滤波算法的几点注意事项:
1.根据相关文献报道[1],滤波窗口宽度设置在采样率的80~90%[2],是为合理宽度;
2.中值滤波之后的基线数据(滤波过程中,笔者初始化窗口值为0),应左移半窗口宽度后,与原数据对应相减,所得数据为去基线漂移后的数据;
3.对于原数据,在进行中值滤波前,需要进行尾部延拓半窗口宽度(与中值滤波延时对应),笔者将延拓部分取值0;
4.对应相减时,取基线数据从半窗口宽度处始,至结尾止,并按此顺序与原数据(延拓前)对应相减。
实验结果对比:
通过对比
origin_data[i] - med_data[i],
origin_data[i] - med_data[i + half_win_width]以及
origin_data[i + half_win_width] - med_data[i]三者图像,
发现中值滤波效果最佳者
为origin_data[i] - med_data[i + half_win_width],
origin_data[i] - med_data[i]次之,
origin_data[i + half_win_width] - med_data[i]最差。
此对比从一定程度上证明了上述的中值滤波延时结论。
顺序中值滤波代码:
中值获取:
#ifndef __MEDIAN_H__#define __MEDIAN_H__class Wave_filter{public:Wave_filter();~Wave_filter();void reset(void);void get_median(int, int &);void get_median(int *, int, int *&);private:#ifndef SAMPLARATE#define SAMPLERATE 250#endif // !SAMPLARATE#ifndef MEDWIDTH#define MEDWIDTH SAMPLERATE * 8 /10 + 1#endif // !MEDWIDTHint median(int), *value_pool, *time_pool, ers_pos, add_pos, running_time, time_pos;};#endif // ! __MEDIAN_H__
#include "Median.h"Wave_filter::Wave_filter() :ers_pos(-1), add_pos(-2), time_pos(0){value_pool = new int[MEDWIDTH]();time_pool = new int[MEDWIDTH]();running_time = 0;for (int i = MEDWIDTH; i > 0; running_time++){i >>= 1;}}Wave_filter::~Wave_filter(){delete[] value_pool;delete[] time_pool;}void Wave_filter::reset(){ers_pos = add_pos = -1;time_pos = 0;for (int i = 0; i < MEDWIDTH; i++){time_pool[i] = value_pool[i] = 0;}}int Wave_filter::median(int data){if (time_pos >= MEDWIDTH){time_pos = 0;}int left_bd = 0, mid_pos;for (int i = 0; i < running_time; i++){mid_pos = MEDWIDTH >> (i + 1);if (time_pool[time_pos] == value_pool[left_bd + mid_pos]){ers_pos = left_bd + mid_pos;break;}else if (time_pool[time_pos] > value_pool[left_bd + mid_pos]){left_bd += mid_pos;}if (mid_pos < 1){while (time_pool[time_pos] > value_pool[left_bd + mid_pos]){mid_pos++;}ers_pos = left_bd + mid_pos;}}left_bd = 0;if (data < value_pool[0]){add_pos = -1;}else if (data >= value_pool[MEDWIDTH - 1]){add_pos = MEDWIDTH - 1;}else{for (int i = 0; i < running_time; i++){mid_pos = MEDWIDTH >> (i + 1);if (data >= value_pool[left_bd + mid_pos] && data < value_pool[left_bd + mid_pos + 1]){add_pos = left_bd + mid_pos;break;}else if (data >= value_pool[left_bd + mid_pos]){left_bd += mid_pos;}if (mid_pos < 1){while (data >= value_pool[left_bd + mid_pos]){mid_pos++;}add_pos = left_bd + mid_pos - 1;}}}if (ers_pos == add_pos || ers_pos - 1 == add_pos){value_pool[ers_pos] = data;}else if (ers_pos < add_pos){for (int i = ers_pos; i < add_pos; i++){value_pool[i] = value_pool[i + 1];}value_pool[add_pos] = data;}else{add_pos++;for (int i = ers_pos; i > add_pos; i--){value_pool[i] = value_pool[i - 1];}value_pool[add_pos] = data;}time_pool[time_pos] = data;time_pos++;return *(value_pool + ((MEDWIDTH) >> 1));}void Wave_filter::get_median(int in_data, int &out_data){out_data = median(in_data);}void Wave_filter::get_median(int *in_data, int length, int *&out_data){for (int i = 0; i < length + (MEDWIDTH >> 1); i++){if (i < MEDWIDTH >> 1){*(out_data) = median(*(in_data + i));}else if (i >= length){*(out_data + i - (MEDWIDTH >> 1)) = median(0);}else{*(out_data + i - (MEDWIDTH >> 1)) = median(*(in_data + i));}}}
References:
[1] 蔡坤,陆尧胜. 基于中值滤波的心电基线校正方法的研究[J]. 医疗设备信息,2004,02:5-7.
[2] 刘文娜. 基于ECG信号进行心律失常及睡眠呼吸暂停综合症诊断分析[D].南京邮电大学,2015.
0 0
- 中值滤波的延时性问题
- 图像的中值滤波
- 数字图像的中值滤波
- 图像的中值滤波
- scipy的中值滤波
- 均值滤波、中值滤波的matlab实现
- 均值滤波、中值滤波的matlab实现
- 均值滤波、中值滤波的matlab实现
- 均值滤波、中值滤波的matlab实现
- 图像的均值滤波、中值滤波_JAVA
- 均值滤波、中值滤波的matlab实现
- 均值滤波、中值滤波的matlab实现
- 均值滤波、中值滤波的matlab实现
- 均值滤波、中值滤波的matlab实现
- 改进的中值滤波函数
- 中值滤波的数学表达式
- 基于opencv的中值滤波
- 中值滤波的快速算法
- git error:The following untracked working tree files would be overwritten by checkout
- elasticsearch 处理空值
- CentOS删除文件后没有释放空间
- 去掉echatrs区域背景的网格
- svn安装配置
- 中值滤波的延时性问题
- UML——宏观了解
- log4j-升级log4j2
- 打印机服务print spooler 无法启动 错误代码1068
- 关于java并发,实际开发中的体会
- 地图定位
- linux httpry http抓包工具使用
- java的抽象类和接口
- 114. Flatten Binary Tree to Linked List