通过Wirtinger流进行相位恢复:理论与算法

news2025/3/17 13:51:53

文章目录

    • 1. 简介
    • 2. 算法描述
      • 2.1 初始化(Initialization)
      • 2.2 迭代更新(Iterative Updates)
      • 2.3 学习率调整(Learning Rate Adjustment)
    • 3. 代码实现
      • 3.1 一维信号测试 (Gaussian model)
      • 3.2 一维信号测试 (Coded diffraction model)
      • 3.2 二维图片测试
    • 参考文献

1. 简介

Wirtinger流,包含通过谱方法初始化并使用类似梯度下降的新更新规则迭代地细化估计。这种方法承诺通过最少数量的随机测量实现精确的相位恢复,同时在计算和数据资源方面都具有高效性。

传统方法,如Gerchberg-Saxton算法及其变体,通过迭代地应用投影,使频谱的幅度与观察数据匹配。这些方法依赖于关于信号的先验知识,并且缺乏理论上的收敛保证。

Wirtinger流算法包括两个主要步骤:

  1. 通过谱方法初始化: 初始猜测 z o z_o zo 是通过计算从测量数据构建的矩阵的主特征向量得到的。
  2. 类似梯度下降的更新: 使用非凸目标函数的梯度迭代地细化 z z z。步长动态调整以确保收敛。

2. 算法描述

2.1 初始化(Initialization)

  • 输入:

    • 观测数据 { y r } r = 1 m \{y_r\}_{r=1}^m {yr}r=1m, 其中 y r = ∣ ⟨ a r , x ⟩ ∣ 2 y_r=|\langle a_r,x\rangle|^2 yr=ar,x2, 采样向量 { a r } r = 1 m \{a_r\}_{r=1}^m {ar}r=1m
  • 步骤:

1.计算参数 λ : \lambda: λ:

λ 2 = n ∑ r = 1 m y r ∑ r = 1 m ∥ a r ∥ 2 \lambda^2=\frac{n\sum_{r=1}^my_r}{\sum_{r=1}^m\|a_r\|^2} λ2=r=1mar2nr=1myr

​2.构造矩阵 Y : Y: Y:
Y = 1 m ∑ r = 1 m y r a r a r ∗ Y=\frac1m\sum_{r=1}^my_ra_ra_r^* Y=m1r=1myrarar

  1. 计算 Y Y Y 的最大特征值对应的特征向量 z 0 z_0 z0, 并将其归一化为 ∥ z 0 ∥ = λ . \|z_0\|=\lambda. z0=λ.

2.2 迭代更新(Iterative Updates)

  • 输入:

    • 初始猜测 z 0 z_{0} z0
    • 学习率 μ \mu μ
    • 最大迭代次数 T T T
  • 步骤:

​ 1.设置初始值 z = z 0 z=z_0 z=z0

​ 2.对于每次迭代 τ = 0 , 1 , 2 , … , T − 1 : \tau=0,1,2,\ldots,T-1: τ=0,1,2,,T1:

​ 1.计算梯度 ∇ f ( z ) : \nabla f(z): f(z):
∇ f ( z ) = 1 m ∑ r = 1 m ( ∣ ⟨ a r , z ⟩ ∣ 2 − y r ) a r a r ∗ z \nabla f(z)=\frac{1}{m}\sum_{r=1}^{m}(|\langle a_r,z\rangle|^2-y_r)a_ra_r^*z f(z)=m1r=1m(ar,z2yr)ararz
​ 2.更新 z : z: z:
z = z − μ ∇ f ( z ) z=z-\mu\nabla f(z) z=zμf(z)

  • 输出
    • 恢复的信号 z z z

2.3 学习率调整(Learning Rate Adjustment)

​ 在迭代过程中,可以根据梯度估计的不确定性调整学习率 μ \mu μ。通常,早期迭代使用较小的学习率,随后逐渐增大。建议的学习率更新公式为:
μ τ = min ⁡ ( 1 − e − τ / τ 0 , μ max ⁡ ) \mu_\tau=\min(1-e^{-\tau/\tau_0},\mu_{\max}) μτ=min(1eτ/τ0,μmax)
其中 τ 0 \tau_0 τ0 μ m a x \mu_{max} μmax 是实验中调整的超参数。

