维纳滤波(Wiener Filter)

本文深入探讨了维纳滤波的基本概念与数学推导过程,详细解析了如何通过解Wiener-Hopf方程计算滤波器参数,以实现从含噪声信号中提取清晰信号的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Wiener Filter

因为最近看文章接触了维纳滤波,所以这里写一下Weiner Filter的一些简单理解和推导。

基本定义

维纳滤波是一种在含噪声的时序信号把信号提取出来的滤波器,其基本框图如下:
基本的Wiener FIlter结构

简单的维纳滤波其实就是通过一个FIR滤波器,去除噪声的过程。在这里,hhh的作用也可以理解为: 通过训练集的数据对信号和噪声的建模,然后通过前几个点的信息,预测当前时刻的噪声信号所占的比例,然后去除掉,剩下的就是预测的时序信号了。维纳滤波作为一种使用很广泛的滤波器,其变化的形式也有很多种,可以是单输入输出的,也可以是多输入输出的。hhh所表示的变换也可以写成非线性;hhh可以是有限长的FIR滤波器,也可以是无限长的IIR滤波器。要取决于当前你所解决的问题。但是维纳滤波的基本思想还是一致的。通过滤波(矩阵或者其他模型的形式)来从信号和噪声的混合中提取信号。所以维纳滤波的核心,就是计算这个滤波器(矩阵hhh或者模型的参数)。也就是解Wiener-Hopf方程。

本文用比较简单的单输入输出,且只考虑有限长滤波(即认为当前时刻的信号只和前有限个时间点的信号相关)。

公式推导

首先,对于图1中的滤波器:

y(n)=x(n)∗h(n)=(s(n)+v(n))∗h(n)(1)y(n) = x(n) * h(n) = (s(n)+v(n))*h(n) \tag{1}y(n)=x(n)h(n)=(s(n)+v(n))h(n)(1)

其中∗*表示卷积,x(n)x(n)x(n)表示输入信号, y(n)y(n)y(n)表示输出信号, s(n)s(n)s(n)表示输入信号中,有用的信号部分;v(n)v(n)v(n)表示输入信号中的噪声部分。

维纳滤波的目标是,保证输出y(n)y(n)y(n)和真实信号s(n)s(n)s(n)的差别最小,由于y(n)y(n)y(n)s(n)s(n)s(n)是时序信号,所以要保证两者的均方误差最小,所以有:

E{e2(n)}=E{(y(n)−s(n))2}=E{(x(n)∗h(n)−s(n))2}(2)E\{e^2(n)\} = E\{(y(n)-s(n))^2\} = E\{(x(n)*h(n)-s(n))^2\} \tag{2} E{e2(n)}=E{(y(n)s(n))2}=E{(x(n)h(n)s(n))2}(2)

即求使得Eq(2)最小的hhh。所以E{e2}E\{e^2\}E{e2}hhh求偏导。有:

∂E{e2(n)}∂h=2E{e(n)∗∂e(n)∂h}=0(3)\frac{\partial{E\{e^2(n)\}}}{\partial{h}} = 2E\{e(n) * \frac{\partial{e(n)}}{\partial{h}}\} = 0 \tag{3} hE{e2(n)}=2E{e(n)he(n)}=0(3)

∂E{e2(n)}∂h=2E{[∑m=0N−1h(m)x(n−m)−s(n)]x(n−j)},j=0,1,...,N−1(4)\frac{\partial{E\{e^2(n)\}}}{\partial{h}} = 2E\{[\sum_{m=0}^{N-1}{h(m)x(n-m) - s(n)}]x(n-j)\}, j = 0, 1, ... , N-1 \tag{4} hE{e2(n)}=2E{[m=0N1h(m)x(nm)s(n)]x(nj)},j=0,1,...,N1(4)

