diff --git a/applications/SpatialAudio/ita_decodeAmbisonics.m b/applications/SpatialAudio/ita_decodeAmbisonics.m new file mode 100644 index 0000000000000000000000000000000000000000..70b32e61a2cd9346b69320ef1c70e946a973a1ef --- /dev/null +++ b/applications/SpatialAudio/ita_decodeAmbisonics.m @@ -0,0 +1,75 @@ +function [ loudspeakerSignals ] = ita_decodeAmbisonics( Bformat, LoudspeakerPos, varargin ) +%ITA_DECODEAMBISONICS Summary of this function goes here +% Detailed explanation goes here + +opts.decoding='remax' % Decoding strategy (remax,inphase,plane) + +opts = ita_parse_arguments(opts,varargin); + + +% Initializing further parameters +nmax=numel(Bformat); + +% 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^(TheOrder+1)/factorial(TheOrder+1)*diff(((x^2-1)^(TheOrder+1)),(TheOrder+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 + TheOrder = obj.ambGetOrder; % amb order from sim room + nmax = (TheOrder+1)^2; % number of channels + weightsInPhase=zeros(nmax,1); + N=numel(obj.monitorRoom.getSourcePosition)/3;% get number of loudspeaker + %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*TheOrder+1)/(TheOrder+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(TheOrder)*factorial(TheOrder+1)/factorial(m+TheOrder+1)/factorial(TheOrder-m); + end + g_in=weightsInPhase; +end + +weights=g_in.*g_re; %merge weighting factors +for k=1:numel(weights) + Bformat(:,k)=weights(k).*Bformat(:,k); %Apply weighting factors +end +% SH and inversion +Y = ita_sph_base(LS,TheOrder,'williams',false); % generate basefunctions +Yinv=pinv(Y); % calculate Pseudoinverse + + +if isa(Bformat,'itaAudio') + for k=1:LS.nPoints + OutputSignals(k)=sum(Bformat*Yinv(:,k)'); + end + OutputSignals=ita_merge(OutputSignals(:)); +else + OutputSignals=Bformat*Yinv; +end + + + +end diff --git a/applications/SpatialAudio/ita_encodeAmbisonics.m b/applications/SpatialAudio/ita_encodeAmbisonics.m new file mode 100644 index 0000000000000000000000000000000000000000..1751b3a203ce6c81a8b60cd7aa9b248ec93793b3 --- /dev/null +++ b/applications/SpatialAudio/ita_encodeAmbisonics.m @@ -0,0 +1,37 @@ +function [ Bformat ] = ita_encodeAmbisonics( sourcePos, varargin ) +%ITA_ENCODEAMBISONICS Summary of this function goes here +% Detailed explanation goes here +if nargin<1 + error('Source position is needed as itaCoordiantes!'); +end + +if ~isa(sourcePos,'itaCoordinates') + error('First input data has to be an itaCoordinates!') +elseif isempty(sourcePos.cart) + error('First input data has to be an itaCoordinates WITH inputdata!') +end + +opts.order=1; %Ambisonics truncation order +opts.audioSource=''; %Signal of the source (itaAudio or filename) + +opts = ita_parse_arguments(opts, varargin); + +% Encode Source +Bformat = ita_sph_base(sourcePos, opts.order, 'Williams', false); + +if ~isempty(opts.audioSource) + if isa(opts.audioSource,'char') + audioIn = ita_read(opts.audioSource); + elseif isa(opts.audioSource,'itaAudio') + audioIn = opts.audioSource; + elseif ~isa(audioIn,'itaAudio') + error('Audio input must eihter be itaAudio or valid filename (see ita_read)'); + end + audioOut=audioIn*Bformat(1); + for k=2:numel(Bformat) + audioOut=ita_merge(audioOut,audioIn*Bformat(k)); + end + Bformat=audioOut; +end +end +