3. 代码实现

  1. 文章中的方法
    • 通过构造矩阵 Y Y Y 并计算其最大特征值对应的特征向量,来获得初始估计。
    • 这种方法直接利用特征值分解,得到了与最大特征值对应的特征向量。
  2. 程序中的方法
    • 使用幂法迭代,这是一种求矩阵最大特征值和特征向量的数值方法。
    • 幂法迭代通过反复应用线性算子 A A A和其共轭转置 A t At At,逐步逼近最大特征值对应的特征向量。

3.1 一维信号测试 (Gaussian model)

import numpy as np
import matplotlib.pyplot as plt

# 生成信号和数据
n = 128
x = np.random.randn(n) + 1j * np.random.randn(n)

m = round(4.5 * n)
A = (1 / np.sqrt(2)) * (np.random.randn(m, n) + 1j * np.random.randn(m, n))
y = np.abs(A @ x)**2

# 初始化
npower_iter = 50
z0 = np.random.randn(n) + 1j * np.random.randn(n)
z0 = z0 / np.linalg.norm(z0)

for _ in range(npower_iter):
    z0 = A.conj().T @ (y * (A @ z0))
    z0 = z0 / np.linalg.norm(z0)

normest = np.sqrt(np.sum(y) / len(y))
z = normest * z0
Relerrs = [np.linalg.norm(x - np.exp(-1j * np.angle(np.vdot(x, z))) * z) / np.linalg.norm(x)]

# 主循环
T = 2500
tau0 = 330
mu = lambda t: min(1 - np.exp(-t / tau0), 0.2)

for t in range(1, T + 1):
    yz = A @ z
    grad = (1 / m) * A.conj().T @ ((np.abs(yz)**2 - y) * yz)
    z = z - mu(t) / normest**2 * grad
    Relerrs.append(np.linalg.norm(x - np.exp(-1j * np.angle(np.vdot(x, z))) * z) / np.linalg.norm(x))

# 检查结果
print(f'Relative error after initialization: {Relerrs[0]:.6f}')
print(f'Relative error after {T} iterations: {Relerrs[-1]:.6f}')

# 绘制相对误差图
plt.figure()
plt.semilogy(range(T + 1), Relerrs)
plt.xlabel('Iteration')
plt.ylabel('Relative error (log10)')
plt.title('Relative error vs. iteration count')
plt.show()

在这里插入图片描述

3.2 一维信号测试 (Coded diffraction model)

import numpy as np
import matplotlib.pyplot as plt

# 生成信号
n = 128
x = np.random.randn(n) + 1j * np.random.randn(n)

# 生成掩码和线性采样算子
L = 6  # 掩码数量

# 生成随机相位掩码
Masks = np.random.choice([1j, -1j, 1, -1], size=(n, L))

# 随机缩放
temp = np.random.rand(n, L)
Masks = Masks * ((temp <= 0.2) * np.sqrt(3) + (temp > 0.2) / np.sqrt(2))

# 定义线性采样算子
def A(I):
    return np.fft.fft(np.conj(Masks) * np.tile(I[:, np.newaxis], (1, L)), axis=0)

def At(Y):
    return np.mean(Masks * np.fft.ifft(Y, axis=0), axis=1)

# 测量数据
Y = np.abs(A(x))**2

# 初始化
npower_iter = 50
z0 = np.random.randn(n) + 1j * np.random.randn(n)
z0 = z0 / np.linalg.norm(z0)

for _ in range(npower_iter):
    z0 = At(Y * A(z0))
    z0 = z0 / np.linalg.norm(z0)

normest = np.sqrt(np.sum(Y) / Y.size)
z = normest * z0
Relerrs = [np.linalg.norm(x - np.exp(-1j * np.angle(np.vdot(x, z))) * z) / np.linalg.norm(x)]

# 主循环
T = 2500
tau0 = 330
mu = lambda t: min(1 - np.exp(-t / tau0), 0.2)

for t in range(1, T + 1):
    Bz = A(z)
    C = (np.abs(Bz)**2 - Y) * Bz
    grad = At(C)
    z = z - mu(t) / normest**2 * grad
    Relerrs.append(np.linalg.norm(x - np.exp(-1j * np.angle(np.vdot(x, z))) * z) / np.linalg.norm(x))