∂E{e2(n)}∂h=2∑m=1N−1h(m)E{x(n−j)x(n−m)}−2E{s(n)x(n−j)}=0,j=0,1,...,N−1(5)\frac{\partial{E\{e^2(n)\}}}{\partial{h}} = 2\sum_{m=1}^{N-1}{h(m)}E\{x(n-j)x(n-m)\} - 2E\{s(n)x(n-j)\} = 0, j = 0, 1, ..., N-1 \tag{5} hE{e2(n)}=2m=1N1h(m)E{x(nj)x(nm)}2E{s(n)x(nj)}=0,j=0,1,...,N1(5)

我们设xxxsss的相关系数为RxsR_{xs}Rxs,则有:

Rxs(j)=∑m=0N−1h(m)Rxx(j−m),j=0,1,...,N−1(6)R_{xs}(j)=\sum_{m=0}^{N-1}{h(m)R_{xx}(j-m)}, j=0,1,...,N-1 \tag{6}Rxs(j)=m=0N1h(m)Rxx(jm),j=0,1,...,N1(6)

其中,Rxx(j−m)R_{xx}(j-m)Rxx(jm)表示x(n−j)x(n-j)x(nj)x(n−m)x(n-m)x(nm)的相关系数,这里mmm是固定的,jjj是变化的。且m>=0m>=0m>=0Rxs(j)R_{xs}(j)Rxs(j)表示x(n−j)x(n-j)x(nj)s(n)s(n)s(n)的相关系数。上述公式中,nnn表示的是时序信号中的时间点。

