view aim-mat/tools/@signal/mult.m @ 3:20ada0af3d7d

various bugfixes and changed copywrite message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:36:30 +0100
parents 74dedb26614d
children
line wrap: on
line source
% method of class @signal
% 
%   INPUT VALUES:
%  
%   RETURN VALUE:
%
% 
% This external file is included as part of the 'aim-mat' distribution package
% (c) 2011, University of Southampton
% Maintained by Stefan Bleeck (bleeck@gmail.com)
% download of current version is on the soundsoftware site: 
% http://code.soundsoftware.ac.uk/projects/aimmat
% documentation and everything is on http://www.acousticscale.org


function sig=mult(a,b,start_time,dauer)
%wenn b ein Vektor ist, werden die Werte einfach multipliziert
% wenn b eine Struct ist, dann werden sie adäquat multipliziert

if(~isobject(a))
    disp('error: only works on signals');
end
if nargin < 4
    if isobject(b)
        dauer=GetLength(b);
    end
end
if nargin < 3
    start_time=0;
end

% wenn ein Spaltenvektor multipliziert werden soll
if isnumeric(b)
    sr=getsr(a);
    nr=max(size(b));
    if nr>1
        temp=signal(b,sr);  % erzeuge ein neues Signal aus den Werten
        sig=mult(a,temp,start_time,dauer);    % und lasse dann die beiden Signale zusammenaddieren
    else
        if nargin <3
            sig=a*b;            % einfache Zahl
        else    % with starttime and duration
            start=time2bin(a,start_time)+1;    % +1, because a signal starts at the first bin
            stop=time2bin(a,start_time+dauer);
            sig=a;
            sig.werte(start:stop)=sig.werte(start:stop)*b;
        end
    end
    return;
end


% das resultierede Signal kann länger sein als die Ausgangssignale
% erst feststellen, wie lang das nachher sein soll
laenge1=getlength(a);
laenge2=getlength(b); %so lang ist das zweite Signal
sr1=getsr(a);
sampletime=1/sr1;
sr2=getsr(b);

if laenge2<dauer
    disp('error: the signal is shorter then the duration');
    return;
end

if sr1~=sr2
    disp('error: samplerates differ - not implemented yet');
    return;
end

lneu=start_time+dauer;    % so lang wird das neue Signal
if lneu<laenge1 % oder es ist nicht länger als vorher
    lneu=laenge1;
end

if fround(lneu,10)-fround(laenge1,10) % wenn das neue Signal länger wird
    temp=signal(lneu,sr1,a.name,a.unit_x,a.unit_y,a.start_time);
    % kopiere zuerst das alte Signal
    start=1;
    stop=time2bin(a,laenge1);
    temp.werte(start:stop)=a.werte(start:stop);
    % rekursiver Aufruf, denn nun ist das Signal lang genug
    sig=mult(temp,b,start_time,dauer);
    return;
end

% normalfall: Das Ergebnissignal ist nun höchstens genauso lang
sig=a;  %kopieren des alten Signals in das Rückgabesignal
start1=time2bin(a,start_time)+1;    % +1, because a signal starts at the first bin
stop1=time2bin(a,start_time+dauer);
start2=1;
stop2=time2bin(b,dauer);
sig.werte(start1:stop1)=sig.werte(start1:stop1).*b.werte(start2:stop2);

return;