# 检查结果
print(f'Relative error after initialization: {Relerrs[0]:.6f}')
print(f'Relative error after {T} iterations: {Relerrs[-1]:.6f}')

# 绘制相对误差图
plt.figure()
plt.semilogy(range(T + 1), Relerrs)
plt.xlabel('Iteration')
plt.ylabel('Relative error (log10)')
plt.title('Relative error vs. iteration count')
plt.show()

在这里插入图片描述

3.2 二维图片测试

import numpy as np
import matplotlib.pyplot as plt
import time
import cv2

# 加载图像
# 使用 OpenCV 读取本地图像
amplitude_image = cv2.imread("./standard_test_images/cameraman.tif", cv2.IMREAD_GRAYSCALE)
phase_image = cv2.imread("./standard_test_images/lena_gray_256.tif", cv2.IMREAD_GRAYSCALE)

# 调整图像大小
img_size = 256
amplitude_image = cv2.resize(amplitude_image, (img_size, img_size))
phase_image = cv2.resize(phase_image, (img_size, img_size))

# 将图像归一化到 [0, 1] 范围内
amplitude_image = amplitude_image / np.max(amplitude_image)
phase_image = phase_image / np.max(phase_image)

# 将振幅图像和相位图像结合生成复数图像 x
x = amplitude_image * np.exp(1j * 2 * np.pi * phase_image)

# 生成掩码和线性采样算子
L = 10  # 掩码数量
n1, n2 = amplitude_image.shape
Masks = np.zeros((n1, n2, L), dtype=complex)

# 生成随机相位掩码
for ll in range(L):
    Masks[:, :, ll] = np.random.choice([1j, -1j, 1, -1], size=(n1, n2))

# 随机缩放
temp = np.random.rand(n1, n2, L)
Masks *= (temp <= 0.2) * np.sqrt(3) + (temp > 0.2) / np.sqrt(2)

# 定义线性采样算子
def A(I):
    return np.fft.fft2(np.conj(Masks) * np.tile(I[:, :, np.newaxis], (1, 1, L)), axes=(0, 1))

def At(Y):
    return np.mean(Masks * np.fft.ifft2(Y, axes=(0, 1)), axis=2)

# 测量数据
Y = np.abs(A(x))**2


# 初始化
npower_iter = 50
z0 = np.random.randn(n1, n2)
z0 = z0 / np.linalg.norm(z0, 'fro')

# 幂法迭代
start_time = time.time()
for _ in range(npower_iter):
    z0 = At(Y * A(z0))
    z0 = z0 / np.linalg.norm(z0, 'fro')
init_time = time.time() - start_time

# 估计标准差并缩放特征向量
normest = np.sqrt(np.sum(Y) / Y.size)
z = normest * z0

# 初始相对误差
Relerrs = [np.linalg.norm(x - np.exp(-1j * np.angle(np.trace(np.conj(x).T @ z))) * z, 'fro') / np.linalg.norm(x, 'fro')]
Times = [init_time]

# 迭代优化
T = 500
tau0 = 330
mu = lambda t: min(1 - np.exp(-t / tau0), 0.4)

start_time = time.time()
for t in range(T):
    Bz = A(z)
    C = (np.abs(Bz)**2 - Y) * Bz
    grad = At(C)
    z = z - mu(t) / normest**2 * grad
    Relerrs.append(np.linalg.norm(x - np.exp(-1j * np.angle(np.trace(np.conj(x).T @ z))) * z, 'fro') / np.linalg.norm(x, 'fro'))
    Times.append(time.time() - start_time)

rec_amplitude = np.abs(z)
rec_phase = np.angle(z)

# 输出结果
print('All done!')

# 结果检查
print(f'Run time of initialization: {Times[0]:.2f}')
print(f'Relative error after initialization: {Relerrs[0]:.6f}')
print('\n')
print(f'Loop run time: {Times[-1]:.2f}')
print(f'Relative error after {T} iterations: {Relerrs[-1]:.6f}')

# 绘制相对误差图
plt.figure()
plt.semilogy(range(T + 1), Relerrs)
plt.xlabel('Iteration')
plt.ylabel('Relative error (log10)')
plt.title('Relative error vs. iteration count')
plt.show()

