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
|