From e67ed00d0f773de8c536065b7623dbb2bc4cf45f Mon Sep 17 00:00:00 2001 From: Michael Kohnen <michael.kohnen@akustik.rwth-aachen.de> Date: Mon, 22 Jan 2018 18:19:25 +0100 Subject: [PATCH] =?UTF-8?q?deleted=20old=20name=20conversion=20f=C3=BCr=20?= =?UTF-8?q?ambisonics,=20VR=5FLoudspeaker=5Fposition=20and=20ita=5FpanVBAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpatialAudio/VR_loudspeaker_position.m | 41 --------- .../SpatialAudio/ita_decodeAmbisonics.m | 92 ------------------- .../SpatialAudio/ita_encodeAmbisonics.m | 52 ----------- applications/SpatialAudio/ita_panVBAP.m | 56 ----------- 4 files changed, 241 deletions(-) delete mode 100644 applications/SpatialAudio/VR_loudspeaker_position.m delete mode 100644 applications/SpatialAudio/ita_decodeAmbisonics.m delete mode 100644 applications/SpatialAudio/ita_encodeAmbisonics.m delete mode 100644 applications/SpatialAudio/ita_panVBAP.m diff --git a/applications/SpatialAudio/VR_loudspeaker_position.m b/applications/SpatialAudio/VR_loudspeaker_position.m deleted file mode 100644 index c11862be..00000000 --- a/applications/SpatialAudio/VR_loudspeaker_position.m +++ /dev/null @@ -1,41 +0,0 @@ -function pos = VR_loudspeaker_position(varargin) - -% Give back the position, in meters, of the 8 loudspeakers in the VR lab. -% See options for more details - -% Author: Michael Kohnen -- Email: mko@akustik.rwth-aachen.de -% Date: 03-May-2017 - -% Options -opts.virtualSpeaker = false; % true || Indicates whether to add virtual speaker achieve a more regular distribution (stabilizes the pseudoinverse in Ambisonics Decoding) -opts.coordSystem = 'itaCoordinates'; % 'openGL' || indicates in which coordinate system the output is -opts.isItaCoordinates = true; % true || indicates whether the output is a itaCoordinate or not (warning: if combined with coordSystem='opneGL', the angles for azimuth and elevation are not correct -opts.heightCorrection = 0.0597; % in meter || ensures that the loudspeakers are around the point (0 0 0), standard value is height of the bigger loudspeaker in the horizontal plane - -opts=ita_parse_arguments(opts, varargin); - - -% X Y Z (openGL) -pos = itaCoordinates(zeros(12,3)); -pos.r= 2.28; -pos.phi_deg=[45 315 225 135 0 270 180 90 0 270 180 90]; -pos.theta_deg=[88.5 88.5 88.5 88.5 60 60 60 60 118 118 118 118]; - - - -if opts.virtualSpeaker - pos.cart = [pos.cart;... - 0 0 -2.3;... % virtual speaker - 0 0 2.3]; % virtual speaker -end - -% Correction of head height -pos.z=pos.z-opts.heightCorrection; - -if strcmpi(opts.coordSystem,'opengl') - pos.cart = ita_matlab2openGL(pos); -end - -if (~opts.isItaCoordinates) - pos = pos.cart; -end \ No newline at end of file diff --git a/applications/SpatialAudio/ita_decodeAmbisonics.m b/applications/SpatialAudio/ita_decodeAmbisonics.m deleted file mode 100644 index 948e9681..00000000 --- a/applications/SpatialAudio/ita_decodeAmbisonics.m +++ /dev/null @@ -1,92 +0,0 @@ -function [ OutputSignals ] = ita_decodeAmbisonics( Bformat, LoudspeakerPos, varargin ) -%ITA_DECODEAMBISONICS Summary of this function goes here -% Detailed explanation goes here - -% BFormat<nmax,LS> - -opts.decoding='remax'; % Decoding strategy (remax,inphase,plane) -% opts.decoding='none'; - -opts = ita_parse_arguments(opts,varargin); - -% Initializing further parameters -if isa(Bformat, 'itaAudio') - nmax=max(Bformat.nChannels); -else - nmax=size(Bformat,2); -end -N=floor(sqrt(nmax)-1); - -% Weighting for Inphase/ReMax -g_re=ones(nmax,1); %init weighting factors for ReMax -g_in=g_re; %init weighting factors for InPhase - - -% ReMax Decoding -if(sum(strcmp(lower(opts.decoding),{'remax' 'both'}))) - % Calculates the B-Format channel weights for ReMax-Decoding - % see J.Daniel Thesis p.312 A.67/A.68 - weightsReMax=zeros(nmax,1); % init weights - % g_m=P_m(r_E) with n=0 for P - % r_E is largest root of P_(order+1) - syms x; - - f=1/2^(N+1)/factorial(N+1)*diff(((x^2-1)^(N+1)),(N+1));%Legendre Polynom n=0 m=order+1 - maxroot=max(eval(solve(f))); %find maximum root(Nullstelle) - for k=1:nmax - leggie=legendre(ita_sph_linear2degreeorder(k),abs(maxroot)); % g_m=P_m(r_E) - weightsReMax(k)=leggie(1);% pick n=0 - end - g_re=weightsReMax; -end - -% Inphase Decoding -if(sum(strcmp(lower(opts.decoding),{'inphase' 'both'}))) - % Calculates the B-format channel weights for InPhase-Decoding - weightsInPhase=zeros(nmax,1); - - %Dissertation J.Daniel p.314, 'preserve Energy' in 0. order - %g_0=sqrt[N*(2*M+1)/(M+1)^2] - weightsInPhase(1)=sqrt(N*(2*N+1)/(N+1)^2); - - for k=2:nmax - m=ita_sph_linear2degreeorder(k); - % Dissertation J.Daniel p.314 - % g_m=M!*(M+1)!/[(M+m+1)!*(M-n)!] - weightsInPhase(k)=factorial(N)*factorial(N+1)/factorial(m+N+1)/factorial(N-m); - end - g_in=weightsInPhase; -end - -weights=g_in.*g_re; % merge weighting factors - -%% Applying weighting to BFormat -if isa(Bformat,'itaAudio') - for k=1:Bformat.nChannels - Bformat.time(:,k)=Bformat.time(:,k).*weights(k); - end -else - for k=1:numel(weights) - Bformat(:,k)=weights(k).*Bformat(:,k); - end -end - -%% SH and inversion of loudspeaker set-up -Y = ita_sph_base(LoudspeakerPos, N, 'real'); % generate basefunctions -Yinv=pinv(Y); % calculate Pseudoinverse, moore penrose, svd - -if isa(Bformat,'itaAudio') - for k=1:LoudspeakerPos.nPoints - for l=1:nmax - temp(l)=Bformat.ch(l)*Yinv(l,k); - end - OutputSignals(k)=sum(temp); - end - OutputSignals=ita_merge(OutputSignals(:)); - OutputSignals.channelCoordinates=LoudspeakerPos; -else - OutputSignals=Bformat*Yinv; -end - - -end diff --git a/applications/SpatialAudio/ita_encodeAmbisonics.m b/applications/SpatialAudio/ita_encodeAmbisonics.m deleted file mode 100644 index 458ac605..00000000 --- a/applications/SpatialAudio/ita_encodeAmbisonics.m +++ /dev/null @@ -1,52 +0,0 @@ -function [ audioOut ] = ita_encodeAmbisonics( audioIn, order, sourcePos ) -%ITA_ENCODEAMBISONICS Encodes a itaAudio with channel coordinates or a -% itaCoordinate with source positions into ambisonics channels -% -% Detailed explanation goes here - -%% Init -if isa(audioIn, 'itaAudio') - aud=true; -elseif isa(audioIn, 'itaCoordinates') - aud=false; - sourcePos=audioIn; - if nargin>2 - error('For itaCoordinates no additional source positions can be given!'); - end -else - error('itaAudio or itaCoordinates has to be the first input!'); -end - -if nargin<2 - warning('SH Truncation order missing, assuming order of one'); - order=1; -end - -if nargin<3 && aud - sourcePos=audioIn.channelCoordinates; - if sourcePos.nPoints<1 || ~isa(sourcePos,'itaCoordinates') - error('No sourcePos found or it is not itaCoordinates! Add channelCoordinates to itaAudio!') - end -end - -%% Encode Source -if ~aud - audioOut=ita_sph_base(sourcePos, order, 'real'); -end - -%% Applying audio data -if aud - audioOut=itaAudio; - audioOut_temp=itaAudio; - for idxCh=1:audioIn.nChannels - Bformat = ita_sph_base(sourcePos(idxCh), order, 'real'); - for idxCoeff=1:numel(Bformat) - audioOut_temp(idxCoeff)=audioIn.ch(idxCh)*Bformat(idxCoeff); - end - if idxCh==1 - audioOut=ita_merge(audioOut_temp); - else - audioOut=audioOut+ita_merge(audioOut_temp); - end - end -end \ No newline at end of file diff --git a/applications/SpatialAudio/ita_panVBAP.m b/applications/SpatialAudio/ita_panVBAP.m deleted file mode 100644 index 9f816483..00000000 --- a/applications/SpatialAudio/ita_panVBAP.m +++ /dev/null @@ -1,56 +0,0 @@ -function weights = panVBAP(pos_LS,pos_VS) -%panVBAP - Calculate weights for VBAP -% -% This function receives the position of the loudspeakers and the position -% of the virtual source. Both input must be given as objects of the class -% itaCoordinates. -% -% The output is the set of frequency independent weights used to pan the -% virtual source on the given array. -% -% Call: weights = panVBAP(pos_LS,pos_VS) -% -% Author: Michael Kohnen -- Email: mko@akustik.rwth-aachen.de -% Former author: Bruno Masiero -- Email: bma@akustik.rwth-aachen.de -% Created: 13-Jun-2011 -% Last modified: 04-May-2017 -%$ENDHELP$ - -%% Preliminary tests -% if pos_LS.isPlane -% Number_of_active_loudspeakers = 2; %Extended Stereo -% else - Number_of_active_loudspeakers = 3; -% end - -weights = zeros(pos_VS.nPoints,pos_LS.nPoints); - -if pos_VS.r == 0 - error('No direction for Virtual Source was given!') -end - -%% Find the closest loudspeakers -% Calculate the distance of each loudspeaker to the virtual source with the -% help of the itaCoordinate overloaded function itaCoordinate.r. -% To sort the distance in ascending value, use the function sort. - aux = pos_LS - pos_VS; - dist = aux.r; - [junk,index] = sort(dist,'ascend'); - index = index(1:Number_of_active_loudspeakers); - - active_loudspeakers = pos_LS.n(index); - -%% Calculate the weights for the active loudspeakers -% Create a base matrix with the direction of the active loudspeakers and -% multiply the direction of the virtual source with the inverse of this -% matrix. -% Don't forget to normalize yor results with C = 1; -for idx = 1:pos_VS.nPoints - p = pos_VS.n(idx).cart; - L = active_loudspeakers.cart; - g = p*pinv(L); - % Re-normalize. - g = abs(g)/norm(g); - weights(idx,index) = g; -end - -- GitLab