# 设置绘图的字体和字号
font = {'family': 'serif',
        'weight': 'normal',
        'size': 20}
plt.rc('font', **font)

# 显示结果
plt.figure(figsize=(12, 6))

plt.subplot(2, 2, 1)
plt.title('Original Amplitude')
plt.imshow(amplitude_image, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 2)
plt.title('Original Phase')
plt.imshow(phase_image, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 3)
plt.title('Rec Amplitude')
plt.imshow(rec_amplitude, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 4)
plt.title('Rec Phase')
plt.imshow(rec_phase, cmap='gray')
plt.axis('off')

plt.tight_layout()
plt.show()

在这里插入图片描述

在这里插入图片描述

参考文献

Candes E J, Li X, Soltanolkotabi M. Phase retrieval via Wirtinger flow: Theory and algorithms[J]. IEEE Transactions on Information Theory, 2015, 61(4): 1985-2007.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛皮!亚信安全《2024国家级攻防演练100+必修高危漏洞合集》.pdf

上次分享了2023攻防演练高危漏洞&#xff0c;获得了很多粉丝的好评。 今天再分享一份由亚信安全服务团队结合自身的“外部攻击面管理”服务能力和专业的红队能力&#xff0c;最新发布的《2024攻防演练必修高危漏洞合集》&#xff0c;一共108页&#xff0c;非常详细&#xff0c…

存储+调优:存储-memcached

存储调优&#xff1a;存储-memcached 什么是memcached? 高性能的分布式内存缓存服务器。通过缓存数据库的查询结果&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web应用的速度、提高可扩展性。 在memcached中存什么&#xff1f; 尽快被保存 访问频率高 1.数据保…

X-SCAN:Rust从零实现一个命令行端口扫描工具

0. 成品预览 本文将基于Rust构建一个常见的网络工具&#xff0c;端口扫描器。 按照惯例&#xff0c;还是和之前实现的文本编辑器一样&#xff0c;我给这个工具起名为X-SCAN,它的功能很简单&#xff0c;通过命令行参数的方式对指定IP进行扫描&#xff0c;扫描结束之后返回该IP…

MySQL--数据库--基础知识

目录 1、 数据库作用 2、sql认识 1、DDL 整数类型 浮点 主键 约束: 2、DML 插入数据 修改数据 删除数据 3、DQL-基础查询 字符函数&#xff1a; 逻辑处理&#xff1a; 数学函数&#xff1a; 日期函数&#xff1a; 分组函数&#xff1a; 条件查询: 模糊查询 LIK…

Pycharm在下载安装第三方库时速度慢或超时问题 / 切换国内镜像地址

pycharm下载第三方库速度极慢&#xff0c;搜索了一下&#xff0c;发现方法非常乱&#xff0c;稍作整理。这个问题一般都会出现&#xff0c;在我们开发中遇到的常见问题&#xff0c;根据以下解决方法&#xff0c;基本可以解决&#xff0c;但是不能100%保证 Installing packages …

算法金 | Dask,一个超强的 python 库

本文来源公众号“算法金”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Dask&#xff0c;一个超强的 python 库 1 Dask 概览 在数据科学和大数据处理的领域&#xff0c;高效处理海量数据一直是一项挑战。 为了应对这一挑战&am…

基于open3d加载kitti数据集bin文件

前言 在自动驾驶领域&#xff0c;Kitti数据集是一个非常流行的点云数据集&#xff0c;广泛用于3D目标检测、跟踪和其他相关研究。Open3D是一个强大的开源库&#xff0c;专门用于处理和可视化三维数据。本文将介绍如何使用Open3D来加载和可视化Kitti数据集中的.bin文件。 准备…

【Qt 学习笔记】Qt窗口 | Qt窗口介绍 | QMainwindow类及各组件介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | Qt窗口介绍 | QMainwindow类及各组件介绍 文章编号&#xff…

第14章 数据分析案例——2012联邦选举委员会数据库

美国联邦选举委员会发布了有关政治竞选赞助方面的数据。其中包括赞助者的姓名、职业、雇主、地址以及出资额等信息。我们对2012年美国总统大选的数据集比较感兴趣。&#xff08;http://www.fec.gov/disclosurep/PDownload.do&#xff09;。我在2012年6月下载的数据集是一个150M…

【JavaEE进阶】——一万字带你深刻理解Spring IoCDI

目录 &#x1f6a9;Spring是什么 &#x1f388;什么是容器&#xff1f; &#x1f388;什么是 IoC&#xff1f; &#x1f4dd;传统开发思路 &#x1f4dd;IOC思想 &#x1f4dd;IoC 优势 &#x1f388;DI 介绍 &#x1f6a9;IoC 详解 &#x1f388;Bean的存储 &#x…

Python 脚本化 Git 操作:简单、高效、无压力

前言 如何判定此次测试是否达标&#xff0c;代码覆盖率是衡量的标准之一。前段时间&#xff0c;利用fastapi框架重写了覆盖率统计服务&#xff0c;核心其实就是先获取全量代码覆盖率&#xff0c;然后通过diff操作统计增量代码覆盖率&#xff0c;当然要使用diff操作&#xff0c…

力扣HOT100 - 21. 合并两个有序链表

解题思路&#xff1a; class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dum new ListNode(0), cur dum;while (list1 ! null && list2 ! null) {if (list1.val < list2.val) {cur.next list1;list1 list1.next;} els…

嵌入式之音频基础知识

声音特性 1、响度&#xff1a;人主观上感觉声音的大小&#xff08;俗称音量&#xff09;&#xff0c;由“振幅”和人离声源的距离决定&#xff0c;振幅越大响度越大&#xff0c;人和声源的距离越小&#xff0c;响度越大&#xff1b; 2、音调&#xff1a;声音的高低&#xff0…

Jenkins安装 :Aws EC2下Docker镜像安装

1 安装docker # 安装docker $ sudo yum install -y docker# 启动docker daemon $ sudo systemctl start docker# 用户加入docker组 $ sudo usermod -aG docker username 2 docker安装jenkins $ docker pull jenkins/jenkins:lts# 安装成功 $ docker images REPOSITORY …

vue 表单些某项 v-if 控制后,想在显示时添加验证

效果: 可以为<el-form-item>添加 key 然后prop正常写就行 (key需要唯一值) <el-form-item label"设置" v-if"advanced_setting" key"threshold" prop"threshold"><el-inputv-model"form_Warning.threshold"p…

Python数字比大小获取大的数

目录 一、引言 二、数字比较的基本语法 三、获取较大的数 使用条件语句 使用内置函数 四、处理特殊情况 比较非数字类型 处理无穷大和NaN 五、应用实例 在游戏开发中比较分数 在数据分析中找出最大值 六、优化与性能 七、总结 一、引言 在Python编程的广阔天地中…

通过RAG架构LLM应用程序

在之前的博客文章中&#xff0c;我们已经描述了嵌入是如何工作的&#xff0c;以及RAG技术是什么。本节我们我们将使用 LangChain 库以及 RAG 和嵌入技术在 Python 中构建一个简单的 LLM 应用程序。 我们将使用 LangChain 库在 Python 中构建一个简单的 LLM 应用程序。LangChai…

Python高效数据分析的综合复习指南【时间处理与机器学习】

五、时间处理 一、时间戳-----Timestamp类型 方法1&#xff1a;使用Timestamp创建 pandas.Timestamp(ts_input, freqNone, tzNone, unitNone, yearNone, monthNone, dayNone, hourNone, minuteNone, secondNone, microsecondNone, tzinfoNone, offsetNone) import pandas a…

ICML 2024 时空数据(Spatial-Temporal)论文总结

2024ICML&#xff08;International Conference on Machine Learning&#xff0c;国际机器学习会议&#xff09;在2024年7月21日-27日在奥地利维也纳举行 &#xff08;好像ICLR24现在正在维也纳开&#xff09;。 本文总结了ICML 24有关时空数据(Spatial-temporal) 的相关论文…

机器学习预测-CNN数据预测示例

介绍 这段代码是一个基于 TensorFlow 和 Keras 的深度学习模型&#xff0c;用于进行数据的回归任务。让我逐步解释一下&#xff1a; 导入必要的库&#xff1a;这里导入了 NumPy 用于数值计算&#xff0c;Pandas 用于数据处理&#xff0c;Matplotlib 用于绘图&#xff0c;Tenso…