Library

This package defines a P_fbd type to represent the FBD model, and provides a set of methods to access its properties. In order to generate an instance of P_fbd, use the following command, where the description of the arguments and keywords is given below.

pa=P_fbd(ntg, nt, nr, nts; dobs, gobs, sobs)

Arguments

Let (ntg,nr)=size(g), (nt,nr)=size(d) and (nts,)=size(s), where

ntg is input dimension of the channel impulse responses g.

nt is input dimension of the channel outputs d.

nr is the number of receivers or channels.

nts is input dimension of the source.

Keywords

dobs are the channel responses that will be factorized. Alternatively, the user may input the next two keywords i.e., gobs and sobs for synthetic experiments, where dobs are internally generated.

gobs (optional) are the true channel impulse responses, stored in pa.

sobs (optional) similarly, it is the true source.

source
Base.getindexMethod.

Let pa be in instance of the FBD model. Its properties can be easily accessed as using the following getindex calls.

pa[:s] returns the source, either estimated after fbd! or lsbd!, from the model.

pa[:sa] returns the auto-correlated source, estimated after fibd!.

pa[:g] returns the channel impulse responses, estimated after fbd! or lsbd!.

pa[:xg] returns the interferometric channel impulse responses estimated after fibd!.

pa[:d] returns the convolution of pa[:s] and pa[:g].

pa[:xd] returns the convolution of pa[:sa] and pa[:xg].

pa[:sobs] returns the true source, when stored.

pa[:gobs] returns the true impulse responses, when stored.

pa[:xgobs] returns the true interferometric channel impulse responses, if stored.

pa[:dobs] returns the measured channel outputs that fbd! or lsbd! aims to factorize.

pa[:xdobs] returns the measured interferometric channel outputs that fibd! aims to factorize.

source

One can use the lsbd! method to perform LSBD over a given instance of P_fbd i.e., pa. LBSD is a least-squares fitting of d to jointly optimize the g and s, which can be accessed via pa[:g] and pa[:s], respectively. The joint optimization is carried out using alternating minimization: in one cycle, we fix one array and optimize the other, and then fix the other and optimize the first. Several cycles are expected to be performed to reach convergence.

lsbd!(pa)
heatmap(pa[:g], title="estimated impulse responses from LSBD")
source

One can use the fibd! method to perform FIBD over a given instance of P_fbd i.e., pa. FIBD is a least-squares fitting of xd to jointly optimize the xg and sa, which can be accessed via pa[:xg] and pa[:sa], respectively. The joint optimization is carried out using alternating minimization.

fibd!(pa)
heatmap(pa[:xg], title="estimated interferometric impulse responses from FIBD")
source

After performing FIBD on a P_fbd instance pa, we can perform FPR to complete FBD. These two code blocks should be equivalent.

fibd!(pa)
fpr!(pa)
fbd!(pa)

The result of FPR i.e, g can be extracted using pa[:g]. The corresponding source signature is stored in pa[:s].

source

Perform FIBD and FPR to complete FBD of an instance of P_fbd i.e., pa.

fbd!(pa)
plot(pa[:g], title="estimated impulse responses using FBD")
plot(pa[:s], title="estimated source using FBD")
source