annotate matlab/MATLAB-Chroma-Toolbox_2.0/generateMultiratePitchFilterbank.m @ 60:1ea2aed23d4a tip

Fix version
author Chris Cannam
date Thu, 13 Feb 2020 13:37:36 +0000
parents b54ee0a0be67
children
rev   line source
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