Pārlūkot izejas kodu

add sphear_a2b_all.m, split frequency range into equally spaced bands and calculate an A2B matrix for each band

Fernando Pablo Lopez-Lezcano 10 gadi atpakaļ
vecāks
revīzija
ff29530d38
1 mainītis faili ar 67 papildinājumiem un 0 dzēšanām
  1. 67 0
      sphear_a2b_all.m

+ 67 - 0
sphear_a2b_all.m

@@ -0,0 +1,67 @@
+%%
+%% *SpHEAR Project
+%%
+%% sphear_a2b_all: calculate A2B matrixes for frequency ranges
+%%
+%% usage:
+%%   [F FE A2BF] = sphear_a2b_all(m, fmin, fmax, Noct, Fs, Nsamp, Npre, plt)
+%%
+%% m: vector of measurement numbers to take into account
+%% fmin, fmax: lower and upper frequency limits
+%% Noct: width of frequency ranges in fractions of an octave, this
+%%       will be changed slightly so that the frequency range is
+%%       covered by equally spaced frequency bands
+%% Fs: sampling rate
+%% Nsamp: time domain samples to use
+%% Npre: samples to use before the main impulse peak
+%%
+%% Copyright 2016, Fernando Lopez-Lezcano, All Rights Reserved
+%% nando@ccrma.stanford.edu
+%%
+%%  This program is free software: you can redistribute it and/or modify
+%%  it under the terms of the GNU General Public License as published by
+%%  the Free Software Foundation, either version 3 of the License, or
+%%  (at your option) any later version.
+%%
+%%  This program is distributed in the hope that it will be useful,
+%%  but WITHOUT ANY WARRANTY; without even the implied warranty of
+%%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%%  GNU General Public License for more details.
+%%
+%%  You should have received a copy of the GNU General Public License
+%%  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+function [F FE A2BF] = sphear_a2b_all(m, fmin, fmax, Noct, Fs, Nsamp, Npre, plt)
+
+  A2BF = zeros(1, 4, 4);
+
+  %% calculate number of frequency bands spaced Noct
+  n = floor(log(fmax/fmin)/log(2^(1/Noct)));
+  %% adjust width of band so they fit exactly in frequency range
+  N = log(2)/(log(fmax/fmin)/n);
+  printf("%d frequency bands, %f bands per octave\n", n, N);
+
+  %% first center frequency
+  fcmin = fmin * 2^(1/(N * 2));
+  %% all center and edge frequencies
+  fc = fcmin * 2.^((0:n - 1)/N)';
+  fe = fmin * 2.^((0:n)/N)';
+  
+  for i = (1:size(fc))
+    R = sphear_af_power(m, fe(i), fe(i + 1), Nsamp, Npre);
+    [A2B pv max_err] = A2B_matrix(R);
+    %% measurement, b format component, capsule
+    A2BF(i,:,:) = A2B;
+    BF = R * A2B;
+
+    printf("%d: %d -> [%d %d] cond=%f\n", i, fc(i), fe(i), fe(i + 1), cond(A2B));
+
+    if plt
+      sphear_bf_plot(BF, fe(i), fe(i + 1));
+    end
+  end
+
+  F = fc;
+  FE = fe;
+end
+