然后,根据Eq(6),可以得到NNN个线性方程:
{Rxs(0)=h(0)Rxx(0)+h(1)Rxx(1)+...+h(N−1)Rxx(N−1)Rxs(1)=h(1)Rxx(1)+h(0)Rxx(0)+...+h(N−1)Rxx(N−2)...Rxs(N−1)=h(N−1)Rxx(N−1)+h(N−2)Rxx(N−2)+...+h(0)Rxx(0)(7) \begin{cases} R_{xs}(0)=h(0)R_{xx}(0)+h(1)R_{xx}(1)+...+h(N-1)R_{xx}(N-1)\\ R_{xs}(1)=h(1)R_{xx}(1)+h(0)R_{xx}(0)+...+h(N-1)R_{xx}(N-2)\\ ...\\ R_{xs}(N-1)=h(N-1)R_{xx}(N-1)+h(N-2)R_{xx}(N-2)+...+h(0)R_{xx}(0)\\ \end{cases} \tag{7} Rxs(0)=h(0)Rxx(0)+h(1)Rxx(1)+...+h(N1)Rxx(N1)Rxs(1)=h(1)Rxx(1)+h(0)Rxx(0)+...+h(N1)Rxx(N2)...Rxs(N1)=h(N1)Rxx(N1)+h(N2)Rxx(N2)+...+h(0)Rxx(0)(7)
写成矩阵形式,有:

RxxH=Rxs(8)\displaystyle \boldsymbol{R_{xx}H}=\boldsymbol{R_{xs}} \tag{8}RxxH=Rxs(8)

其中, H=[h(0),h(1),...,h(N−1)]T\displaystyle \boldsymbol{H} = [h(0), h(1),...,h(N-1)]^TH=[h(0),h(1),...,h(N1)]T是需要求的滤波器参数

Rxs=[Rxs(0),Rxs(1),...,Rxs(N−1)]T\displaystyle \boldsymbol{R_{xs}} = [R_{xs}(0),R_{xs}(1), ..., R_{xs}(N-1)]^TRxs=[Rxs(0),Rxs(1),...,Rxs(N1)]Txxxsss的相关系数
Rxx=[Rxx(0)Rxx(1)...Rxx(N−1)Rxx(1)Rxx(0)...Rxx(N−2)⋮⋮...⋮Rxx(N−1)Rxx(N−2)...Rxx(0)](9) \displaystyle \boldsymbol{R_{xx}} = \begin{bmatrix} R_{xx}(0)&R_{xx}(1)&...&R_{xx}(N-1)\\ R_{xx}(1)&R_{xx}(0)&...&R_{xx}(N-2)\\ {\vdots}&{\vdots}&...&{\vdots}&\\ R_{xx}(N-1)&R_{xx}(N-2)&...&R_{xx}(0)\\ \end{bmatrix} \tag{9} Rxx=Rxx(0)Rxx(1)Rxx(N1)Rxx(1)Rxx(0)Rxx(N2)............Rxx(N1)Rxx(N2)Rxx(0)(9)

所以根据Eq(8)可以求得:

H=Rxx−1Rxs(10)\displaystyle \boldsymbol{H} = \boldsymbol{R_{xx}^{-1}R_{xs}} \tag{10}H=Rxx1Rxs(10)

此时,信号的均方误差最小,根据Eq(2),可得:

E{e2(n)}=E{(s(n)−∑m=0N−1h(m)x(n−m))2}(11)E\{e^2(n)\} = E\{(s(n)-\sum_{m=0}^{N-1}h(m)x(n-m))^2\} \tag{11}E{e2(n)}=E{(s(n)m=0N1h(m)x(nm))2}(11)

E{e2(n)}=E{s2(n)−2s(n)∑m=0N−1h(m)x(n−m)+∑m=0N−1∑r=0N−1h(m)x(n−m)h(r)x(n−r)}E\{e^2(n)\} = E\{s^2(n) - 2s(n)\sum_{m=0}^{N-1}h(m)x(n-m)+\sum_{m=0}^{N-1}\sum_{r=0}^{N-1}{h(m)x(n-m)h(r)x(n-r)}\}E{e2(n)}=E{s2(n)2s(n)m=0N1h(m)x(nm)+m=0N1r=0N1h(m)x(nm)h(r)x(nr)}

E{e2(n)}=Rss(0)−2∑m=0N−1h(m)Rxs(m)+∑m=0N−1h(m)∑r=0N−1h(r)Rxx(m−r)E\{e^2(n)\}=R_{ss}(0)-2\sum_{m=0}^{N-1}{h(m)R_{xs}(m)+\sum_{m=0}^{N-1}{h(m)}\sum_{r=0}^{N-1}{h(r)R_{xx}(m-r)}}E{e2(n)}=Rss(0)2m=0N1h(m)Rxs(m)+m=0N1h(m)r=0N1h(r)Rxx(mr)

根据Eq(5),可得:

E{e2(n)}=Rss(0)−∑m=0N−1h(m)Rxs(m)(12)E\{e^2(n)\} = R_{ss}(0) - \sum_{m=0}^{N-1}{h(m)R_{xs}(m)} \tag{12}E{e2(n)}=Rss(0)m=0N1h(m)Rxs(m)(12)

假设信号s(n)s(n)s(n)和噪声v(n)v(n)v(n)互相独立,那么有:

Rsv=Rvs=0R_{sv}= R_{vs} = 0Rsv=Rvs=0

Rxs=Rss+Rvs=RssR_{xs} = R_{ss} + R_{vs} = R_{ss}Rxs=Rss+Rvs=Rss

Rxx=Rss+Rsv+Rvs+Rvv=Rss+RvvR_{xx} = R_{ss}+R_{sv}+R_{vs}+R_{vv} = R_{ss}+R_{vv}Rxx=Rss+Rsv+Rvs+Rvv=Rss+Rvv

则,根据Eq(12),有:

E{e2(n)}=Rss(0)−∑m=0N−1h(m)Rss(m)(14)E\{e^2(n)\} = R_{ss}(0) - \sum_{m=0}^{N-1}{h(m)R_{ss}(m)} \tag{14}E{e2(n)}=Rss(0)m=0N1h(m)Rss(m)(14)

至此,最简单的维纳滤波的基本公式推导完成,如果涉及到多输入多输出的维纳滤波,会更加复杂,这里不做推导。

### 维纳滤波的实现原理 维纳滤波是一种经典的线性滤波技术,主要用于减少信号中的噪声并恢复原始信号。其核心思想是通过最小化均方误差来估计未知信号。具体来说,它假设输入信号由干净信号和加性噪声组成,并试图找到一种最优滤波器,使得输出信号尽可能接近真实的无噪信号。 #### 数学基础 维纳滤波的核心在于求解一个优化问题,即寻找使均方误差 \( E[(s[n]-\hat{s}[n])^2] \) 最小化的滤波器系数[^1]。其中: - \( s[n] \) 表示原始信号; - \( \hat{s}[n] \) 是经过滤波后的估计信号。 为了得到最佳滤波器响应,通常需要计算功率谱密度函数以及信噪比等统计量。这些参数决定了最终滤波器的设计形式。 #### MATLAB 实现方法 在MATLAB中可以通过内置函数 `wiener2` 或者自定义脚本来完成二维图像上的维纳滤波操作。对于一维信号,则可利用频域分析配合FFT变换来进行处理[^4]。 以下是使用MATLAB编写的一个简单例子展示如何对含有高斯白噪声的一维正弦波执行基本版维纳滤波: ```matlab % Generate noisy sine wave signal fs = 100; % Sampling frequency (Hz) t = 0:1/fs:1; f_signal = sin(2*pi*5*t); % Original clean sinusoidal at 5 Hz noise = randn(size(t)); noisySignal = f_signal + noise; % Perform Wiener Filtering on Noisy Signal Hd = designfilt('lowpassfir', 'PassbandFrequency', 8, ... 'StopbandFrequency', 10, 'SampleRate', fs); filteredSignal = filter(Hd,noisySignal); figure; subplot(3,1,1), plot(t,f_signal,'b'), title('Original Clean Sine Wave'); subplot(3,1,2), plot(t,noisySignal,'r'), title('Noisy Sine Wave with Gaussian Noise Added'); subplot(3,1,3), plot(t,filteredSignal,'g'), title('Filtered Output Using Wiener Filter Approach'); ``` 此代码片段展示了从生成带噪信号到应用低通型Wiener-like滤波器整个过程。 #### Python 实现方式 Python 中也可以借助 NumPy 和 SciPy 库轻松构建类似的解决方案。下面给出了一种基于傅里叶变换的方法来模拟维纳滤波效果的例子[^3]: ```python import numpy as np from scipy.fftpack import fftshift, ifftshift, fft2, ifft2 import matplotlib.pyplot as plt def wiener_filter(img, psf, k=0.01): img_fft = fftshift(fft2(img)) psf_fft = fftshift(fft2(psf)) + k result_freq = np.conj(psf_fft)*img_fft / ((psf_fft*np.conjugate(psf_fft))) result_img = abs(ifft2(ifftshift(result_freq))) return result_img # Example usage of the function defined above. if __name__ == "__main__": from PIL import Image # Load an example image and convert it into grayscale array format suitable for processing by our algorithm here... blurred_noisy = ... # Assume this variable holds preprocessed data including both blur & additive random noises. PSF = ... # Point Spread Function representing blurring effect applied earlier during degradation step. restored_image = wiener_filter(blurred_noisy, PSF) fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 4)) ax = axes.ravel() ax[0].imshow(np.abs(blurred_noisy), cmap='gray') ax[0].set_title("Blurred Input With Additive Random Noise") ax[1].imshow(restored_image, cmap='gray') ax[1].set_title("Restoration Result After Applying Wiener Deconvolution Technique.") plt.show() ``` 上述代码提供了另一种视角下的维纳滤波实践途径——通过逆向工程思路解决模糊及污染问题。 ### 性能评估标准 无论是采用哪种工具平台实施维纳滤波方案,在实际应用场景下都需要考虑几个重要指标用于衡量去噪成效的好坏程度,比如峰值信噪比(Peak Signal-to-Noise Ratio, PSNR),结构相似度指数测量(structural similarity index measure, SSIM)[^1]等等。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值