一、信号滤波与图像滤波
信号滤波和图像滤波都是信号处理的重要任务,它们在不同领域中有广泛的应用。
(一)信号滤波
信号滤波是对信号进行处理的过程,通过去除或抑制不需要的频率成分,以实现信号的平滑或去噪。信号滤波的目标是改变信号的频谱分布,以达到特定的信号处理目的。常用的信号滤波方法有低通滤波、高通滤波、带通滤波等。
(二)图像滤波
图像滤波是对图像进行处理的过程,通过对像素值进行平滑或增强,以实现图像的去噪、增强、边缘检测等目的。图像滤波可以分为频域滤波和空域滤波两类。频域滤波利用图像的傅里叶变换来处理频率信息,而空域滤波则在图像的像素域上直接进行操作。
二、信号滤波示例
(一)限幅滤波法(又称程序判断滤波法)
原理:该方法通过设定一个上下限,将信号限制在该范围内,超过该范围的信号值将被修正。
公式: o u t p u t = m i n ( m a x ( i n p u t , l o w e r l i m i t ) , u p p e r l i m i t ) output = min(max(input, lower_limit), upper_limit) output=min(max(input,lowerlimit),upperlimit)
def limit_amplitude_filter(input_signal, lower_limit, upper_limit):
output_signal = []
for value in input_signal:
output_signal.append(min(max(value, lower_limit), upper_limit))
return output_signal
(二)中位值滤波法
原理:取一组数据的中位数作为滤波后的输出值,用于去除异常值或突发噪声。(涉及窗口的问题,比如每次只对窗口的波进行处理)
公式: o u t p u t = m e d i a n ( i n p u t ) output = median(input) output=median(input)
import numpy as np
def median_filter(input_signal):
output_signal = []
for i in range(len(input_signal)):
window = input_signal[max(i-1, 0):min(i+2, len(input_signal))]
output_signal.append(np.median(window))
return output_signal
(三)算术平均滤波法
原理:将一组数据的平均值作为滤波后的输出值,平滑信号。涉及窗口的问题,比如每次只对窗口的波进行处理)
公式: o u t p u t = s u m ( i n p u t ) / l e n ( i n p u t ) output = sum(input) / len(input) output=sum(input)/len(input)
def mean_filter(input_signal):
output_signal = []
for i in range(len(input_signal)):
window = input_signal[max(i-2, 0):min(i+3, len(input_signal))]
output_signal.append(sum(window) / len(window))
return output_signal
(四)递推平均滤波法(又称滑动平均滤波法)
原理:采用递推方式计算滑动窗口内数据的平均值,每次新数据进入窗口时,旧数据移除,保持窗口大小不变。
公式: o u t p u t [ i ] = o u t p u t [ i − 1 ] + ( i n p u t [ i ] − i n p u t [ i − n ] ) / n output[i] = output[i-1] + (input[i] - input[i-n]) / n output[i]=output[i−1]+(input[i]−input[i−n])/n
def recursive_mean_filter(input_signal, window_size):
output_signal = []
current_sum = sum(input_signal[:window_size])
output_signal.append(current_sum / window_size)
for i in range(window_size, len(input_signal)):
current_sum = current_sum - input_signal[i - window_size] + input_signal[i]
output_signal.append(current_sum / window_size)
return output_signal
(五)中位值平均滤波法(又称防脉冲干扰平均滤波法)
原理:该方法先用中位值滤波法处理数据,然后再使用算术平均滤波法进一步平滑数据。
公式: o u t p u t = m e a n ( m e d i a n ( i n p u t ) ) output = mean(median(input)) output=mean(median(input))
def median_mean_filter(input_signal):
median_filtered = median_filter(input_signal)
output_signal = mean_filter(median_filtered)
return output_signal
(六)限幅平均滤波法
原理:该方法先使用限幅滤波法处理数据,再对处理后的数据使用算术平均滤波法进行平滑。
公式: o u t p u t = m e a n ( l i m i t a m p l i t u d e f i l t e r ( i n p u t ) ) output = mean(limit_amplitude_filter(input)) output=mean(limitamplitudefilter(input))
def limit_amplitude_mean_filter(input_signal, lower_limit, upper_limit):
limited_signal = limit_amplitude_filter(input_signal, lower_limit, upper_limit)
output_signal = mean_filter(limited_signal)
return output_signal
(七)一阶滞后滤波法
原理:该方法利用当前数据与上一时刻的滤波结果之间的差值进行滤波,适用于平稳变化的信号。
公式: o u t p u t [ i ] = ( 1 − a l p h a ) ∗ o u t p u t [ i − 1 ] + a l p h a ∗ i n p u t [ i ] output[i] = (1 - alpha) * output[i-1] + alpha * input[i] output[i]=(1−alpha)∗output[i−1]+alpha∗input[i]
def first_order_lag_filter(input_signal, alpha):
output_signal = [input_signal[0]]
for i in range(1, len(input_signal)):
output_signal.append((1 - alpha) * output_signal[i - 1] + alpha * input_signal[i])
return output_signal
(八)加权递推平均滤波法
原理:对滑动窗口内的数据进行加权平均,以增加对新数据的重视程度。
公式: o u t p u t [ i ] = ( 1 − w ) ∗ o u t p u t [ i − 1 ] + w ∗ i n p u t [ i ] output[i] = (1 - w) * output[i-1] + w * input[i] output[i]=(1−w)∗output[i−1]+w∗input[i]
def weighted_recursive_mean_filter(input_signal, weight):
output_signal = [input_signal[0]]
for i in range(1, len(input_signal)):
output_signal.append((1 - weight) * output_signal[i - 1] + weight * input_signal[i])
return output_signal
(九)消抖滤波法
原理:消除信号中的抖动或短时波动,只有当信号值连续n次出现在某一范围内时,才接受该值。
公式: o u t p u t [ i ] = i n p u t [ i ] output[i] = input[i] output[i]=input[i]
def debouncing_filter(input_signal, n):
output_signal = []
count = 0
for i in range(len(input_signal)):
if input_signal[i] == input_signal[i - 1]:
count += 1
else:
count = 1
if count >= n:
output_signal.append(input_signal[i])
return output_signal
(十)卡尔曼滤波(非扩展卡尔曼)
原理:卡尔曼滤波是一种递归算法,利用状态估计和观测值来融合多个数据来源,优化信号估计。具体原理以及简单示例见下述两个优秀的链接。
图说卡尔曼滤波,一份通俗易懂的教程 - 知乎 (zhihu.com)
(53条消息) Kalman滤波通俗理解+实际应用_南叔先生的博客-CSDN博客
from filterpy.kalman import KalmanFilter
def kalman_filter(input_signal, process_noise, measurement_noise):
kf = KalmanFilter(dim_x=1, dim_z=1)
kf.x = input_signal[0] # 初始状态估计
kf.F = np.array([[1]]) # 状态转移矩阵
kf.H = np.array([[1]]) # 观测矩阵
kf.P *= 1000 # 初始协方差矩阵
kf.R = measurement_noise # 观测噪声协方差
kf.Q = process_noise # 过程噪声协方差
output_signal = []
for z in input_signal:
kf.predict()
kf.update(z)
output_signal.append(kf.x[0])
return output_signal