Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
ITABase
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Institute of Technical Acoustics (ITA)
ITABase
Commits
c043adea
Commit
c043adea
authored
Jun 18, 2017
by
Dipl.-Ing. Jonas Stienen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
API redefinition of HDFT spectrum, now all ITA conform
parent
3d680c09
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
142 additions
and
108 deletions
+142
-108
include/ITAHDFTSpectrum.h
include/ITAHDFTSpectrum.h
+38
-38
src/ITAHDFTSpectra.cpp
src/ITAHDFTSpectra.cpp
+7
-7
src/ITAHDFTSpectrum.cpp
src/ITAHDFTSpectrum.cpp
+97
-63
No files found.
include/ITAHDFTSpectrum.h
View file @
c043adea
...
...
@@ -106,67 +106,67 @@ public:
float
*
GetData
()
const
;
// DFT Koeffizient(en) setzen (Real-/Imaginrteil bzw. Betrag/Phase)
void
setCoeffRI
(
int
iIndex
,
float
fReal
,
float
fImag
=
0
);
void
setCoeffsRI
(
float
fReal
,
float
fImag
=
0
);
void
setCoeffsRI
(
int
iOffset
,
int
iCount
,
float
fReal
,
float
fImag
=
0
);
void
SetCoeffRI
(
const
int
iIndex
,
const
float
fReal
,
const
float
fImag
=
0
);
void
SetCoeffsRI
(
const
float
fReal
,
const
float
fImag
=
0
);
void
SetCoeffsRI
(
const
int
iOffset
,
const
int
iCount
,
const
float
fReal
,
const
float
fImag
=
0
);
//! Set coefficient by index
void
SetCoeff
(
const
int
iIndex
,
std
::
complex
<
float
>&
cfCoeff
);
void
setCoeffMP
(
int
iIndex
,
float
fMagnitude
,
float
fPhase
);
void
setCoeffsMP
(
float
fMagnitude
,
float
fPhase
);
void
setCoeffsMP
(
int
iOffset
,
int
iCount
,
float
fMagnitude
,
float
fPhase
);
void
SetCoeffMP
(
const
int
iIndex
,
const
float
fMagnitude
,
const
float
fPhase
);
void
SetCoeffsMP
(
const
float
fMagnitude
,
const
float
fPhase
);
void
SetCoeffsMP
(
const
int
iOffset
,
const
int
iCount
,
const
float
fMagnitude
,
const
float
fPhase
);
//! Betragswert setzen, vorhandene Phasen erhalten
void
setMagnitudePreservePhase
(
int
iIndex
,
float
fMagnitude
);
void
setMagnitudesPreservePhases
(
float
fMagnitude
);
void
setMagnitudesPreservePhases
(
int
iOffset
,
int
iCount
,
float
fMagnitude
);
void
SetMagnitudePreservePhase
(
const
int
iIndex
,
const
float
fMagnitude
);
void
SetMagnitudesPreservePhases
(
const
float
fMagnitude
);
void
SetMagnitudesPreservePhases
(
const
int
iOffset
,
const
int
iCount
,
const
float
fMagnitude
);
//! Phase setzen, vorhandene Betrge erhalten
void
setPhasePreserveMagnitude
(
int
iIndex
,
float
fPhase
);
void
setPhasesPreserveMagnitudes
(
float
fPhase
);
void
setPhasesPreserveMagnitudes
(
int
iOffset
,
int
iCount
,
float
fPhase
);
void
SetPhasePreserveMagnitude
(
const
int
iIndex
,
const
float
fPhase
);
void
SetPhasesPreserveMagnitudes
(
const
float
fPhase
);
void
SetPhasesPreserveMagnitudes
(
const
int
iOffset
,
const
int
iCount
,
const
float
fPhase
);
// Konstante addieren
void
add
(
float
fReal
,
float
fImag
=
0
);
void
sub
(
float
fReal
,
float
fImag
=
0
);
void
Add
(
const
float
fReal
,
const
float
fImag
=
0
);
void
Sub
(
const
float
fReal
,
const
float
fImag
=
0
);
// Spektrum addieren
void
a
dd
(
const
ITAHDFTSpectrum
&
s
);
void
a
dd
(
const
ITAHDFTSpectrum
*
);
void
s
ub
(
const
ITAHDFTSpectrum
&
s
);
void
s
ub
(
const
ITAHDFTSpectrum
*
);
void
m
ul
(
const
ITAHDFTSpectrum
&
s
);
void
m
ul
(
const
float
fFactor
);
void
m
ul
(
const
ITAHDFTSpectrum
*
);
void
A
dd
(
const
ITAHDFTSpectrum
&
s
);
void
A
dd
(
const
ITAHDFTSpectrum
*
);
void
S
ub
(
const
ITAHDFTSpectrum
&
s
);
void
S
ub
(
const
ITAHDFTSpectrum
*
);
void
M
ul
(
const
ITAHDFTSpectrum
&
s
);
void
M
ul
(
const
float
fFactor
);
void
M
ul
(
const
ITAHDFTSpectrum
*
);
//! Multiplies the conjugate of the given spectrum without data copy
void
mul_c
onj
(
const
ITAHDFTSpectrum
*
);
void
MulC
onj
(
const
ITAHDFTSpectrum
*
);
//! Devide spectrum
void
d
iv
(
const
ITAHDFTSpectrum
&
s
);
void
d
iv
(
const
ITAHDFTSpectrum
*
);
void
D
iv
(
const
ITAHDFTSpectrum
&
s
);
void
D
iv
(
const
ITAHDFTSpectrum
*
);
//! Betragsspektrum berechnen und in gegebenes Array speichern
// Zeiger drfen Null sein
void
c
alcMagnitudes
(
float
*
pfMagnitudes
)
const
;
void
C
alcMagnitudes
(
float
*
pfMagnitudes
)
const
;
//! Calculates magnitude from real and imaginary part for a given frequency bin
float
calcMagnitude
(
int
iIndex
)
const
;
float
CalcMagnitude
(
const
int
iIndex
)
const
;
//! Phasenspektrum berechnen und in gegebenes Array speichern
// Zeiger drfen Null sein
void
c
alcPhases
(
float
*
pfPhasess
);
void
C
alcPhases
(
float
*
pfPhasess
);
//! Betragsgrten Koeffizienten ermitteln
float
f
indMax
()
const
;
float
f
indMax
(
int
&
iMaxIndex
)
const
;
float
F
indMax
()
const
;
float
F
indMax
(
int
&
iMaxIndex
)
const
;
//! Negieren (Multiplikation mit -1 bzw. Phasendrehungum 180)
void
n
egate
();
void
N
egate
();
//! Konjugiert das Spectrum
void
c
onjugate
();
void
C
onjugate
();
//! Set unity DFT coeffs (re == 1, im == 0)
void
SetUnity
();
...
...
@@ -180,20 +180,20 @@ public:
* Intern wird std::logf verwendet, so dass Betrag 0 den Wert -HUGE_VAL und der relle
* Logarithmus fr negative Werte den Wert NAN zurckgibt
*/
void
log
(
bool
bComplex
=
true
);
void
Log
(
const
bool
bComplex
=
true
);
//! Komplexe bzw. reelle Exponentialfunktion berechnen
/**
* Intern wird std::exp verwendet, so dass groe Betrge +-HUGE_VAL zurckgeben
*/
void
exp
(
bool
bComplex
=
true
);
void
Exp
(
const
bool
bComplex
=
true
);
//! Alle Filterkoeffizienten eines anderen Spektrums in dieses kopieren
void
c
opyFrom
(
const
ITAHDFTSpectrum
&
s
);
void
c
opy
(
const
ITAHDFTSpectrum
*
);
void
C
opyFrom
(
const
ITAHDFTSpectrum
&
s
);
void
C
opy
(
const
ITAHDFTSpectrum
*
);
//! Einen Teil der Filterkoeffizienten eines anderen Spektrums in dieses kopieren
void
copyFrom
(
const
ITAHDFTSpectrum
&
s
,
int
iOffset
,
int
iCount
);
void
CopyFrom
(
const
ITAHDFTSpectrum
&
s
,
const
int
iOffset
,
const
int
iCount
);
//! Zuweisungsoperator
/**
...
...
@@ -204,13 +204,13 @@ public:
ITAHDFTSpectrum
&
operator
=
(
const
ITAHDFTSpectrum
&
rhs
);
//! Zeichenkette mit den Werten zurckgeben
std
::
string
t
oString
();
std
::
string
T
oString
();
//! Calculates the energy of the spectrum
/**
* Returns the energy of a HDFTSpectrum as a float
*/
float
g
etEnergy
()
const
;
float
G
etEnergy
()
const
;
private:
...
...
src/ITAHDFTSpectra.cpp
View file @
c043adea
...
...
@@ -48,7 +48,7 @@ float ITAHDFTSpectra::GetMaxEnergy( int* piIdx ) const
float
fEnergyMax
=
-
1.0
f
;
for
(
size_t
n
=
0
;
n
<
m_vpSpectra
.
size
();
n
++
)
{
fEnergyTemp
=
m_vpSpectra
[
n
]
->
g
etEnergy
();
fEnergyTemp
=
m_vpSpectra
[
n
]
->
G
etEnergy
();
if
(
fEnergyTemp
>
fEnergyMax
)
{
fEnergyMax
=
fEnergyTemp
;
...
...
@@ -88,7 +88,7 @@ void ITAHDFTSpectra::SetZero()
for
(
size_t
i
=
0
;
i
<
m_vpSpectra
.
size
();
i
++
)
{
ITAHDFTSpectrum
*
pSpectrum
(
m_vpSpectra
[
i
]
);
pSpectrum
->
m
ul
(
0.0
f
);
pSpectrum
->
M
ul
(
0.0
f
);
}
}
...
...
@@ -116,7 +116,7 @@ void ITAHDFTSpectra::add( const ITAHDFTSpectra* pSource )
{
ITAHDFTSpectrum
*
pSpectrum
(
m_vpSpectra
[
i
]
);
const
ITAHDFTSpectrum
*
pSourceSpectrum
(
(
*
pSource
)[
i
]
);
pSpectrum
->
a
dd
(
pSourceSpectrum
);
pSpectrum
->
A
dd
(
pSourceSpectrum
);
}
return
;
...
...
@@ -131,7 +131,7 @@ void ITAHDFTSpectra::sub( const ITAHDFTSpectra* pSource )
{
ITAHDFTSpectrum
*
pSpectrum
(
m_vpSpectra
[
i
]
);
const
ITAHDFTSpectrum
*
pSourceSpectrum
(
(
*
pSource
)[
i
]
);
pSpectrum
->
s
ub
(
pSourceSpectrum
);
pSpectrum
->
S
ub
(
pSourceSpectrum
);
}
return
;
...
...
@@ -146,7 +146,7 @@ void ITAHDFTSpectra::mul( const ITAHDFTSpectra* pSource )
{
ITAHDFTSpectrum
*
pSpectrum
(
m_vpSpectra
[
i
]
);
const
ITAHDFTSpectrum
*
pSourceSpectrum
(
(
*
pSource
)[
i
]
);
pSpectrum
->
m
ul
(
pSourceSpectrum
);
pSpectrum
->
M
ul
(
pSourceSpectrum
);
}
return
;
...
...
@@ -161,7 +161,7 @@ void ITAHDFTSpectra::mul_conj( const ITAHDFTSpectra* pSource )
{
ITAHDFTSpectrum
*
pSpectrum
(
m_vpSpectra
[
i
]
);
const
ITAHDFTSpectrum
*
pSourceSpectrum
(
(
*
pSource
)[
i
]
);
pSpectrum
->
m
ul
(
pSourceSpectrum
);
pSpectrum
->
M
ul
(
pSourceSpectrum
);
}
return
;
...
...
@@ -181,7 +181,7 @@ void ITAHDFTSpectra::div( const ITAHDFTSpectra* pSource )
{
ITAHDFTSpectrum
*
pSpectrum
(
m_vpSpectra
[
i
]
);
const
ITAHDFTSpectrum
*
pSourceSpectrum
(
(
*
pSource
)[
i
]
);
pSpectrum
->
d
iv
(
pSourceSpectrum
);
pSpectrum
->
D
iv
(
pSourceSpectrum
);
}
return
;
...
...
src/ITAHDFTSpectrum.cpp
View file @
c043adea
...
...
@@ -35,7 +35,7 @@ ITAHDFTSpectrum::ITAHDFTSpectrum( const ITAHDFTSpectrum* pSource )
{
Init
(
pSource
->
GetDFTSize
()
);
SetSampleRate
(
pSource
->
GetSampleRate
()
);
c
opyFrom
(
*
pSource
);
C
opyFrom
(
*
pSource
);
}
ITAHDFTSpectrum
::
ITAHDFTSpectrum
(
const
ITAHDFTSpectrum
&
oSource
)
...
...
@@ -46,7 +46,7 @@ ITAHDFTSpectrum::ITAHDFTSpectrum( const ITAHDFTSpectrum& oSource )
{
Init
(
oSource
.
GetDFTSize
()
);
SetSampleRate
(
oSource
.
GetSampleRate
()
);
c
opyFrom
(
oSource
);
C
opyFrom
(
oSource
);
}
ITAHDFTSpectrum
::~
ITAHDFTSpectrum
()
...
...
@@ -126,22 +126,26 @@ void ITAHDFTSpectrum::SetZero()
return
;
}
void
ITAHDFTSpectrum
::
add
(
float
fReal
,
float
fImag
)
{
void
ITAHDFTSpectrum
::
Add
(
const
float
fReal
,
const
float
fImag
)
{
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
+=
2
)
{
m_vfData
[
i
]
+=
fReal
;
m_vfData
[
i
+
1
]
+=
fImag
;
}
}
void
ITAHDFTSpectrum
::
setCoeffRI
(
int
iIndex
,
float
fReal
,
float
fImag
)
{
setCoeffsRI
(
iIndex
,
1
,
fReal
,
fImag
);
void
ITAHDFTSpectrum
::
SetCoeffRI
(
const
int
iIndex
,
const
float
fReal
,
const
float
fImag
)
{
SetCoeffsRI
(
iIndex
,
1
,
fReal
,
fImag
);
}
void
ITAHDFTSpectrum
::
setCoeffsRI
(
float
fReal
,
float
fImag
)
{
setCoeffsRI
(
0
,
m_iSize
,
fReal
,
fImag
);
void
ITAHDFTSpectrum
::
SetCoeffsRI
(
const
float
fReal
,
const
float
fImag
)
{
SetCoeffsRI
(
0
,
m_iSize
,
fReal
,
fImag
);
}
void
ITAHDFTSpectrum
::
setCoeffsRI
(
int
iOffset
,
int
iCount
,
float
fReal
,
float
fImag
)
{
void
ITAHDFTSpectrum
::
SetCoeffsRI
(
const
int
iOffset
,
const
int
iCount
,
const
float
fReal
,
const
float
fImag
)
{
if
(
(
iOffset
<
0
)
||
(
iOffset
>=
m_iSize
)
||
(
iCount
<
0
)
||
(
iOffset
+
iCount
>
m_iSize
)
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Index/count out of bounds"
);
...
...
@@ -151,30 +155,36 @@ void ITAHDFTSpectrum::setCoeffsRI( int iOffset, int iCount, float fReal, float f
}
}
void
ITAHDFTSpectrum
::
setCoeffMP
(
int
iIndex
,
float
fMagnitude
,
float
fPhase
)
{
setCoeffsMP
(
iIndex
,
1
,
fMagnitude
,
fPhase
);
void
ITAHDFTSpectrum
::
SetCoeffMP
(
const
int
iIndex
,
const
float
fMagnitude
,
const
float
fPhase
)
{
SetCoeffsMP
(
iIndex
,
1
,
fMagnitude
,
fPhase
);
}
void
ITAHDFTSpectrum
::
setCoeffsMP
(
float
fMagnitude
,
float
fPhase
)
{
setCoeffsMP
(
0
,
m_iSize
,
fMagnitude
,
fPhase
);
void
ITAHDFTSpectrum
::
SetCoeffsMP
(
const
float
fMagnitude
,
const
float
fPhase
)
{
SetCoeffsMP
(
0
,
m_iSize
,
fMagnitude
,
fPhase
);
}
void
ITAHDFTSpectrum
::
setCoeffsMP
(
int
iOffset
,
int
iCount
,
float
fMagnitude
,
float
fPhase
)
{
void
ITAHDFTSpectrum
::
SetCoeffsMP
(
const
int
iOffset
,
const
int
iCount
,
const
float
fMagnitude
,
const
float
fPhase
)
{
if
(
(
iOffset
<
0
)
||
(
iOffset
>=
m_iSize
)
||
(
iCount
<
0
)
||
(
iOffset
+
iCount
>
m_iSize
)
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Index/count out of bounds"
);
s
etCoeffsRI
(
fMagnitude
*
cos
(
fPhase
),
fMagnitude
*
sin
(
fPhase
)
);
S
etCoeffsRI
(
fMagnitude
*
cos
(
fPhase
),
fMagnitude
*
sin
(
fPhase
)
);
}
void
ITAHDFTSpectrum
::
setMagnitudePreservePhase
(
int
iIndex
,
float
fMagnitude
)
{
setMagnitudesPreservePhases
(
iIndex
,
1
,
fMagnitude
);
void
ITAHDFTSpectrum
::
SetMagnitudePreservePhase
(
const
int
iIndex
,
const
float
fMagnitude
)
{
SetMagnitudesPreservePhases
(
iIndex
,
1
,
fMagnitude
);
}
void
ITAHDFTSpectrum
::
setMagnitudesPreservePhases
(
float
fMagnitude
)
{
setMagnitudesPreservePhases
(
0
,
m_iSize
,
fMagnitude
);
void
ITAHDFTSpectrum
::
SetMagnitudesPreservePhases
(
const
float
fMagnitude
)
{
SetMagnitudesPreservePhases
(
0
,
m_iSize
,
fMagnitude
);
}
void
ITAHDFTSpectrum
::
setMagnitudesPreservePhases
(
int
iOffset
,
int
iCount
,
float
fMagnitude
)
{
void
ITAHDFTSpectrum
::
SetMagnitudesPreservePhases
(
const
int
iOffset
,
const
int
iCount
,
const
float
fMagnitude
)
{
if
(
(
iOffset
<
0
)
||
(
iOffset
>=
m_iSize
)
||
(
iCount
<
0
)
||
(
iOffset
+
iCount
>
m_iSize
)
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Index/count out of bounds"
);
...
...
@@ -182,15 +192,18 @@ void ITAHDFTSpectrum::setMagnitudesPreservePhases( int iOffset, int iCount, floa
csabsparg
(
m_vfData
[
2
*
i
],
m_vfData
[
2
*
i
+
1
],
fMagnitude
,
m_vfData
[
2
*
i
],
m_vfData
[
2
*
i
+
1
]
);
}
void
ITAHDFTSpectrum
::
setPhasePreserveMagnitude
(
int
iIndex
,
float
fPhase
)
{
setPhasesPreserveMagnitudes
(
iIndex
,
1
,
fPhase
);
void
ITAHDFTSpectrum
::
SetPhasePreserveMagnitude
(
const
int
iIndex
,
const
float
fPhase
)
{
SetPhasesPreserveMagnitudes
(
iIndex
,
1
,
fPhase
);
}
void
ITAHDFTSpectrum
::
setPhasesPreserveMagnitudes
(
float
fPhase
)
{
setPhasesPreserveMagnitudes
(
0
,
m_iSize
,
fPhase
);
void
ITAHDFTSpectrum
::
SetPhasesPreserveMagnitudes
(
const
float
fPhase
)
{
SetPhasesPreserveMagnitudes
(
0
,
m_iSize
,
fPhase
);
}
void
ITAHDFTSpectrum
::
setPhasesPreserveMagnitudes
(
int
iOffset
,
int
iCount
,
float
fPhase
)
{
void
ITAHDFTSpectrum
::
SetPhasesPreserveMagnitudes
(
const
int
iOffset
,
const
int
iCount
,
const
float
fPhase
)
{
if
(
(
iOffset
<
0
)
||
(
iOffset
>=
m_iSize
)
||
(
iCount
<
0
)
||
(
iOffset
+
iCount
>
m_iSize
)
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Index/count out of bounds"
);
...
...
@@ -198,21 +211,24 @@ void ITAHDFTSpectrum::setPhasesPreserveMagnitudes( int iOffset, int iCount, floa
csargpabs
(
m_vfData
[
2
*
i
],
m_vfData
[
2
*
i
+
1
],
fPhase
,
m_vfData
[
2
*
i
],
m_vfData
[
2
*
i
+
1
]
);
}
void
ITAHDFTSpectrum
::
sub
(
float
fReal
,
float
fImag
)
{
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
+=
2
)
{
void
ITAHDFTSpectrum
::
Sub
(
const
float
fReal
,
const
float
fImag
)
{
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
+=
2
)
{
m_vfData
[
i
]
-=
fReal
;
m_vfData
[
i
+
1
]
-=
fImag
;
}
}
void
ITAHDFTSpectrum
::
add
(
const
ITAHDFTSpectrum
&
s
)
{
void
ITAHDFTSpectrum
::
Add
(
const
ITAHDFTSpectrum
&
s
)
{
if
(
s
.
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
fm_add
(
GetData
(),
s
.
GetData
(),
2
*
m_iSize
);
}
void
ITAHDFTSpectrum
::
a
dd
(
const
ITAHDFTSpectrum
*
pSource
)
void
ITAHDFTSpectrum
::
A
dd
(
const
ITAHDFTSpectrum
*
pSource
)
{
if
(
pSource
->
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Source spectrum must be of same size"
);
...
...
@@ -222,14 +238,15 @@ void ITAHDFTSpectrum::add( const ITAHDFTSpectrum* pSource )
return
;
}
void
ITAHDFTSpectrum
::
sub
(
const
ITAHDFTSpectrum
&
s
)
{
void
ITAHDFTSpectrum
::
Sub
(
const
ITAHDFTSpectrum
&
s
)
{
if
(
s
.
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
fm_sub
(
GetData
(),
s
.
GetData
(),
2
*
m_iSize
);
}
void
ITAHDFTSpectrum
::
s
ub
(
const
ITAHDFTSpectrum
*
pSource
)
void
ITAHDFTSpectrum
::
S
ub
(
const
ITAHDFTSpectrum
*
pSource
)
{
if
(
pSource
->
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Source spectrum must be of same size"
);
...
...
@@ -239,7 +256,7 @@ void ITAHDFTSpectrum::sub( const ITAHDFTSpectrum* pSource )
return
;
}
void
ITAHDFTSpectrum
::
m
ul
(
const
ITAHDFTSpectrum
&
s
)
void
ITAHDFTSpectrum
::
M
ul
(
const
ITAHDFTSpectrum
&
s
)
{
if
(
s
.
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
...
...
@@ -249,7 +266,7 @@ void ITAHDFTSpectrum::mul( const ITAHDFTSpectrum& s )
return
;
}
void
ITAHDFTSpectrum
::
m
ul
(
const
ITAHDFTSpectrum
*
pSource
)
void
ITAHDFTSpectrum
::
M
ul
(
const
ITAHDFTSpectrum
*
pSource
)
{
if
(
pSource
->
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
...
...
@@ -277,7 +294,7 @@ void ITAHDFTSpectrum::mul( const ITAHDFTSpectrum* pSource )
return
;
}
void
ITAHDFTSpectrum
::
mul_c
onj
(
const
ITAHDFTSpectrum
*
pSource
)
void
ITAHDFTSpectrum
::
MulC
onj
(
const
ITAHDFTSpectrum
*
pSource
)
{
if
(
pSource
->
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Source spectrum must be of same size"
);
...
...
@@ -305,13 +322,13 @@ void ITAHDFTSpectrum::mul_conj( const ITAHDFTSpectrum* pSource )
return
;
}
void
ITAHDFTSpectrum
::
m
ul
(
const
float
fFactor
)
void
ITAHDFTSpectrum
::
M
ul
(
const
float
fFactor
)
{
fm_mul
(
GetData
(),
fFactor
,
m_iSize
*
2
);
return
;
}
void
ITAHDFTSpectrum
::
d
iv
(
const
ITAHDFTSpectrum
&
s
)
void
ITAHDFTSpectrum
::
D
iv
(
const
ITAHDFTSpectrum
&
s
)
{
if
(
s
.
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
...
...
@@ -321,7 +338,7 @@ void ITAHDFTSpectrum::div( const ITAHDFTSpectrum& s )
return
;
}
void
ITAHDFTSpectrum
::
d
iv
(
const
ITAHDFTSpectrum
*
pSource
)
void
ITAHDFTSpectrum
::
D
iv
(
const
ITAHDFTSpectrum
*
pSource
)
{
if
(
pSource
->
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Source spectrum must be of same size"
);
...
...
@@ -331,7 +348,7 @@ void ITAHDFTSpectrum::div( const ITAHDFTSpectrum* pSource )
return
;
}
float
ITAHDFTSpectrum
::
calcMagnitude
(
int
iIndex
)
const
float
ITAHDFTSpectrum
::
CalcMagnitude
(
const
int
iIndex
)
const
{
if
(
iIndex
>=
m_iDFTSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Index out of range"
);
...
...
@@ -339,67 +356,78 @@ float ITAHDFTSpectrum::calcMagnitude( int iIndex ) const
return
cabsf
(
m_vfData
[
2
*
iIndex
],
m_vfData
[
2
*
iIndex
+
1
]
);
}
void
ITAHDFTSpectrum
::
c
alcMagnitudes
(
float
*
pfMagnitudes
)
const
void
ITAHDFTSpectrum
::
C
alcMagnitudes
(
float
*
pfMagnitudes
)
const
{
if
(
pfMagnitudes
)
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
)
pfMagnitudes
[
i
]
=
c
alcMagnitude
(
i
);
pfMagnitudes
[
i
]
=
C
alcMagnitude
(
i
);
}
void
ITAHDFTSpectrum
::
calcPhases
(
float
*
pfPhases
)
{
void
ITAHDFTSpectrum
::
CalcPhases
(
float
*
pfPhases
)
{
if
(
pfPhases
)
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
)
pfPhases
[
i
]
=
canglef
(
m_vfData
[
2
*
i
],
m_vfData
[
2
*
i
+
1
]
);
}
void
ITAHDFTSpectrum
::
log
(
bool
bComplex
)
{
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
){
void
ITAHDFTSpectrum
::
Log
(
const
bool
bComplex
)
{
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
)
{
// TODO: Check for (magnitude < eps, -HUGE_VAL), negative value on real log
if
(
bComplex
)
{
if
(
bComplex
)
{
// z = x+i*y returns log(z) = log(abs(z)) + i*atan2(y,x); cp. http://www.mathworks.de/help/techdoc/ref/log.html
float
x
=
m_vfData
[
2
*
i
];
m_vfData
[
2
*
i
]
=
logf
(
cabsf
(
x
,
m_vfData
[
2
*
i
+
1
]
)
);
m_vfData
[
2
*
i
+
1
]
=
atan2f
(
m_vfData
[
2
*
i
+
1
],
x
);
}
else
{
else
{
m_vfData
[
2
*
i
]
=
logf
(
cabsf
(
m_vfData
[
2
*
i
],
m_vfData
[
2
*
i
+
1
]
)
);
m_vfData
[
2
*
i
+
1
]
=
0.0
f
;
}
}
}
void
ITAHDFTSpectrum
::
exp
(
bool
bComplex
)
{
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
){
void
ITAHDFTSpectrum
::
Exp
(
const
bool
bComplex
)
{
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
){
// TODO: Check for (magnitude > thresh, HUGE_VAL)
if
(
bComplex
)
{
if
(
bComplex
)
{
// z = x+i*y returns e^z = e^x * (cos(y) + i*sin(y)); cp. http://www.mathworks.de/help/techdoc/ref/exp.html
float
expMag
=
std
::
exp
(
m_vfData
[
2
*
i
]
);
m_vfData
[
2
*
i
]
=
expMag
*
cosf
(
m_vfData
[
2
*
i
+
1
]
);
m_vfData
[
2
*
i
+
1
]
=
expMag
*
sinf
(
m_vfData
[
2
*
i
+
1
]
);
}
else
{
else
{
m_vfData
[
2
*
i
]
=
std
::
exp
(
m_vfData
[
2
*
i
]
);
m_vfData
[
2
*
i
+
1
]
=
0.0
f
;
}
}
}
void
ITAHDFTSpectrum
::
n
egate
()
{
void
ITAHDFTSpectrum
::
N
egate
()
{
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
++
)
m_vfData
[
i
]
=
-
m_vfData
[
i
];
}
void
ITAHDFTSpectrum
::
c
onjugate
()
{
void
ITAHDFTSpectrum
::
C
onjugate
()
{
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
)
m_vfData
[
2
*
i
+
1
]
*=
-
1
;
}
float
ITAHDFTSpectrum
::
findMax
()
const
{
float
ITAHDFTSpectrum
::
FindMax
()
const
{
int
iDummy
;
return
f
indMax
(
iDummy
);
return
F
indMax
(
iDummy
);
}
float
ITAHDFTSpectrum
::
findMax
(
int
&
iMaxIndex
)
const
{
float
ITAHDFTSpectrum
::
FindMax
(
int
&
iMaxIndex
)
const
{
int
i
=
0
;
float
x
=
0
;
...
...
@@ -415,14 +443,16 @@ float ITAHDFTSpectrum::findMax( int& iMaxIndex ) const {
return
x
;
}
void
ITAHDFTSpectrum
::
copyFrom
(
const
ITAHDFTSpectrum
&
s
)
{
void
ITAHDFTSpectrum
::
CopyFrom
(
const
ITAHDFTSpectrum
&
s
)
{
if
(
s
.
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
fm_copy
(
GetData
(),
s
.
GetData
(),
m_iSize
*
2
);
}
void
ITAHDFTSpectrum
::
copyFrom
(
const
ITAHDFTSpectrum
&
s
,
int
iOffset
,
int
iCount
)
{
void
ITAHDFTSpectrum
::
CopyFrom
(
const
ITAHDFTSpectrum
&
s
,
const
int
iOffset
,
const
int
iCount
)
{
if
(
s
.
GetSize
()
!=
m_iSize
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Spectra must have the same size"
);
...
...
@@ -431,7 +461,8 @@ void ITAHDFTSpectrum::copyFrom( const ITAHDFTSpectrum& s, int iOffset, int iCoun
m_vfData
[
i
]
=
s
.
GetData
()[
i
];
}
ITAHDFTSpectrum
&
ITAHDFTSpectrum
::
operator
=
(
const
ITAHDFTSpectrum
&
rhs
)
{
ITAHDFTSpectrum
&
ITAHDFTSpectrum
::
operator
=
(
const
ITAHDFTSpectrum
&
rhs
)
{
// Selbstzuweisung abfangen
if
(
&
rhs
==
this
)
return
*
this
;
...
...
@@ -445,17 +476,20 @@ ITAHDFTSpectrum& ITAHDFTSpectrum::operator=( const ITAHDFTSpectrum& rhs ) {
return
*
this
;
}
std
::
string
ITAHDFTSpectrum
::
toString
()
{
std
::
string
s
=
"("
;
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
+=
2
)
{
if
(
i
>
0
)
s
+=
", "
;
std
::
string
ITAHDFTSpectrum
::
ToString
()
{
std
::
string
s
=
IntToString
(
m_iSize
)
+
" complex coefficients; spectrum = ("
;
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
+=
2
)
{
if
(
i
>
0
)
s
+=
", "
;
s
+=
FloatToString
(
m_vfData
[
i
],
3
)
+
(
m_vfData
[
i
+
1
]
>=
0
?
"+"
:
""
)
+
FloatToString
(
m_vfData
[
i
+
1
],
3
)
+
"i"
;
}
s
+=
")"
;
return
s
;
}
float
ITAHDFTSpectrum
::
g
etEnergy
()
const
float
ITAHDFTSpectrum
::
G
etEnergy
()
const
{
float
energy
=
0
;
for
(
int
i
=
0
;
i
<
m_iSize
;
i
++
)
{
...
...
@@ -465,7 +499,7 @@ float ITAHDFTSpectrum::getEnergy() const
return
energy
/
(
(
float
)
m_iSize
);
}
void
ITAHDFTSpectrum
::
c
opy
(
const
ITAHDFTSpectrum
*
pSource
)
void
ITAHDFTSpectrum
::
C
opy
(
const
ITAHDFTSpectrum
*
pSource
)
{
// TODO: FastMath? Jetzt gibt es Probleme mit SIMD-Alignment?
for
(
int
i
=
0
;
i
<
2
*
m_iSize
;
i
++
)
...
...
@@ -474,5 +508,5 @@ void ITAHDFTSpectrum::copy( const ITAHDFTSpectrum* pSource )
void
ITAHDFTSpectrum
::
SetCoeff
(
const
int
iIndex
,
std
::
complex
<
float
>&
cfCoeff
)
{
s
etCoeffRI
(
iIndex
,
cfCoeff
.
real
(),
cfCoeff
.
imag
()
);
S
etCoeffRI
(
iIndex
,
cfCoeff
.
real
(),
cfCoeff
.
imag
()
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment