迭代解卷积与噪声关系
迭代 关系 卷积 噪声
2023-09-11 14:15:19 时间
迭代求解卷积与噪声的关系
01 解卷积
一、解卷积
已知两个序列, 分别是 x[n] 以及 h[n], 它们之间的卷积 定义为这样的累加和。 是将其中一个序列进行反褶、平移、再与另外一个序列相乘、累加, 最终得到卷积结果。 如果已知卷积结果和其中一个序列, 求取另外一个序列的过程, 称为解卷积。
▲ 图1.1.1 卷积与解卷积
如果两个参与卷积的序列 都是因果序列。 那么累加的上下限就变成从 0 到 n。 然后再将该累加公式 分成两项。 进行化简之后,便可以得到关于 x[n] 的迭代公式。 将 h[0] 移到方程左边, 每一次迭代就可以得到最新的 x[n] 的数值。 下面讨论一下这个方程在噪声情况下的特性。
![GM1679883947_1280_800.MPG|_-17](https://img-blog.csdnimg.cn/14dd511ebc494bf2b9c7ce82da91a15a.png#pic_right)
刚才展示的公式分子有误, 应该是减号。
![GM1679884045_1280_800.MPG|_-2](https://img-blog.csdnimg.cn/207c1f73a8484192b0a602c17866d57d.png#pic_right)
x [ n ] = y [ n ] − ∑ m = 0 n − 1 x [ m ] ⋅ h [ n − m ] h [ n ] x\left[ n \right] = {{y\left[ n \right] - \sum\limits_{m = 0}^{n - 1} {x\left[ m \right] \cdot h\left[ {n - m} \right]} } \over {h\left[ n \right]}} x[n]=h[n]y[n]−m=0∑n−1x[m]⋅h[n−m]
二、加噪声解卷积
为了展示解卷积, 还是利用前面的正弦信号的卷积作为例子。 这里假设已知 y[n],h[n],求解 x[n]。 为了展示迭代噪声的影响,这里将序列的密度增加, 这是 500 个数据点形成的 x[n] 序列, 将 h[n],y[n]对应的序列的采样密度也增加。 下面应用这些数据进行解卷积。
▲ 图1.2.1 参与解卷积的信号
下面通过 Python 编程, 实现其中的解卷积公式, 从给定的两个序列获得解卷积结果。 这是从 y[n],h[n] 中计算 x[n] 的取值, 可以看到与原来的 sine 波形是一样的, 证明了解卷积公式和子程序的正确性。
![GM1679885492_1280_800.MPG|_-5](https://img-blog.csdnimg.cn/6e082f3027eb46c8ab3d35bf5d209dbe.png#pic_right)
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2023-03-27
#
# Note:
#============================================================
from headm import *
t = linspace(0, 2*2*pi, 500)
sint = sin(t)
ht = array([1]*len(t))
yt = convolve(ht,sint)
yt = yt[:len(t)]
def deconv(y,h):
x = []
for i in range(len(h)):
s = sum([v1*v2 for v1,v2 in zip(x, h[:i][::-1])])
x.append((y[i]-s)/h[0])
return x
dx = deconv(yt,ht)
plt.plot(t, dx, lw=4, label="Deconvolve")
plt.plot(t, sint, lw=1, label='Origin')
plt.xlabel("t")
plt.ylabel("ft")
plt.legend(loc='upper right')
plt.grid(True)
plt.grid(False)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
▲ 在没有噪声情况下的解卷积
首先在卷积结果上增加正态分布的白噪声, 噪声的方差为 1。 利用卷积公式求 x[n], 可以看到求解出的 x[n] 波形中也增加了白噪声, 方差大约为 1。 将 y[n] 中的噪声方程减小到 0.1, 求解得到的 x[n] 的噪声 也减少了。 特别是,这个结果中的噪声似乎并没有随着 n 的增加呈现累积增加的倾向。
![GM1679886023_1280_800.MPG|_-6](https://img-blog.csdnimg.cn/bd3998515b71415b827fcf10e8eeb83e.png#pic_right)
▲ 图1.2.3 增加噪声情况下的解卷积
下面在参与求解的 h[n] 中增加噪声, 随机噪声的方差为 0.1, 大约是 h[n] 幅值的 10% 左右。 这是求解之后的 x[n] 的取值, 似乎 x[n] 已经发散了。 这是另一次运行结果, 与前面求解 x[n] 有所不同, 这是第三次运行的结果, x[n] 结果仍然是发散的趋势, 可以看到这种迭代解卷积对于 h[n] 中的噪声比较敏感, 而且每次运行结果还都是不尽相同。 这是在 h[n] 中叠加上 10% 的高斯噪声的测试结果。
![GM1679886757_1280_800.MPG|_-9](https://img-blog.csdnimg.cn/230339c74aec4cd6aec11459f59d3c71.png#pic_right)
▲ 图1.2.4 在 h[n] 上叠加 10% 高斯噪声迭代解卷积的结果
下面将 h[n] 的方程 减小到 0.05。 对 x[n] 进行解卷积, 这是解卷积 30 次形成的结果, 可以看到这种解卷积的结果不是很稳定, 特别是随着 n 增加,后面结果中的误差会累积,直到出现发散。 这个测试验证了这种迭代解卷积的方法在数值上不是很稳定。
▲ 图1.2.5 解卷积结果
※ 总 结 ※
本文对于迭代方法求解卷积进行测量测试, 可以看到在参与卷积数据中存在噪声时, 迭代方法求得结果中的误差会出现累计, 结果也呈现发散的倾向。
● 相关图表链接:
相关文章
- php聚合式迭代器是什么
- Java实现 LeetCode 173 二叉搜索树迭代器
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
- 如何从开发阶段提升代码质量,加速迭代发布?
- flink Iterate迭代基本概念
- Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
- Python 迭代器切片
- 设计模式16:迭代模式(Iterator)
- 区块链共识机制及其迭代
- 函数递归与迭代
- 自动化测试技术分享 | 敏捷开发、瀑布与迭代模型的项目应用分析
- 设计模式---迭代器模式
- java学习笔记——Collection集合、迭代器、泛型、扑克牌案例
- 【C++要笑着学】list 核心框架接口的模拟实现 | 运算符重载实现list迭代器 | 妙用模板实现const迭代器