Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
LOFAR
Manage
Activity
Members
Labels
Plan
Issues
Wiki
Jira issues
Open Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Code review analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RadioObservatory
LOFAR
Commits
557aa7be
Commit
557aa7be
authored
14 years ago
by
Andre Offringa
Browse files
Options
Downloads
Patches
Plain Diff
Bug 1491: largely refactoring the timeconvolutionaction
parent
be8dff33
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/timeconvolutionaction.h
+314
-222
314 additions, 222 deletions
...er/include/AOFlagger/rfi/strategy/timeconvolutionaction.h
with
314 additions
and
222 deletions
CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/timeconvolutionaction.h
+
314
−
222
View file @
557aa7be
...
@@ -141,6 +141,34 @@ namespace rfiStrategy {
...
@@ -141,6 +141,34 @@ namespace rfiStrategy {
bool
IsSincScaleInSamples
()
const
{
return
_isSincScaleInSamples
;
}
bool
IsSincScaleInSamples
()
const
{
return
_isSincScaleInSamples
;
}
void
SetIsSincScaleInSamples
(
bool
inSamples
)
{
_isSincScaleInSamples
=
inSamples
;
}
void
SetIsSincScaleInSamples
(
bool
inSamples
)
{
_isSincScaleInSamples
=
inSamples
;
}
private
:
private
:
struct
IterationData
{
ArtifactSet
*
artifacts
;
size_t
width
,
fourierWidth
,
rangeStart
,
rangeEnd
,
vZeroPos
,
startXf
,
endXf
;
numl_t
maxDist
;
numl_t
*
rowRValues
,
*
rowIValues
,
*
rowUPositions
,
*
rowVPositions
,
*
fourierValuesReal
,
*
fourierValuesImag
;
numl_t
**
fSinTable
,
**
fCosTable
;
bool
*
rowSignsNegated
;
};
Image2DPtr
PerformSingleSincOperation
(
ArtifactSet
&
artifacts
)
const
Image2DPtr
PerformSingleSincOperation
(
ArtifactSet
&
artifacts
)
const
{
{
TimeFrequencyData
data
=
artifacts
.
ContaminatedData
();
TimeFrequencyData
data
=
artifacts
.
ContaminatedData
();
...
@@ -265,125 +293,118 @@ private:
...
@@ -265,125 +293,118 @@ private:
return
newImage
;
return
newImage
;
}
}
void
PerformExtrapolatedSincOperation
(
ArtifactSet
&
artifacts
,
Image2DPtr
real
,
Image2DPtr
imaginary
,
class
ProgressListener
&
listener
)
const
void
Project
(
class
IterationData
&
iterData
,
Image2DCPtr
real
,
Image2DCPtr
imaginary
,
size_t
y
)
const
{
TimeFrequencyMetaDataCPtr
metaData
=
artifacts
.
MetaData
();
const
size_t
width
=
real
->
Width
();
const
size_t
fourierWidth
=
width
*
2
;
const
BandInfo
band
=
artifacts
.
MetaData
()
->
Band
();
numl_t
*
rowRValues
=
new
numl_t
[
width
],
*
rowIValues
=
new
numl_t
[
width
],
*
rowUPositions
=
new
numl_t
[
width
],
*
rowVPositions
=
new
numl_t
[
width
],
*
fourierValuesReal
=
new
numl_t
[
fourierWidth
],
*
fourierValuesImag
=
new
numl_t
[
fourierWidth
];
bool
*
rowSignsNegated
=
new
bool
[
width
];
for
(
size_t
y
=
0
;
y
<
real
->
Height
();
++
y
)
{
{
listener
.
OnProgress
(
*
this
,
y
,
real
->
Height
());
UVProjection
::
Project
(
real
,
iterData
.
artifacts
->
MetaData
(),
y
,
iterData
.
rowRValues
,
iterData
.
rowUPositions
,
iterData
.
rowVPositions
,
iterData
.
rowSignsNegated
,
_directionRad
,
false
);
UVProjection
::
Project
(
imaginary
,
iterData
.
artifacts
->
MetaData
(),
y
,
iterData
.
rowIValues
,
iterData
.
rowUPositions
,
iterData
.
rowVPositions
,
iterData
.
rowSignsNegated
,
_directionRad
,
true
);
UVProjection
::
Project
(
real
,
metaData
,
y
,
rowRValues
,
rowUPositions
,
rowVPositions
,
rowSignsNegated
,
_directionRad
,
false
);
UVProjection
::
Project
(
imaginary
,
metaData
,
y
,
rowIValues
,
rowUPositions
,
rowVPositions
,
rowSignsNegated
,
_directionRad
,
true
);
// Find the point closest to v=0
// Find the point closest to v=0
numl_t
vDist
=
fabsnl
(
rowVPositions
[
0
]);
const
size_t
width
=
real
->
Width
();
numl_t
vDist
=
fabsnl
(
iterData
.
rowVPositions
[
0
]);
size_t
vZeroPos
=
0
;
size_t
vZeroPos
=
0
;
for
(
unsigned
i
=
1
;
i
<
width
;
++
i
)
for
(
unsigned
i
=
1
;
i
<
width
;
++
i
)
{
{
if
(
fabsnl
(
rowVPositions
[
i
])
<
vDist
)
if
(
fabsnl
(
iterData
.
rowVPositions
[
i
])
<
vDist
)
{
{
vDist
=
fabsnl
(
rowVPositions
[
i
]);
vDist
=
fabsnl
(
iterData
.
rowVPositions
[
i
]);
vZeroPos
=
i
;
vZeroPos
=
i
;
}
}
}
}
const
numl_t
maxDist
=
fabsnl
(
rowUPositions
[
vZeroPos
]);
iterData
.
vZeroPos
=
iterData
.
vZeroPos
;
iterData
.
maxDist
=
fabsnl
(
iterData
.
rowUPositions
[
vZeroPos
]);
AOLogger
::
Debug
<<
"v is min at t="
<<
vZeroPos
<<
" (v=+-"
<<
vDist
<<
", maxDist="
<<
maxDist
<<
")
\n
"
;
AOLogger
::
Debug
<<
"v is min at t="
<<
vZeroPos
<<
" (v=+-"
<<
vDist
<<
", maxDist="
<<
iterData
.
maxDist
<<
")
\n
"
;
}
size_t
void
PrecalculateFTFactors
(
class
IterationData
&
iterData
)
const
rangeStart
=
(
size_t
)
roundn
(
_etaParameter
*
(
num_t
)
width
/
2.0
),
{
rangeEnd
=
width
-
rangeStart
;
const
size_t
width
=
iterData
.
width
,
fourierWidth
=
iterData
.
fourierWidth
,
rangeStart
=
iterData
.
rangeStart
,
rangeEnd
=
iterData
.
rangeEnd
;
// Precalculate sinus values for FT
iterData
.
fSinTable
=
new
numl_t
*
[
fourierWidth
],
numl_t
iterData
.
fCosTable
=
new
numl_t
*
[
fourierWidth
];
**
fSinTable
=
new
numl_t
*
[
fourierWidth
],
**
fCosTable
=
new
numl_t
*
[
fourierWidth
];
for
(
size_t
xF
=
0
;
xF
<
fourierWidth
;
++
xF
)
for
(
size_t
xF
=
0
;
xF
<
fourierWidth
;
++
xF
)
{
{
fSinTable
[
xF
]
=
new
numl_t
[
rangeEnd
-
rangeStart
];
iterData
.
fSinTable
[
xF
]
=
new
numl_t
[
rangeEnd
-
rangeStart
];
fCosTable
[
xF
]
=
new
numl_t
[
rangeEnd
-
rangeStart
];
iterData
.
fCosTable
[
xF
]
=
new
numl_t
[
rangeEnd
-
rangeStart
];
// F(xF) = \int f(u) * e^(-i 2 \pi * u_n * xF_n)
// F(xF) = \int f(u) * e^(-i 2 \pi * u_n * xF_n)
// xF \in [0 : fourierWidth] -> xF_n = 2 xF / fourierWidth - 1 \in [-1 : 1];
// xF \in [0 : fourierWidth] -> xF_n = 2 xF / fourierWidth - 1 \in [-1 : 1];
// u \in [-maxDist : maxDist] -> u_n = u * width / maxDist \in [ -width : width ]
// u \in [-maxDist : maxDist] -> u_n = u * width / maxDist \in [ -width : width ]
// final frequenty domain covers [-maxDist : maxDist]
// final frequenty domain covers [-maxDist : maxDist]
const
numl_t
const
numl_t
fourierPos
=
(
numl_t
)
xF
/
fourierWidth
-
0.5
,
fourierPos
=
(
numl_t
)
xF
/
fourierWidth
-
0.5
,
fourierFactor
=
-
fourierPos
*
2.0
*
M_PInl
*
width
*
0.5
/
maxDist
;
fourierFactor
=
-
fourierPos
*
2.0
*
M_PInl
*
width
*
0.5
/
iterData
.
maxDist
;
for
(
size_t
tIndex
=
rangeStart
;
tIndex
<
rangeEnd
;
++
tIndex
)
for
(
size_t
tIndex
=
rangeStart
;
tIndex
<
rangeEnd
;
++
tIndex
)
{
{
size_t
t
=
(
tIndex
+
width
-
vZeroPos
)
%
width
;
size_t
t
=
(
tIndex
+
width
-
iterData
.
vZeroPos
)
%
width
;
const
numl_t
posU
=
rowUPositions
[
t
];
const
numl_t
posU
=
iterData
.
rowUPositions
[
t
];
fCosTable
[
xF
][
tIndex
-
rangeStart
]
=
cosnl
(
fourierFactor
*
posU
);
iterData
.
fCosTable
[
xF
][
tIndex
-
rangeStart
]
=
cosnl
(
fourierFactor
*
posU
);
fSinTable
[
xF
][
tIndex
-
rangeStart
]
=
sinnl
(
fourierFactor
*
posU
);
iterData
.
fSinTable
[
xF
][
tIndex
-
rangeStart
]
=
sinnl
(
fourierFactor
*
posU
);
}
}
}
}
}
for
(
unsigned
i
teration
=
0
;
iterat
ion
<
_iterations
;
++
iteration
)
void
PerformFourierTransform
(
class
I
teration
Data
&
iter
D
at
a
,
Image2DPtr
real
,
Image2DPtr
imaginary
,
size_t
y
)
const
{
{
const
size_t
rangeStart
=
iterData
.
rangeStart
,
rangeEnd
=
iterData
.
rangeEnd
,
width
=
iterData
.
width
,
vZeroPos
=
iterData
.
vZeroPos
;
// Perform a 1d Fourier transform, ignoring eta part of the data
// Perform a 1d Fourier transform, ignoring eta part of the data
for
(
size_t
xF
=
0
;
xF
<
fourierWidth
;
++
xF
)
for
(
size_t
xF
=
0
;
xF
<
iterData
.
fourierWidth
;
++
xF
)
{
{
numl_t
numl_t
realVal
=
0.0
,
realVal
=
0.0
,
imagVal
=
0.0
,
imagVal
=
0.0
,
weightSum
=
0.0
;
weightSum
=
0.0
;
const
numl_t
*
fCosTable
=
iterData
.
fCosTable
[
xF
],
*
fSinTable
=
iterData
.
fSinTable
[
xF
];
// compute F(xF) = \int f(x) * exp( -2 * \pi * i * x * xF )
// compute F(xF) = \int f(x) * exp( -2 * \pi * i * x * xF )
for
(
size_t
tIndex
=
rangeStart
;
tIndex
<
rangeEnd
;
++
tIndex
)
for
(
size_t
tIndex
=
rangeStart
;
tIndex
<
rangeEnd
;
++
tIndex
)
{
{
size_t
t
=
(
tIndex
+
width
-
vZeroPos
)
%
width
;
size_t
t
=
(
tIndex
+
width
-
vZeroPos
)
%
width
;
if
(
rowUPositions
[
t
]
!=
0.0
)
if
(
iterData
.
rowUPositions
[
t
]
!=
0.0
)
{
{
const
numl_t
weight
=
1.0
;
//fabsnl(rowVPositions[t]/posU);
const
numl_t
weight
=
1.0
;
//fabsnl(rowVPositions[t]/posU);
const
numl_t
weightSqrt
=
1.0
;
//sqrtnl(weight);
const
numl_t
weightSqrt
=
1.0
;
//sqrtnl(weight);
realVal
+=
(
rowRValues
[
t
]
*
fCosTable
[
xF
][
tIndex
-
rangeStart
]
-
realVal
+=
(
iterData
.
rowRValues
[
t
]
*
fCosTable
[
tIndex
-
rangeStart
]
-
rowIValues
[
t
]
*
fSinTable
[
xF
][
tIndex
-
rangeStart
])
*
weightSqrt
;
iterData
.
rowIValues
[
t
]
*
fSinTable
[
tIndex
-
rangeStart
])
*
weightSqrt
;
imagVal
+=
(
rowIValues
[
t
]
*
fCosTable
[
xF
][
tIndex
-
rangeStart
]
+
imagVal
+=
(
iterData
.
rowIValues
[
t
]
*
fCosTable
[
tIndex
-
rangeStart
]
+
rowRValues
[
t
]
*
fSinTable
[
xF
][
tIndex
-
rangeStart
])
*
weightSqrt
;
iterData
.
rowRValues
[
t
]
*
fSinTable
[
tIndex
-
rangeStart
])
*
weightSqrt
;
weightSum
+=
weight
;
weightSum
+=
weight
;
}
}
}
}
fourierValuesReal
[
xF
]
=
realVal
/
weightSum
;
iterData
.
fourierValuesReal
[
xF
]
=
realVal
/
weightSum
;
fourierValuesImag
[
xF
]
=
imagVal
/
weightSum
;
iterData
.
fourierValuesImag
[
xF
]
=
imagVal
/
weightSum
;
if
(
_operation
==
ProjectedFTOperation
)
if
(
_operation
==
ProjectedFTOperation
)
{
{
real
->
SetValue
(
xF
/
2
,
y
,
(
num_t
)
realVal
/
weightSum
);
real
->
SetValue
(
xF
/
2
,
y
,
(
num_t
)
realVal
/
weightSum
);
imaginary
->
SetValue
(
xF
/
2
,
y
,
(
num_t
)
imagVal
/
weightSum
);
imaginary
->
SetValue
(
xF
/
2
,
y
,
(
num_t
)
imagVal
/
weightSum
);
}
}
}
}
}
numl_t
sincScale
=
ActualSincScaleInLambda
(
artifacts
,
band
.
channels
[
y
].
frequencyHz
);
void
InvFourierTransform
(
class
IterationData
&
iterData
,
Image2DPtr
real
,
Image2DPtr
imaginary
,
size_t
y
)
const
numl_t
clippingFrequency
=
1.0
/
(
sincScale
*
width
/
maxDist
);
long
fourierClippingIndex
=
(
long
)
ceilnl
((
numl_t
)
fourierWidth
*
0.5
*
clippingFrequency
);
if
(
fourierClippingIndex
*
2
>
(
long
)
fourierWidth
)
fourierClippingIndex
=
fourierWidth
/
2
;
if
(
fourierClippingIndex
<
0
)
fourierClippingIndex
=
0
;
size_t
startXf
=
fourierWidth
/
2
-
fourierClippingIndex
,
endXf
=
fourierWidth
/
2
+
fourierClippingIndex
;
if
(
_operation
==
ExtrapolatedSincOperation
)
{
{
const
size_t
startXf
=
iterData
.
startXf
,
endXf
=
iterData
.
endXf
,
width
=
iterData
.
width
,
fourierWidth
=
iterData
.
fourierWidth
;
AOLogger
::
Debug
<<
"Inv FT, using 0-"
<<
startXf
<<
" and "
<<
endXf
<<
"-"
<<
fourierWidth
<<
'\n'
;
AOLogger
::
Debug
<<
"Inv FT, using 0-"
<<
startXf
<<
" and "
<<
endXf
<<
"-"
<<
fourierWidth
<<
'\n'
;
for
(
size_t
t
=
0
;
t
<
width
;
++
t
)
for
(
size_t
t
=
0
;
t
<
width
;
++
t
)
{
{
const
numl_t
const
numl_t
posU
=
rowUPositions
[
t
],
posU
=
iterData
.
rowUPositions
[
t
],
posV
=
rowVPositions
[
t
],
posV
=
iterData
.
rowVPositions
[
t
],
posFactor
=
posU
*
2.0
*
M_PInl
;
posFactor
=
posU
*
2.0
*
M_PInl
;
numl_t
numl_t
realVal
=
0.0
,
realVal
=
0.0
,
...
@@ -409,8 +430,8 @@ private:
...
@@ -409,8 +430,8 @@ private:
{
{
const
numl_t
const
numl_t
fourierPosL
=
(
numl_t
)
xF
/
fourierWidth
-
0.5
,
fourierPosL
=
(
numl_t
)
xF
/
fourierWidth
-
0.5
,
fourierRealL
=
fourierValuesReal
[
xF
],
fourierRealL
=
iterData
.
fourierValuesReal
[
xF
],
fourierImagL
=
fourierValuesImag
[
xF
];
fourierImagL
=
iterData
.
fourierValuesImag
[
xF
];
const
numl_t
const
numl_t
cosValL
=
cosnl
(
fourierPosL
*
posFactor
),
cosValL
=
cosnl
(
fourierPosL
*
posFactor
),
...
@@ -423,8 +444,8 @@ private:
...
@@ -423,8 +444,8 @@ private:
{
{
const
numl_t
const
numl_t
fourierPosR
=
(
numl_t
)
(
endXf
+
xF
)
/
fourierWidth
-
0.5
,
fourierPosR
=
(
numl_t
)
(
endXf
+
xF
)
/
fourierWidth
-
0.5
,
fourierRealR
=
fourierValuesReal
[
endXf
+
xF
],
fourierRealR
=
iterData
.
fourierValuesReal
[
endXf
+
xF
],
fourierImagR
=
fourierValuesImag
[
endXf
+
xF
];
fourierImagR
=
iterData
.
fourierValuesImag
[
endXf
+
xF
];
const
numl_t
const
numl_t
cosValR
=
cosnl
(
fourierPosR
*
posFactor
),
cosValR
=
cosnl
(
fourierPosR
*
posFactor
),
...
@@ -436,27 +457,41 @@ private:
...
@@ -436,27 +457,41 @@ private:
++
xF
;
++
xF
;
}
}
real
->
SetValue
(
t
,
y
,
-
realVal
/
weightSum
);
real
->
SetValue
(
t
,
y
,
-
realVal
/
weightSum
);
if
(
rowSignsNegated
[
t
])
if
(
iterData
.
rowSignsNegated
[
t
])
imaginary
->
SetValue
(
t
,
y
,
imagVal
/
weightSum
);
imaginary
->
SetValue
(
t
,
y
,
imagVal
/
weightSum
);
else
else
imaginary
->
SetValue
(
t
,
y
,
-
imagVal
/
weightSum
);
imaginary
->
SetValue
(
t
,
y
,
-
imagVal
/
weightSum
);
}
}
}
}
}
else
if
(
_operation
==
IterativeExtrapolatedSincOperation
)
{
}
void
SubtractComponent
(
class
IterationData
&
iterData
,
Image2DPtr
real
,
Image2DPtr
imaginary
,
size_t
y
)
const
{
const
size_t
startXf
=
iterData
.
startXf
,
endXf
=
iterData
.
endXf
,
width
=
iterData
.
width
,
fourierWidth
=
iterData
.
fourierWidth
;
// Find strongest frequency
// Find strongest frequency
AOLogger
::
Debug
<<
"Limiting search to xF<"
<<
startXf
<<
" and xF>"
<<
endXf
<<
'\n'
;
AOLogger
::
Debug
<<
"Limiting search to xF<"
<<
startXf
<<
" and xF>"
<<
endXf
<<
'\n'
;
size_t
xFRemoval
=
0
;
size_t
xFRemoval
=
0
;
double
xFValue
=
fourierValuesReal
[
0
]
*
fourierValuesReal
[
0
]
+
fourierValuesImag
[
0
]
*
fourierValuesImag
[
0
];
double
xFValue
=
iterData
.
fourierValuesReal
[
0
]
*
iterData
.
fourierValuesReal
[
0
]
+
iterData
.
fourierValuesImag
[
0
]
*
iterData
.
fourierValuesImag
[
0
];
for
(
size_t
xF
=
0
;
xF
<
startXf
;
++
xF
)
for
(
size_t
xF
=
0
;
xF
<
startXf
;
++
xF
)
{
{
numl_t
val
=
fourierValuesReal
[
xF
]
*
fourierValuesReal
[
xF
]
+
fourierValuesImag
[
xF
]
*
fourierValuesImag
[
xF
];
numl_t
fReal
=
iterData
.
fourierValuesReal
[
xF
],
fImag
=
iterData
.
fourierValuesImag
[
xF
],
val
=
fReal
*
fReal
+
fImag
*
fImag
;
if
(
val
>
xFValue
)
if
(
val
>
xFValue
)
{
{
xFRemoval
=
xF
;
xFRemoval
=
xF
;
xFValue
=
val
;
xFValue
=
val
;
}
}
val
=
fourierValuesReal
[
xF
+
endXf
]
*
fourierValuesReal
[
xF
+
endXf
]
+
fourierValuesImag
[
xF
+
endXf
]
*
fourierValuesImag
[
xF
+
endXf
];
fReal
=
iterData
.
fourierValuesReal
[
xF
+
endXf
];
fImag
=
iterData
.
fourierValuesImag
[
xF
+
endXf
];
val
=
fReal
*
fReal
+
fImag
*
fImag
;
if
(
val
>
xFValue
)
if
(
val
>
xFValue
)
{
{
xFRemoval
=
xF
+
endXf
;
xFRemoval
=
xF
+
endXf
;
...
@@ -465,19 +500,19 @@ private:
...
@@ -465,19 +500,19 @@ private:
}
}
const
numl_t
const
numl_t
fourierPos
=
(
numl_t
)
xFRemoval
/
fourierWidth
-
0.5
,
fourierPos
=
(
numl_t
)
xFRemoval
/
fourierWidth
-
0.5
,
fourierFactor
=
fourierPos
*
2.0
*
M_PInl
*
width
*
0.5
/
maxDist
,
fourierFactor
=
fourierPos
*
2.0
*
M_PInl
*
width
*
0.5
/
iterData
.
maxDist
,
fourierReal
=
fourierValuesReal
[
xFRemoval
],
fourierReal
=
iterData
.
fourierValuesReal
[
xFRemoval
],
fourierImag
=
fourierValuesImag
[
xFRemoval
];
fourierImag
=
iterData
.
fourierValuesImag
[
xFRemoval
];
AOLogger
::
Debug
<<
"Strongest frequency at xF="
<<
xFRemoval
<<
", amp^2="
<<
xFValue
<<
'\n'
;
AOLogger
::
Debug
<<
"Strongest frequency at xF="
<<
xFRemoval
<<
", amp^2="
<<
xFValue
<<
'\n'
;
AOLogger
::
Debug
<<
"Corresponding frequency: "
<<
fourierPos
<<
" x "
<<
maxDist
<<
" / "
AOLogger
::
Debug
<<
"Corresponding frequency: "
<<
fourierPos
<<
" x "
<<
iterData
.
maxDist
<<
" / "
<<
width
<<
" = "
<<
(
fourierPos
*
maxDist
/
width
)
<<
" (pixels/fringe)
\n
"
;
<<
width
<<
" = "
<<
(
fourierPos
*
iterData
.
maxDist
/
width
)
<<
" (pixels/fringe)
\n
"
;
// Remove strongest frequency
// Remove strongest frequency
for
(
size_t
t
=
0
;
t
<
width
;
++
t
)
for
(
size_t
t
=
0
;
t
<
width
;
++
t
)
{
{
const
numl_t
const
numl_t
posU
=
rowUPositions
[
t
],
posU
=
iterData
.
rowUPositions
[
t
],
weightSum
=
1.0
;
weightSum
=
1.0
;
const
numl_t
const
numl_t
...
@@ -487,37 +522,94 @@ private:
...
@@ -487,37 +522,94 @@ private:
numl_t
realVal
=
(
fourierReal
*
cosValL
-
fourierImag
*
sinValL
)
*
0.75
/
weightSum
;
numl_t
realVal
=
(
fourierReal
*
cosValL
-
fourierImag
*
sinValL
)
*
0.75
/
weightSum
;
numl_t
imagVal
=
(
fourierImag
*
cosValL
+
fourierReal
*
sinValL
)
*
0.75
/
weightSum
;
numl_t
imagVal
=
(
fourierImag
*
cosValL
+
fourierReal
*
sinValL
)
*
0.75
/
weightSum
;
rowRValues
[
t
]
-=
realVal
;
iterData
.
rowRValues
[
t
]
-=
realVal
;
rowIValues
[
t
]
-=
imagVal
;
iterData
.
rowIValues
[
t
]
-=
imagVal
;
real
->
SetValue
(
t
,
y
,
rowRValues
[
t
]);
real
->
SetValue
(
t
,
y
,
iterData
.
rowRValues
[
t
]);
if
(
rowSignsNegated
[
t
])
if
(
iterData
.
rowSignsNegated
[
t
])
imaginary
->
SetValue
(
t
,
y
,
-
rowIValues
[
t
]);
imaginary
->
SetValue
(
t
,
y
,
-
iterData
.
rowIValues
[
t
]);
else
else
imaginary
->
SetValue
(
t
,
y
,
rowIValues
[
t
]);
imaginary
->
SetValue
(
t
,
y
,
iterData
.
rowIValues
[
t
]);
}
}
void
PerformExtrapolatedSincOperation
(
ArtifactSet
&
artifacts
,
Image2DPtr
real
,
Image2DPtr
imaginary
,
class
ProgressListener
&
listener
)
const
{
TimeFrequencyMetaDataCPtr
metaData
=
artifacts
.
MetaData
();
const
size_t
width
=
real
->
Width
();
const
BandInfo
band
=
artifacts
.
MetaData
()
->
Band
();
class
IterationData
iterData
;
iterData
.
artifacts
=
&
artifacts
;
iterData
.
width
=
width
;
iterData
.
rowRValues
=
new
numl_t
[
width
];
iterData
.
rowIValues
=
new
numl_t
[
width
];
iterData
.
rowUPositions
=
new
numl_t
[
width
];
iterData
.
rowVPositions
=
new
numl_t
[
width
];
iterData
.
fourierWidth
=
width
*
2
;
iterData
.
fourierValuesReal
=
new
numl_t
[
iterData
.
fourierWidth
];
iterData
.
fourierValuesImag
=
new
numl_t
[
iterData
.
fourierWidth
];
iterData
.
rowSignsNegated
=
new
bool
[
width
];
iterData
.
rangeStart
=
(
size_t
)
roundn
(
_etaParameter
*
(
num_t
)
width
/
2.0
),
iterData
.
rangeEnd
=
width
-
iterData
.
rangeStart
;
for
(
size_t
y
=
0
;
y
<
real
->
Height
();
++
y
)
{
listener
.
OnProgress
(
*
this
,
y
,
real
->
Height
());
Project
(
iterData
,
real
,
imaginary
,
y
);
PrecalculateFTFactors
(
iterData
);
for
(
unsigned
iteration
=
0
;
iteration
<
_iterations
;
++
iteration
)
{
PerformFourierTransform
(
iterData
,
real
,
imaginary
,
y
);
numl_t
sincScale
=
ActualSincScaleInLambda
(
artifacts
,
band
.
channels
[
y
].
frequencyHz
);
numl_t
clippingFrequency
=
1.0
/
(
sincScale
*
width
/
iterData
.
maxDist
);
long
fourierClippingIndex
=
(
long
)
ceilnl
((
numl_t
)
iterData
.
fourierWidth
*
0.5
*
clippingFrequency
);
if
(
fourierClippingIndex
*
2
>
(
long
)
iterData
.
fourierWidth
)
fourierClippingIndex
=
iterData
.
fourierWidth
/
2
;
if
(
fourierClippingIndex
<
0
)
fourierClippingIndex
=
0
;
iterData
.
startXf
=
iterData
.
fourierWidth
/
2
-
fourierClippingIndex
,
iterData
.
endXf
=
iterData
.
fourierWidth
/
2
+
fourierClippingIndex
;
if
(
_operation
==
ExtrapolatedSincOperation
)
{
InvFourierTransform
(
iterData
,
real
,
imaginary
,
y
);
}
}
else
if
(
_operation
==
IterativeExtrapolatedSincOperation
)
{
SubtractComponent
(
iterData
,
real
,
imaginary
,
y
);
}
}
}
}
for
(
size_t
xF
=
0
;
xF
<
fourierWidth
;
++
xF
)
for
(
size_t
xF
=
0
;
xF
<
iterData
.
fourierWidth
;
++
xF
)
{
{
delete
[]
fSinTable
[
xF
];
delete
[]
iterData
.
fSinTable
[
xF
];
delete
[]
fCosTable
[
xF
];
delete
[]
iterData
.
fCosTable
[
xF
];
}
}
delete
[]
fSinTable
;
delete
[]
iterData
.
fSinTable
;
delete
[]
fCosTable
;
delete
[]
iterData
.
fCosTable
;
}
}
listener
.
OnProgress
(
*
this
,
real
->
Height
(),
real
->
Height
());
listener
.
OnProgress
(
*
this
,
real
->
Height
(),
real
->
Height
());
delete
[]
rowRValues
;
delete
[]
iterData
.
rowRValues
;
delete
[]
rowIValues
;
delete
[]
iterData
.
rowIValues
;
delete
[]
rowUPositions
;
delete
[]
iterData
.
rowUPositions
;
delete
[]
rowVPositions
;
delete
[]
iterData
.
rowVPositions
;
delete
[]
rowSignsNegated
;
delete
[]
iterData
.
rowSignsNegated
;
delete
[]
fourierValuesReal
;
delete
[]
iterData
.
fourierValuesReal
;
delete
[]
fourierValuesImag
;
delete
[]
iterData
.
fourierValuesImag
;
}
}
numl_t
avgUVDistance
(
const
std
::
vector
<
UVW
>
&
uvw
,
const
double
frequencyHz
)
const
numl_t
avgUVDistance
(
ArtifactSet
&
artifacts
,
const
double
frequencyHz
)
const
{
{
const
std
::
vector
<
UVW
>
&
uvw
=
artifacts
.
MetaData
()
->
UVW
();
numl_t
avgDist
=
0.0
;
numl_t
avgDist
=
0.0
;
for
(
std
::
vector
<
UVW
>::
const_iterator
i
=
uvw
.
begin
();
i
!=
uvw
.
end
();
++
i
)
for
(
std
::
vector
<
UVW
>::
const_iterator
i
=
uvw
.
begin
();
i
!=
uvw
.
end
();
++
i
)
{
{
...
@@ -532,13 +624,13 @@ private:
...
@@ -532,13 +624,13 @@ private:
if
(
_isSincScaleInSamples
)
if
(
_isSincScaleInSamples
)
return
_sincSize
;
return
_sincSize
;
else
else
return
_sincSize
/
avgUVDistance
(
artifacts
.
MetaData
()
->
UVW
()
,
frequencyHz
)
*
(
0.5
*
(
numl_t
)
artifacts
.
ContaminatedData
().
ImageWidth
());
return
_sincSize
/
avgUVDistance
(
artifacts
,
frequencyHz
)
*
(
0.5
*
(
numl_t
)
artifacts
.
ContaminatedData
().
ImageWidth
());
}
}
numl_t
ActualSincScaleInLambda
(
ArtifactSet
&
artifacts
,
const
double
frequencyHz
)
const
numl_t
ActualSincScaleInLambda
(
ArtifactSet
&
artifacts
,
const
double
frequencyHz
)
const
{
{
if
(
_isSincScaleInSamples
)
if
(
_isSincScaleInSamples
)
return
_sincSize
/
(
0.5
*
(
numl_t
)
artifacts
.
ContaminatedData
().
ImageWidth
())
*
avgUVDistance
(
artifacts
.
MetaData
()
->
UVW
()
,
frequencyHz
);
return
_sincSize
/
(
0.5
*
(
numl_t
)
artifacts
.
ContaminatedData
().
ImageWidth
())
*
avgUVDistance
(
artifacts
,
frequencyHz
);
else
else
return
_sincSize
;
return
_sincSize
;
}
}
...
@@ -558,7 +650,7 @@ private:
...
@@ -558,7 +650,7 @@ private:
AOLogger
::
Debug
<<
"Central frequency: "
<<
centralFreq
<<
"
\n
"
;
AOLogger
::
Debug
<<
"Central frequency: "
<<
centralFreq
<<
"
\n
"
;
AOLogger
::
Debug
<<
"Baseline length: "
<<
artifacts
.
MetaData
()
->
Baseline
().
Distance
()
<<
'\n'
;
AOLogger
::
Debug
<<
"Baseline length: "
<<
artifacts
.
MetaData
()
->
Baseline
().
Distance
()
<<
'\n'
;
AOLogger
::
Debug
<<
"Sinc scale in lambda: "
<<
ActualSincScaleInLambda
(
artifacts
,
centralFreq
)
<<
'\n'
;
AOLogger
::
Debug
<<
"Sinc scale in lambda: "
<<
ActualSincScaleInLambda
(
artifacts
,
centralFreq
)
<<
'\n'
;
AOLogger
::
Debug
<<
"Average distance: "
<<
avgUVDistance
(
artifacts
.
MetaData
()
->
UVW
()
,
centralFreq
)
<<
'\n'
;
AOLogger
::
Debug
<<
"Average distance: "
<<
avgUVDistance
(
artifacts
,
centralFreq
)
<<
'\n'
;
const
numl_t
sincDist
=
ActualSincScaleAsRaDecDist
(
artifacts
,
centralFreq
);
const
numl_t
sincDist
=
ActualSincScaleAsRaDecDist
(
artifacts
,
centralFreq
);
numl_t
ignoreRadius
=
sincDist
/
imager
.
UVScaling
();
numl_t
ignoreRadius
=
sincDist
/
imager
.
UVScaling
();
AOLogger
::
Debug
<<
"Ignoring radius="
<<
ignoreRadius
<<
"
\n
"
;
AOLogger
::
Debug
<<
"Ignoring radius="
<<
ignoreRadius
<<
"
\n
"
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment