Chris@0
|
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
2 % Generating filter bank of filters corresponding MIDI pitches
|
Chris@0
|
3 %
|
Chris@0
|
4 % Pitches 21-59, fs = 882
|
Chris@0
|
5 % Pitches 60-95, fs = 4410
|
Chris@0
|
6 % Pitches 96-120, fs =22050
|
Chris@0
|
7 %
|
Chris@0
|
8 % Q (center frequency) / bandwidt, Q > 30 separates notes
|
Chris@0
|
9 % stop: pass_rel = 1/(2*Q); stop_rel = stop*pass_rel;
|
Chris@0
|
10 % Rp loses no more than Rp dB in the passband
|
Chris@0
|
11 % Rs attenuation in the stopband in dB
|
Chris@0
|
12 %
|
Chris@0
|
13 % For details to filter desgin use MATLAB help function
|
Chris@0
|
14 % e.g., "help ellipord" and "help ellip"
|
Chris@0
|
15 %
|
Chris@0
|
16 % Attention: Construction of [b,a] may fail if the
|
Chris@0
|
17 % filter specification are too restrictive
|
Chris@0
|
18 %
|
Chris@0
|
19 %
|
Chris@0
|
20 % License:
|
Chris@0
|
21 % This file is part of 'Chroma Toolbox'.
|
Chris@0
|
22 %
|
Chris@0
|
23 % 'Chroma Toolbox' is free software: you can redistribute it and/or modify
|
Chris@0
|
24 % it under the terms of the GNU General Public License as published by
|
Chris@0
|
25 % the Free Software Foundation, either version 2 of the License, or
|
Chris@0
|
26 % (at your option) any later version.
|
Chris@0
|
27 %
|
Chris@0
|
28 % 'Chroma Toolbox' is distributed in the hope that it will be useful,
|
Chris@0
|
29 % but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
30 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
31 % GNU General Public License for more details.
|
Chris@0
|
32 %
|
Chris@0
|
33 % You should have received a copy of the GNU General Public License
|
Chris@0
|
34 % along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
|
Chris@0
|
35 %
|
Chris@0
|
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
37
|
Chris@0
|
38 clear;
|
Chris@0
|
39
|
Chris@0
|
40 semitoneOffsets = [0, -0.25, -1/3, -0.5, -2/3, -0.75];
|
Chris@0
|
41 nameSuffixes = {''; '_minusQuarter'; '_minusThird'; '_minusHalf'; '_minusTwoThird'; '_minusThreeQuarters'};
|
Chris@0
|
42
|
Chris@0
|
43 for k=1:length(semitoneOffsets)
|
Chris@0
|
44
|
Chris@0
|
45
|
Chris@0
|
46 midi = (1:128); % midi notes
|
Chris@0
|
47 midi_freq = 2.^((midi-69+semitoneOffsets(k))/12)*440; % computing frequencies of midi notes
|
Chris@0
|
48 nameSuffix = nameSuffixes{k};
|
Chris@0
|
49 h(120)=struct('a',[],'b',[]);
|
Chris@0
|
50
|
Chris@0
|
51 disp(['Generating Filterbank: ',nameSuffix]);
|
Chris@0
|
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
53 % fs = 22005, pitches 96-120
|
Chris@0
|
54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
55 fs = 22050;
|
Chris@0
|
56 nyq = fs/2;
|
Chris@0
|
57 midi_min = 96;
|
Chris@0
|
58 midi_max = 120;
|
Chris@0
|
59 Q = 25; stop = 2; Rp = 1; Rs = 50;
|
Chris@0
|
60 pass_rel = 1/(2*Q);
|
Chris@0
|
61 stop_rel = pass_rel*stop;
|
Chris@0
|
62
|
Chris@0
|
63 for k = midi_min:midi_max;
|
Chris@0
|
64 pitch = midi_freq(k);
|
Chris@0
|
65 Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq;
|
Chris@0
|
66 Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq;
|
Chris@0
|
67 [n Wn]=ellipord(Wp,Ws,Rp,Rs);
|
Chris@0
|
68 [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn);
|
Chris@0
|
69 end
|
Chris@0
|
70 num = midi_max-midi_min+1;
|
Chris@0
|
71 h_fvtool = cell(2*num,1);
|
Chris@0
|
72 for i = 1:num
|
Chris@0
|
73 h_fvtool{2*i-1}=h(midi_min+i-1).b;
|
Chris@0
|
74 h_fvtool{2*i}=h(midi_min+i-1).a;
|
Chris@0
|
75 end
|
Chris@0
|
76 fvtool(h_fvtool{:});
|
Chris@0
|
77
|
Chris@0
|
78 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
79 % fs = 4410, pitches 60-95
|
Chris@0
|
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
81 fs = 4410;
|
Chris@0
|
82 nyq = fs/2;
|
Chris@0
|
83 midi_min = 60;
|
Chris@0
|
84 midi_max = 95;
|
Chris@0
|
85 Q = 25; stop = 2; Rp = 1; Rs = 50;
|
Chris@0
|
86 pass_rel = 1/(2*Q);
|
Chris@0
|
87 stop_rel = pass_rel*stop;
|
Chris@0
|
88
|
Chris@0
|
89 for k = midi_min:midi_max;
|
Chris@0
|
90 pitch = midi_freq(k);
|
Chris@0
|
91 Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq;
|
Chris@0
|
92 Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq;
|
Chris@0
|
93 [n Wn]=ellipord(Wp,Ws,Rp,Rs);
|
Chris@0
|
94 [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn);
|
Chris@0
|
95 end
|
Chris@0
|
96 num = midi_max-midi_min+1;
|
Chris@0
|
97 h_fvtool = cell(2*num,1);
|
Chris@0
|
98 for i = 1:num
|
Chris@0
|
99 h_fvtool{2*i-1}=h(midi_min+i-1).b;
|
Chris@0
|
100 h_fvtool{2*i}=h(midi_min+i-1).a;
|
Chris@0
|
101 end
|
Chris@0
|
102 fvtool(h_fvtool{:});
|
Chris@0
|
103
|
Chris@0
|
104 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
105 % fs = 882, pitches 21-59
|
Chris@0
|
106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
107 fs = 882;
|
Chris@0
|
108 nyq = fs/2;
|
Chris@0
|
109 midi_min = 21;
|
Chris@0
|
110 midi_max = 59;
|
Chris@0
|
111 Q = 25; stop = 2; Rp = 1; Rs = 50;
|
Chris@0
|
112 pass_rel = 1/(2*Q);
|
Chris@0
|
113 stop_rel = pass_rel*stop;
|
Chris@0
|
114
|
Chris@0
|
115 for k = midi_min:midi_max;
|
Chris@0
|
116 pitch = midi_freq(k);
|
Chris@0
|
117 Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq;
|
Chris@0
|
118 Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq;
|
Chris@0
|
119 [n Wn]=ellipord(Wp,Ws,Rp,Rs);
|
Chris@0
|
120 [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn);
|
Chris@0
|
121 end
|
Chris@0
|
122 num = midi_max-midi_min+1;
|
Chris@0
|
123 h_fvtool = cell(2*num,1);
|
Chris@0
|
124 for i = 1:num
|
Chris@0
|
125 h_fvtool{2*i-1}=h(midi_min+i-1).b;
|
Chris@0
|
126 h_fvtool{2*i}=h(midi_min+i-1).a;
|
Chris@0
|
127 end
|
Chris@0
|
128 fvtool(h_fvtool{:});
|
Chris@0
|
129
|
Chris@0
|
130
|
Chris@0
|
131 save(['MIDI_FB_ellip_pitch_60_96_22050_Q25',nameSuffix],'h','-V6');
|
Chris@0
|
132
|
Chris@0
|
133 end
|
Chris@0
|
134
|