Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Generating filter bank of filters corresponding MIDI pitches Chris@0: % Chris@0: % Pitches 21-59, fs = 882 Chris@0: % Pitches 60-95, fs = 4410 Chris@0: % Pitches 96-120, fs =22050 Chris@0: % Chris@0: % Q (center frequency) / bandwidt, Q > 30 separates notes Chris@0: % stop: pass_rel = 1/(2*Q); stop_rel = stop*pass_rel; Chris@0: % Rp loses no more than Rp dB in the passband Chris@0: % Rs attenuation in the stopband in dB Chris@0: % Chris@0: % For details to filter desgin use MATLAB help function Chris@0: % e.g., "help ellipord" and "help ellip" Chris@0: % Chris@0: % Attention: Construction of [b,a] may fail if the Chris@0: % filter specification are too restrictive Chris@0: % Chris@0: % Chris@0: % License: Chris@0: % This file is part of 'Chroma Toolbox'. Chris@0: % Chris@0: % 'Chroma Toolbox' is free software: you can redistribute it and/or modify Chris@0: % it under the terms of the GNU General Public License as published by Chris@0: % the Free Software Foundation, either version 2 of the License, or Chris@0: % (at your option) any later version. Chris@0: % Chris@0: % 'Chroma Toolbox' is distributed in the hope that it will be useful, Chris@0: % but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: % GNU General Public License for more details. Chris@0: % Chris@0: % You should have received a copy of the GNU General Public License Chris@0: % along with 'Chroma Toolbox'. If not, see . Chris@0: % Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: clear; Chris@0: Chris@0: semitoneOffsets = [0, -0.25, -1/3, -0.5, -2/3, -0.75]; Chris@0: nameSuffixes = {''; '_minusQuarter'; '_minusThird'; '_minusHalf'; '_minusTwoThird'; '_minusThreeQuarters'}; Chris@0: Chris@0: for k=1:length(semitoneOffsets) Chris@0: Chris@0: Chris@0: midi = (1:128); % midi notes Chris@0: midi_freq = 2.^((midi-69+semitoneOffsets(k))/12)*440; % computing frequencies of midi notes Chris@0: nameSuffix = nameSuffixes{k}; Chris@0: h(120)=struct('a',[],'b',[]); Chris@0: Chris@0: disp(['Generating Filterbank: ',nameSuffix]); Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % fs = 22005, pitches 96-120 Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: fs = 22050; Chris@0: nyq = fs/2; Chris@0: midi_min = 96; Chris@0: midi_max = 120; Chris@0: Q = 25; stop = 2; Rp = 1; Rs = 50; Chris@0: pass_rel = 1/(2*Q); Chris@0: stop_rel = pass_rel*stop; Chris@0: Chris@0: for k = midi_min:midi_max; Chris@0: pitch = midi_freq(k); Chris@0: Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq; Chris@0: Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq; Chris@0: [n Wn]=ellipord(Wp,Ws,Rp,Rs); Chris@0: [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn); Chris@0: end Chris@0: num = midi_max-midi_min+1; Chris@0: h_fvtool = cell(2*num,1); Chris@0: for i = 1:num Chris@0: h_fvtool{2*i-1}=h(midi_min+i-1).b; Chris@0: h_fvtool{2*i}=h(midi_min+i-1).a; Chris@0: end Chris@0: fvtool(h_fvtool{:}); Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % fs = 4410, pitches 60-95 Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: fs = 4410; Chris@0: nyq = fs/2; Chris@0: midi_min = 60; Chris@0: midi_max = 95; Chris@0: Q = 25; stop = 2; Rp = 1; Rs = 50; Chris@0: pass_rel = 1/(2*Q); Chris@0: stop_rel = pass_rel*stop; Chris@0: Chris@0: for k = midi_min:midi_max; Chris@0: pitch = midi_freq(k); Chris@0: Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq; Chris@0: Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq; Chris@0: [n Wn]=ellipord(Wp,Ws,Rp,Rs); Chris@0: [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn); Chris@0: end Chris@0: num = midi_max-midi_min+1; Chris@0: h_fvtool = cell(2*num,1); Chris@0: for i = 1:num Chris@0: h_fvtool{2*i-1}=h(midi_min+i-1).b; Chris@0: h_fvtool{2*i}=h(midi_min+i-1).a; Chris@0: end Chris@0: fvtool(h_fvtool{:}); Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % fs = 882, pitches 21-59 Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: fs = 882; Chris@0: nyq = fs/2; Chris@0: midi_min = 21; Chris@0: midi_max = 59; Chris@0: Q = 25; stop = 2; Rp = 1; Rs = 50; Chris@0: pass_rel = 1/(2*Q); Chris@0: stop_rel = pass_rel*stop; Chris@0: Chris@0: for k = midi_min:midi_max; Chris@0: pitch = midi_freq(k); Chris@0: Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq; Chris@0: Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq; Chris@0: [n Wn]=ellipord(Wp,Ws,Rp,Rs); Chris@0: [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn); Chris@0: end Chris@0: num = midi_max-midi_min+1; Chris@0: h_fvtool = cell(2*num,1); Chris@0: for i = 1:num Chris@0: h_fvtool{2*i-1}=h(midi_min+i-1).b; Chris@0: h_fvtool{2*i}=h(midi_min+i-1).a; Chris@0: end Chris@0: fvtool(h_fvtool{:}); Chris@0: Chris@0: Chris@0: save(['MIDI_FB_ellip_pitch_60_96_22050_Q25',nameSuffix],'h','-V6'); Chris@0: Chris@0: end Chris@0: