Aufgrund eines Security Updates wird GitLab heute zwischen 14:30 und 15:00 Uhr kurzzeitig nicht zur Verfügung stehen. / Due to a security update GitLab will be temporarily unavailable between 2:30 and 3 today.

Commit 191f6370 authored by Jonas Stienen's avatar Jonas Stienen

Initial project checkin

parents
cmake_minimum_required( VERSION 2.8 )
project( ITACTC )
list( APPEND CMAKE_MODULE_PATH "$ENV{VISTA_CMAKE_COMMON}" )
include( VistaCommon )
# dependencies
vista_use_package( ITABase REQUIRED FIND_DEPENDENCIES )
vista_use_package( ITAFFT REQUIRED FIND_DEPENDENCIES )
vista_use_package( ITADataSources REQUIRED FIND_DEPENDENCIES )
vista_use_package( ITAConvolution REQUIRED FIND_DEPENDENCIES )
vista_use_package( OpenDAFF REQUIRED )
if( NOT DEFINED ITA_CTC_WITH_DUAL_CTC )
set( ITA_CTC_WITH_DUAL_CTC OFF CACHE BOOL "Build support for Crosstalk-Cancellation with arbitrary loudspeaker number and pose" )
endif( NOT DEFINED ITA_CTC_WITH_DUAL_CTC )
if( NOT DEFINED ITA_CTC_WITH_N_CTC )
set( ITA_CTC_WITH_N_CTC ON CACHE BOOL "Build support for two-loudspeaker Crosstalk-Cancellation (deprecated)" )
endif( NOT DEFINED ITA_CTC_WITH_N_CTC )
if( NOT DEFINED ITA_CTC_WITH_QUAD_CTC )
set( ITA_CTC_WITH_QUAD_CTC OFF CACHE BOOL "Build support for quad-loudspeaker Crosstalk-Cancellation (deprecated)" )
endif( NOT DEFINED ITA_CTC_WITH_QUAD_CTC )
# includes
include_directories( "include" )
# sources
set( ITACTCHeader
"include/ITACTCDefinitions.h"
"include/ITACTCUtils.h"
"include/ITAHDFTSpectra.h"
)
set( ITACTCSources
"src/ITACTCUtils.cpp"
"src/ITAHDFTSpectra.cpp"
)
if( ITA_CTC_WITH_DUAL_CTC )
set( ITACTCHeader "${ITACTCHeader}" "include/ITADualCTC.h" "include/ITADualCTCStreamFilter.h" )
set( ITACTCSources "${ITACTCSources}" "src/ITADualCTC.cpp" "src/ITADualCTCStreamFilter.cpp" )
endif( ITA_CTC_WITH_DUAL_CTC )
if( ITA_CTC_WITH_N_CTC )
set( ITACTCHeader "${ITACTCHeader}" "include/ITANCTC.h" "include/ITANCTCStreamFilter.h" )
set( ITACTCSources "${ITACTCSources}" "src/ITANCTC.cpp" "src/ITANCTCStreamFilter.cpp" )
endif( ITA_CTC_WITH_N_CTC )
if( ITA_CTC_WITH_QUAD_CTC )
set( ITACTCHeader "${ITACTCHeader}" "include/ITAQuadCTC.h" "include/ITAQuadCTCStreamFilter.h" )
set( ITACTCSources "${ITACTCSources}" "src/ITAQuadCTC.cpp" "src/ITAQuadCTCStreamFilter.cpp" )
endif( ITA_CTC_WITH_QUAD_CTC )
# compiler
add_definitions( -DITA_BASE_DLL -DITA_FFT_DLL -DITA_CONVOLUTION_DLL -DITA_CTC_DLL -DITA_CTC_EXPORT )
# linker
add_library( ITACTC SHARED ${ITACTCHeader} ${ITACTCSources} )
target_link_libraries( ITACTC ${VISTA_USE_PACKAGE_LIBRARIES} )
# configure
vista_configure_lib( ITACTC )
vista_install( ITACTC )
set( ITACTC_INCLUDE_OUTDIR "${CMAKE_CURRENT_SOURCE_DIR}/include" )
vista_create_cmake_configs( ITACTC )
vista_create_default_info_file( ITACTC )
set_property( TARGET ITACTC PROPERTY FOLDER "ITACoreLibs" )
# tests
set( ITACTC_COMMON_BUILD TRUE )
add_subdirectory( "${CMAKE_CURRENT_SOURCE_DIR}/tests" )
#
# ITAQuadCTC Beispiel-Konfigurationsdatei
# Autor: Frank Wefers
#
[Global]
# Schallgeschwindigkeit [m/s]
c = 344
# Beta-Wert für die Regularisierung (Standard: 0.1)
beta = 0.1
# Überblendfunktion für Sektoren (0=kein Fading, 90&180; 1=lin. Fading, 90&180; 2=sin. Fading, 90&180; 3=nur 90; 4=nur 180; 5=lin. Fading 180&180)
fading = 5
# Arbeitsbereich (Achsenbeschränkungen) [optional]
XRange = -1.797, +1.797
YRange = -3.00, +3.00
ZRange = 0, +2.50
# Minimal/maximal erlaubte Entfernung zwischen einem beliebigen Lautsprecher und dem Hörer [m]
L2SDistMin = 0.8
L2SDistMax = 3.0
[Listener]
# Vesatz zwischen Kopf-Bezugspunkt und Ohreingang linkes/rechtes Ohr [m]
# (Anmerkungen: Angaben beziehen sich auf den Kopf der geradeaus in negative Z-Richtung schaut)
LOffset = -0.08, -0.00, +0.00
ROffset = +0.08, -0.00, +0.00
[Sectors]
# Sektor-Grenzen für die zwei Betriebskonfigurationen.
# Konfiguration C90 = 90°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 45°)
# Konfiguration C180 = 180°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 90°)
# Die Winkelhalbierende stellt jeweils den Bezugswinkel für die folgenden Angaben dar.
#
# Der Arbeitsbereich (work) gibt die Winkelspanne (+/-) um den Bezugswinkel (Winkelhalbierende) an, in dem
# die Konfiguration mit stabilen Filters betrieben werden kann. Der Kern (core) ist der Winkelbereich, wo
# diese Konfiguration exklusiv genutzt wird. Außerhalb des Kernes wird zwischen den beiden Konfigurationen
# übergeblendet. (Wichtig: Die Kerne beider Modi dürfen nicht überlappen und sollten Raum zur Überblendung lassen)
Sector12Span = 20-120
Sector12Core = 30-92.4
Sector23Span = 20-20
Sector23Core = 20-20
Sector34Span = 20-20
Sector34Core = 20-20
Sector41Span = 20-20
Sector41Core = 20-20
Sector13Span = 20-20
Sector13Core = 20-20
Sector24Span = 20-20
Sector24Core = 20-20
Sector31Span = 20-20
Sector31Core = 20-43
Sector42Span = 20-344
Sector42Core = 20-19390
#
# Lautsprecher-Konfiguration für das VR-Labor im ITA
# Stand: 2011-06-15
# Author: Frank Wefers. Jonas Stienen
#
[Speaker1]
# Position (X,Y,Z) [m] im realen Koordinatensystem
Position = -1.527, 0.854, -1.527
Direction = -135.0, 20.0, 0.0
# Ausgabekanal auf der Audio-Hardware (1, 2, ..., N)
Channel = 1
[Speaker2]
Position = +1.527, 0.854, -1.527
Direction = +135.0, 20.0, 0.0
Channel = 2
[Speaker3]
Position = +1.527, 0.854, +1.527
Direction = +45.0, 20.0, 0.0
Channel = 3
[Speaker4]
Position = -1.527, 0.854, +1.527
Direction = -45.0, 20.0, 0.0
Channel = 4
[Speaker5]
Position = -1.527, 2.546, -1.527
Direction = -135.0, -20.0, 0.0
Channel = 5
[Speaker6]
Position = +1.527, 2.546, -1.527
Direction = +135.0, -20.0, 0.0
Channel = 6
[Speaker7]
Position = +1.527, 2.546, +1.527
Direction = +45.0, -20.0, 0.0
Channel = 7
[Speaker8]
Position = -1.527, 2.546, +1.527
Direction = -45.0, -20.0, 0.0
Channel = 8
#
# ITANCTC example configuration
# Authors: Jonas Stienen <stienen@akustik.rwth-aachen.de>
# Johannes Fundalewicz <johannes.fundalewicz@rwth-aachen.de>
#
#
[NCTC]
# Indices of configured loud speakers. Selected speaker order corresponds
# to input and output channels (HRIR and speaker setup)
SpeakerSelection = 1,2,3,4,5,6,7,8
# Use direct input file instead of input datasource (for testing)
DirectInput = 0
DirectInputFile = "ctc_direct_in.wav"
#Speed of sound
SpeedOfSound = 344
# Algorithm
# Regularized, WienerRegularized, WienerRegMinPhase
CTCAlgorithm = Regularized
# Beta for regularization [0 ... 1]
Beta = 0.001
# Forced delay to ensure causality [Samples]
Delay = 484
# Smoothing
Smoothing = false
# Smoothing type (Balasz, Gammatone, Lifter, Regular)
SmoothingType = Balasz
#####################################################################
#
# Speaker setup: position, direction
#
# Position (X,Y,Z) [m] in world coordinates
# Direction (yaw, pitch, roll) [] in world coordinates
[Speaker1]
Position = -1.527, 0.854, -1.527
Direction = -135.0, 20.0, 0.0
[Speaker2]
Position = +1.527, 0.854, -1.527
Direction = +135.0, 20.0, 0.0
[Speaker3]
Position = +1.527, 0.854, +1.527
Direction = +45.0, 20.0, 0.0
[Speaker4]
Position = -1.527, 0.854, +1.527
Direction = -45.0, 20.0, 0.0
[Speaker5]
Position = -1.527, 2.546, -1.527
Direction = -135.0, -20.0, 0.0
[Speaker6]
Position = +1.527, 2.546, -1.527
Direction = +135.0, -20.0, 0.0
[Speaker7]
Position = +1.527, 2.546, +1.527
Direction = +45.0, -20.0, 0.0
[Speaker8]
Position = -1.527, 2.546, +1.527
Direction = -45.0, -20.0, 0.0
#
# ITAQuadCTC Beispiel-Konfigurationsdatei
# Autor: Frank Wefers
#
[Global]
# Schallgeschwindigkeit [m/s]
c = 344
# Beta-Wert für die Regularisierung (Standard: 0.1)
beta = 0.1
# Überblendfunktion für Sektoren (0=kein Fading, 90&180; 1=lin. Fading, 90&180; 2=sin. Fading, 90&180; 3=nur 90; 4=nur 180; 5=lin. Fading 180&180)
fading = 5
# Arbeitsbereich (Achsenbeschränkungen) [optional]
XRange = -1.797, +1.797
YRange = 0, +2.40
ZRange = -1.352, +1.352
# Minimal/maximal erlaubte Entfernung zwischen einem beliebigen Lautsprecher und dem Hörer [m]
L2SDistMin = 0.8
L2SDistMax = 4.00
# Use direct input file instead of input datasource (for testing)
DirectInput = false
DirectInputFile = "direct_in.wav"
[Listener]
# Vesatz zwischen Kopf-Bezugspunkt und Ohreingang linkes/rechtes Ohr [m]
# (Anmerkungen: Angaben beziehen sich auf den Kopf der geradeaus in negative Z-Richtung schaut)
LOffset = -0.08, -0.00, +0.00
ROffset = +0.08, -0.00, +0.00
[Sectors]
# Sektor-Grenzen für die zwei Betriebskonfigurationen.
# Konfiguration C90 = 90°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 45°)
# Konfiguration C180 = 180°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 90°)
# Die Winkelhalbierende stellt jeweils den Bezugswinkel für die folgenden Angaben dar.
#
# Der Arbeitsbereich (work) gibt die Winkelspanne (+/-) um den Bezugswinkel (Winkelhalbierende) an, in dem
# die Konfiguration mit stabilen Filters betrieben werden kann. Der Kern (core) ist der Winkelbereich, wo
# diese Konfiguration exklusiv genutzt wird. Außerhalb des Kernes wird zwischen den beiden Konfigurationen
# übergeblendet. (Wichtig: Die Kerne beider Modi dürfen nicht überlappen und sollten Raum zur Überblendung lassen)
Sector12Span = 20-120
Sector12Core = 30-92.4
Sector23Span = 20-20
Sector23Core = 20-20
Sector34Span = 20-20
Sector34Core = 20-20
Sector41Span = 20-20
Sector41Core = 20-20
Sector13Span = 20-20
Sector13Core = 20-20
Sector24Span = 20-20
Sector24Core = 20-20
Sector31Span = 20-20
Sector31Core = 20-43
Sector42Span = 20-344
Sector42Core = 20-19390
#
# Lautsprecher-Konfiguration für die alte CAVE im ReZe
# Stand: 2012-06-23
# Author: Frank Wefers
#
[Speaker1]
# Position (X,Y,Z) [m] im realen Koordinatensystem
Position = -1.797, 3.00, 0
Direction = -90.0, 20.0, 0.0
# Ausgabekanal auf der Audio-Hardware (1, 2, ..., N)
Channel = 1
[Speaker2]
Position = 0, 3.02, -1.352
Direction = +180, 20.0, 0.0
Channel = 2
[Speaker3]
Position = +1.797, 3.00, 0
Direction = +90.0, 20.0, 0.0
Channel = 3
[Speaker4]
Position = 0, 2.85, 1.352
Direction = 0, 20.0, 0.0
Channel = 4
#
# ITAQuadCTC Beispiel-Konfigurationsdatei
# Autor: Frank Wefers
#
[Global]
# Schallgeschwindigkeit [m/s]
c = 344
# Beta-Wert für die Regularisierung (Standard: 0.1)
beta = 0.1
# Überblendfunktion für Sektoren (0=kein Fading, 90&180; 1=lin. Fading, 90&180; 2=sin. Fading, 90&180; 3=nur 90; 4=nur 180; 5=lin. Fading 180&180)
fading = 5
# Arbeitsbereich (Achsenbeschränkungen) [optional]
XRange = -1.797, +1.797
YRange = -3.00, +3.00
ZRange = 0, +2.50
# Minimal/maximal erlaubte Entfernung zwischen einem beliebigen Lautsprecher und dem Hörer [m]
L2SDistMin = 0.8
L2SDistMax = 3.0
# Use direct input file instead of input datasource (for testing)
DirectInput = false
DirectInputFile = "direct_in.wav"
[Listener]
# Vesatz zwischen Kopf-Bezugspunkt und Ohreingang linkes/rechtes Ohr [m]
# (Anmerkungen: Angaben beziehen sich auf den Kopf der geradeaus in negative Z-Richtung schaut)
LOffset = -0.08, -0.00, +0.00
ROffset = +0.08, -0.00, +0.00
[Sectors]
# Sektor-Grenzen für die zwei Betriebskonfigurationen.
# Konfiguration C90 = 90°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 45°)
# Konfiguration C180 = 180°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 90°)
# Die Winkelhalbierende stellt jeweils den Bezugswinkel für die folgenden Angaben dar.
#
# Der Arbeitsbereich (work) gibt die Winkelspanne (+/-) um den Bezugswinkel (Winkelhalbierende) an, in dem
# die Konfiguration mit stabilen Filters betrieben werden kann. Der Kern (core) ist der Winkelbereich, wo
# diese Konfiguration exklusiv genutzt wird. Außerhalb des Kernes wird zwischen den beiden Konfigurationen
# übergeblendet. (Wichtig: Die Kerne beider Modi dürfen nicht überlappen und sollten Raum zur Überblendung lassen)
Sector12Span = 20-120
Sector12Core = 30-92.4
Sector23Span = 20-20
Sector23Core = 20-20
Sector34Span = 20-20
Sector34Core = 20-20
Sector41Span = 20-20
Sector41Core = 20-20
Sector13Span = 20-20
Sector13Core = 20-20
Sector24Span = 20-20
Sector24Core = 20-20
Sector31Span = 20-20
Sector31Core = 20-43
Sector42Span = 20-344
Sector42Core = 20-19390
#
# Lautsprecher-Konfiguration für das VR-Labor im ITA
# Stand: 2011-06-15
# Author: Frank Wefers. Jonas Stienen
#
[Speaker1]
# Position (X,Y,Z) [m] im realen Koordinatensystem
Position = -1.527, 0.854, -1.527
Direction = -135.0, 20.0, 0.0
# Ausgabekanal auf der Audio-Hardware (1, 2, ..., N)
Channel = 1
[Speaker2]
Position = +1.527, 0.854, -1.527
Direction = +135.0, 20.0, 0.0
Channel = 2
[Speaker3]
Position = +1.527, 0.854, +1.527
Direction = +45.0, 20.0, 0.0
Channel = 3
[Speaker4]
Position = -1.527, 0.854, +1.527
Direction = -45.0, 20.0, 0.0
Channel = 4
[Speaker5]
Position = -1.527, 2.546, -1.527
Direction = -135.0, -20.0, 0.0
Channel = 5
[Speaker6]
Position = +1.527, 2.546, -1.527
Direction = +135.0, -20.0, 0.0
Channel = 6
[Speaker7]
Position = +1.527, 2.546, +1.527
Direction = +45.0, -20.0, 0.0
Channel = 7
[Speaker8]
Position = -1.527, 2.546, +1.527
Direction = -45.0, -20.0, 0.0
Channel = 8
// $Id: AngularRange.h,v 1.1 2008-09-10 22:38:11 fwefers Exp $
#ifndef __ANGULAR_RANGE_H__
#define __ANGULAR_RANGE_H__
#include <string>
/**
* Diese Klasse bildet Winkelbereiche ab und stellt Methoden zur Arbeit mit diesen bereit.
* Der Winkelbereich ist [Startwinkel, Endwinkel] markiert durch einen Start- und Endwinkel,
* d.h. es werden ausschließlich geschlossene Intervalle unterstützt. Wird ein Intervall
* mit gleichem Start- und Endwinkel spezifiziert, so wird dies als vollständiges Intervall
* [0°, 360°) interpretiert. Als Konsequenz kann die Klasse keine leeren Intervalle darstellen.
* Der Standardkonstruktor erzeugt immer ein vollständiges Intervall.
*
* Wichtig: Alle Winkelangaben sind in Grad (nicht Bogengrad)
*/
class AngularRange {
public:
//! Standardkonstruktor
AngularRange();
//! Initialisierungskonstruktor (geschlossenes Winkelintervall)
AngularRange(float fLower, float fUpper);
//! Unteren Bereichswinkel zurückgeben
float getLowerAngle() const;
//! Oberen Bereichswinkel zurückgeben
float getUpperAngle() const;
//! Unteren Bereichswinkel setzen
void setLowerAngle(float fLower);
//! Unteren Bereichswinkel setzen
void setUpperAngle(float fUpper);
//! Winkelbereich setzen (geschlossenes Winkelintervall)
void setRange(float fLower, float fUpper);
//! Zurückgeben ob ein Winkel im Intervall liegt
bool contains(float fAngle) const;
//! Zurückgeben ob das Intervall ein anderes Intervall schneidet
bool intersects(const AngularRange& dest) const;
//! Zurückgeben ob das Intervall den vollständigen Bereich [0°, 360°) abdeckt
bool complete() const;
//! Repräsentation als Zeichenkette zurückgeben
std::string toString() const;
protected:
float m_fLower, m_fUpper;
};
#endif // __ANGULAR_RANGE_H__
\ No newline at end of file
/*
* ----------------------------------------------------------------
*
* ITA core libs
* (c) Copyright Institute of Technical Acoustics (ITA)
* RWTH Aachen University, Germany, 2015-2016
*
* ----------------------------------------------------------------
* ____ __________ _______
* // / //__ ___/ // _ |
* // / // / // /_| |
* // / // / // ___ |
* //__/ //__/ //__/ |__|
*
* ----------------------------------------------------------------
*
*/
// $Id: ITACTCDefinitions.h 2900 2012-09-17 08:42:42Z stienen $
#ifndef INCLUDE_WATCHER_ITA_CTC_DEFINITIONS
#define INCLUDE_WATCHER_ITA_CTC_DEFINITIONS
#ifdef ITA_CTC_DLL
#ifdef ITA_CTC_EXPORT
#define ITA_CTC_API __declspec(dllexport)
#else
#define ITA_CTC_API __declspec(dllimport)
#endif
#else
#define ITA_CTC_API
#endif
#endif // INCLUDE_WATCHER_ITA_CTC_DEFINITIONS
/*
* ----------------------------------------------------------------
*
* ITA core libs
* (c) Copyright Institute of Technical Acoustics (ITA)
* RWTH Aachen University, Germany, 2015-2016
*
* ----------------------------------------------------------------
* ____ __________ _______
* // / //__ ___/ // _ |
* // / // / // /_| |
* // / // / // ___ |
* //__/ //__/ //__/ |__|
*
* ----------------------------------------------------------------
*
*/
// $Id: ITACTCHelper.h 2395 2012-04-20 06:58:52Z stienen $
#ifndef INCLUDE_WATCHER_ITA_CTC_UTILS
#define INCLUDE_WATCHER_ITA_CTC_UTILS
#include <ITACTCDefinitions.h>
class ITAHDFTSpectrum;
#include <string>
// Helper
ITA_CTC_API void Export( const ITAHDFTSpectrum* pSpectrum, const std::string& sFilePath );
#endif // INCLUDE_WATCHER_ITA_CTC_UTILS
// $Id: ITADualCTC.h,v 1.10 2008-12-02 22:31:36 fwefers Exp $
#ifndef __ITA_DUALCTC_H__
#define __ITA_DUALCTC_H__
// STL Includes
#include <string>
#include <vector>
// ITA Includes
#include <ITAFFT.h>
#include <ITAHDFTSpectrum.h>
#include <ITAStopwatch.h>
#include <RG_LocalCS.h>
#include <VistaInterProcComm/Concurrency/VistaMutex.h>
#include <VistaInterProcComm/Concurrency/VistaThreadEvent.h>
#include <VistaInterProcComm/Concurrency/VistaThreadLoop.h>
#include <AngularRange.h>
// Vorwrtsdeklarationen
class ITADatasource;
class ITADualCTCStreamfilter;
class DAFFContentIR;
class DAFFContentDFT;
class DAFFReader;
class ITADualCTC : public VistaThreadLoop {
public:
ITADualCTC(double dSamplerate,
int iBlocklength,
const std::string& sConfigurationFile,
DAFFContentIR* pHRIR=NULL);
~ITADualCTC();
// Eingangsaudiodatenquelle setzen
// (Hinweis: Muss genau zwei Kanle haben)
void setInputDatasource(ITADatasource* pdsInput);
// Ausgabeaudiodatenquelle zurckgeben
ITADatasource* getOutputDatasource() const;
// Liefert die Lautsprecher-Kanle der Audio-Hardware zurck,
// auf welchen die CTC ausgegeben werden soll.
// Diese Information stammt aus der CTC-Konfigurationsdatei.
void getPhysicalOutputChannels(std::vector<int>& viChannels) const;
// Positionen und Orientierungen der Lautsprecher abfragen
void getLoudspeakerPositionOrientation(int iSpeaker, RG_Vector& vPos, RG_Vector& vView, RG_Vector& vUp) const;
// Zustand der Lautsprecher zurckgeben
void getLoudspeakerStates(std::vector<int>& viStates);
// -= Abstrakte Methoden der Klasse "ITADualCTC" =-
void testLS2H(RG_Vector& vPos);
void testHRIR();
double getLatency();
void updateHeadPosition(const RG_Vector& vPos, const RG_Vector& vView, const RG_Vector& vUp, bool bForceFilterUpdate=false);
// Alternative Methode zum Setzen der Kopfposition (mit Winkeln, zum Debuggen)
void updateHeadPosition(const