PhasePack
A phase retrieval library
Phase retrieval is the recovery of a signal from only the magnitudes, and not the phases, of complex-valued linear measurements. Phase retrieval problems arise in many different applications, particularly in crystallography and microscopy. Mathematically, phase retrieval recovers a complex valued signal \(x\in \mathbb{C}^n\) from \(m\) measurements of the form
\begin{align} \label{eq:original} b_i = | a_i^T x|, \quad i = 1,2,\ldots,m, \end{align}
where \(\{a_i\}\) are complex-valued measurement vectors.
PhasePack is a collection of sub-routines for solving classical phase retrieval problems. PhasePack contains implementations of both classical and contemporary phase retrieval routines. It also contains scripts that apply these signal recovery routines to datasets, and compares the results of different methods in terms of speed and quality. PhasePack can do comparisons not only with synthetic datasets, but also with several publicly available real-world datasets.
The routines implemented in PhasePack share a simple common interface, making it easy to switch between solvers. The interface also gives users the option to control the initialization and runtime of different algorithms, making it easy to “plug and play” different routines and options.
Downloads
You can obtain the most up-to-date PhasePack by clicking the “Clone or Download” button from the GitHub page below. PhasePack comes with a detailed user guide that explains how to use the library and contains worked examples. Finally, the original PhasePack paper contains information about how various algorithms are implemented and optimized for performance.
PhasePack Download Page on GitHub
PhasePack User Guide
PhasePack Paper
What can PhasePack do?
PhasePack can compare different methods under varying conditions using both real and synthetic datasets. This example output shows results produced by the runBenchmark1DGaussianMN script located inside the benchmarks folder. It shows the relative error in the reconstructed signal produced by several algorithms as a function of the oversampling ratio (the number of measurements divided by the signal dimensionality). Results are shown for both synthetic (random Gaussian) and empirical (transmission matrix) measurement operators.
PhasePack can also reconstruct images from empirical optical measurements, and produce quantitative measures of the resulting image quality. Below are images reconstructed from empirical measurements using a range of algorithms, and accompanying residual error of each. These results were produced by the script runBenchmarkTransmissionMatrix within the benchmarks folder.
Getting Started
PhasePack comes with a short user guide that explains how to get started, and how to obtain and use the empirical datasets. We include a high-level overview below, but we suggest consulting the user guide before use.
After downloading the PhasePack distribution, add it (and its sub-folders) to your Matlab path. Files with names that begin with “run…” are runnable scripts that require no arguments or setup. The top-level folder contains a script called runSignalReconstructionDemo, which contains a simple example of obtaining phaseless measurements from a signal using a random Gaussian measurement matrix, and recovering the signal using PhasePack. The top-level folder also contains a script called runImageReconstructionDemo, which contains a more complex example of building a Fourier measurement operator from scratch, extracting phaseless measurements from an image using the operator, and recovering the image from the measurements using PhasePack.
The examples sub-folder contains demos of how to use each of the specific solvers implemented in PhasePack. For example, the script examples/runWirtFlow builds a simple test problem and solves it using the Wirtinger flow algorithm, whereas examples/runTruncatedAmpFlow does the sample thing with Truncated Amplitude Flow.
The benchmarks folder contains scripts for comparing and benchmarking the performance of different solvers. To run a comparison between numerous solvers for signal reconstruction from Gaussian measurements, run the script benchmarks/runBenchmark1DGaussianMN. This script measures the accuracy of signal recovery using various algorithms, and plots the accuracy as a function of the number of measurements.
Using empirical data
PhasePack can be used to evaluate methods on pre-packaged empirical datasets. The library contains functions that will unpack and pre-process that datasets for you, and return a simple measurement operator (\(A\)) and measurement vector (\(b\)) that can be used for phase retrieval. The empirical datasets recover images from measurements through a diffusive medium by using “transmission matrices.” See this article for details of the phase retrieval problem, and how the transmission matrix data is constructed.
Before using the empirical transmission matrix datasets, the data needs to be downloaded and installed into the data folder that comes with PhasePack. To do this, visit this link, and click the black “Download” button in the upper right corner. The download is a zip file named “TransmissionMatrices.zip.” The folder contains over 1Gb of data, and may take some time to download.
Locate the “data” sub-folder of the PhasePack distribution, and unzip the contents into the location “data/TransmissionMatrices.” If successful, “data/TransmissionMatrices” should contain the sub-folders “Coherent_Data,” “Functions,” and the file “ReadMe.txt.”
What methods are currently implemented?
Currently, PhasePack contains implementations of the methods listed below. For each method, we list the short name (used when selecting the algorithm in PhasePack) in addition to a longer, more descriptive name.
Short name Full name WirtFlow Wirtinger Flow Algorithm TWF Truncated Wirtinger Flow Algorithm RWF Reweighted Wirtinger Flow Algorithm TAF Truncated Amplitude Flow Algorithm RAF Re-Weighted Amplitude Flow Algorithm GerchbergSaxton Gerchberg-Saxton Algorithm Fienup Fineup Algorithm Kaczmarz Kaczmarz Algorithm CoordinateDescent Coordinate Descent Algorithm PhaseMax Phasemax Algorithm AmplitudeFlow AmplitudeFlow Algorithm PhaseLift Phaselift Algorithm SketchyCGM SketchyCGM Algorithm PhaseLamp PhaseLamp algorithm
PhasePack also has numerous methods for algorithm initialization. This includes
spectral methods (including variants with different weighting schemes), and the
orthogonality-promoting (aka Null) initializer.
Detailed algorithmic descriptions and citations to relevant papers are included in the headers of the corresponding implementation files.
Want to contribute a method?
If you think we’re missing something, or you’d like to add your own routine to PhasePack, email the developers or create a pull request on Github.
Who?
PhasePack was developed by
Rohan Chandra - University of Maryland
Ziyuan Zhong - Columbia University
Justin Hontz - University of Maryland
Val McCulloch - Smith College…and faculty advisors
Christoph Studer - Cornell University
Tom Goldstein - University of Maryland
How to cite PhasePack
If you find that PhasePack has contributed to your work, please cite the following article.
@article{chandra2017phasepack,
title={PhasePack: A Phase Retrieval Library},
author={Chandra, Rohan and Zhong, Ziyuan and Hontz, Justin and McCulloch, Val
and Studer, Christoph and Goldstein, Tom},
journal={Asilomar Conference on Signals, Systems, and Computers},
year={2017}
}
Also, if you use the empirical transmission matrix datasets, then please cite the creators.
@article{metzler2017coherent,
title={Coherent inverse scattering via transmission matrices: Efficient phase
retrieval algorithms and a public dataset},
author={Metzler, Christopher A and Sharma, Manoj K and Nagesh, Sudarshan and Baraniuk, Richard G and Cossairt, Oliver and Veeraraghavan, Ashok},
journal={IEEE International Conference on Computational Photography (ICCP)},
year={2017}
}
Acknowledgements
This work was made possible by the generous support of the National Science Foundation.
Datasets were furnished by Chris Metzler, Manoj Sharma, and
Ashok Veeraraghavan.