annotate Sounds/Tones/ris/makeIRNo.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 74dedb26614d
children
rev   line source
tomwalters@0 1 % support file for 'aim-mat'
tomwalters@0 2 %
tomwalters@0 3 % This external file is included as part of the 'aim-mat' distribution package
tomwalters@0 4 % http://www.pdn.cam.ac.uk/cnbh/aim2006
tomwalters@0 5 % $Date: 2008-06-10 18:00:16 +0100 (Tue, 10 Jun 2008) $
tomwalters@0 6 % $Revision: 585 $
tomwalters@0 7
tomwalters@0 8 function irn = makeIRNo(Delay,NIt,Dur,Gate,RMS,TS,DelF1,HPF,LPF,DelF2)
tomwalters@0 9 % irn = makeIRNo(Delay,NIt,Dur,Gate,RMS,TS,DelF1,HPF,LPF,DelF2)
tomwalters@0 10 %
tomwalters@0 11 % Delay = IRN delay in ms;
tomwalters@0 12 % NIt = number of iterations;
tomwalters@0 13 % Dur = duration of IRN;
tomwalters@0 14 % Gate = duration of on- and offset ramps;
tomwalters@0 15 % RMS = RMS amplitude of IRN;
tomwalters@0 16 % TS = sampling period in ms;
tomwalters@0 17 % Delf1 = lower spectral ramp (we used 0.2 kHz);
tomwalters@0 18 % HPF = lower edge of stady-state portion
tomwalters@0 19 % (in the experiment, HPF was 0.8, 1.6, 3.2 or 6.4 kHz);
tomwalters@0 20 % LPF = upper edge of steady-state portion
tomwalters@0 21 % (in the experiment, LPF was always 1.6 kHz above HPF);
tomwalters@0 22 % DelF2 = upper lower spectral ramp (we used 1.6 kHz);
tomwalters@0 23 %
tomwalters@0 24 % irn = makeIRNo(16,8,100,10,.1,.05,.2,.5,2.0,1.6)
tomwalters@0 25
tomwalters@0 26 TPts = round(Dur/TS);
tomwalters@0 27 FPts = lcfFPts(TPts);
tomwalters@0 28 cmbFilter = lcfFilter(Delay,NIt,TPts,FPts,TS,DelF1,HPF,LPF,DelF2);
tomwalters@0 29 array = real(ifft(cmbFilter.*fft(randn(1,FPts))));
tomwalters@0 30 irn = lcfQWind(lcfSetI(array(1:TPts),RMS),Gate,TS);
tomwalters@0 31 irn = lcfSetI(irn,RMS);
tomwalters@0 32 wavwrite(irn,1000/TS,'testwave');
tomwalters@0 33
tomwalters@0 34 % ********** lcfFilter **********
tomwalters@0 35 function cmbFilter = lcfFilter(Delay,NIt,TPts,FPts,TS,DelF1,HPF,LPF,DelF2)
tomwalters@0 36
tomwalters@0 37 DF = 1/(TS*FPts);
tomwalters@0 38 SDelF1 = round(DelF1/DF);
tomwalters@0 39 SDelF2 = round(DelF2/DF);
tomwalters@0 40 SBW = round((LPF-HPF)/DF);
tomwalters@0 41 FL = max(HPF-DelF1,0);
tomwalters@0 42 FH = min(LPF+DelF2,1/(2*TS));
tomwalters@0 43
tomwalters@0 44 bpFilter = zeros(1,round(FL/DF));
tomwalters@0 45 LEN = min(SDelF1,round(HPF/DF)-length(bpFilter));
tomwalters@0 46 jwd = fliplr(cos((0:LEN-1)*pi/(2*SDelF1)));
tomwalters@0 47 bpFilter = [bpFilter jwd];
tomwalters@0 48 bpFilter = [bpFilter ones(1,SBW)];
tomwalters@0 49
tomwalters@0 50 LEN = min(min(FPts/2,round(FH/DF))-length(bpFilter),SDelF2);
tomwalters@0 51 jwd = cos((0:(LEN-1))*pi/(2*SDelF2));
tomwalters@0 52 bpFilter = [bpFilter jwd];
tomwalters@0 53 bpFilter = [bpFilter zeros(1,FPts/2-length(bpFilter))];
tomwalters@0 54
tomwalters@0 55 frq = (0:FPts/2-1)*DF;
tomwalters@0 56 %Erb = sum(bpFilter.^2*DF);
tomwalters@0 57
tomwalters@0 58 G = 1;
tomwalters@0 59 reH = ones(1,FPts/2);
tomwalters@0 60 imH = zeros(1,FPts/2);
tomwalters@0 61 for I = 1:NIt
tomwalters@0 62 reH = reH+G^I*cos(2*pi*I*Delay*frq);
tomwalters@0 63 imH = imH+G^I*sin(2*pi*I*Delay*frq);
tomwalters@0 64 end
tomwalters@0 65 cmbFilter = bpFilter.*(reH+i*imH);
tomwalters@0 66 cmbFilter = [cmbFilter fliplr(cmbFilter)];
tomwalters@0 67
tomwalters@0 68 % ************ lcfFPts ***********
tomwalters@0 69 function FPts = lcfFPts(TPts)
tomwalters@0 70
tomwalters@0 71 FPts = 16384;
tomwalters@0 72 while FPts<TPts
tomwalters@0 73 FPts = FPts*2;
tomwalters@0 74 end
tomwalters@0 75
tomwalters@0 76 % ************ lcfSetI ************
tomwalters@0 77 function out = lcfSetI(in,RMS);
tomwalters@0 78
tomwalters@0 79 S = sqrt(mean(in.^2));
tomwalters@0 80 if S>0
tomwalters@0 81 out = in*RMS/S;
tomwalters@0 82 else
tomwalters@0 83 error('==> RMS: Devide by zero!')
tomwalters@0 84 end
tomwalters@0 85
tomwalters@0 86 % ************ lcfQWind ************
tomwalters@0 87 function out = lcfQWind(in,Gate,TS)
tomwalters@0 88
tomwalters@0 89 GPts = round(Gate/TS);
tomwalters@0 90 APts = length(in);
tomwalters@0 91 if APts<2*GPts
tomwalters@0 92 error('==> ''Dur'' must be longer than two times ''Gate''!')
tomwalters@0 93 end
tomwalters@0 94 env = cos(pi*(0:GPts-1)/(2*(GPts-1))).^2;
tomwalters@0 95 out = [1-env ones(1,APts-2*GPts) env].*in;
tomwalters@0 96