Mercurial > hg > camir-aes2014
diff core/magnatagatune/MTTMixedFeatureSon.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/magnatagatune/MTTMixedFeatureSon.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,217 @@ +classdef MTTMixedFeatureSon < MTTAudioFeature & handle + % --- + % This Class contains a wrapper for sons feature extraction + % + % The usual workflow for these features constist of three steps + % 1. extract: extracts the basic single-file dependent features + % 2. define_global_transform: calculates the global feature + % transformation parameters + % 3. finalise: applies the common transformations to a specific feature + % --- + + properties(Constant = true) + + % svn hook + my_revision = str2double(substr('$Rev: 741 $', 5, -1)); + end + + properties + % --- + % Set default parameters + % --- + my_params = struct( ... + 'son_filename','features_rbm_50x1010', ... + 'son_conf', '' ... + ); + end + + % --- + % member functions + % --- + methods + + % --- + % constructor: pointer to feature in database + % --- + function feature = MTTMixedFeatureSon(varargin) + + feature = feature@MTTAudioFeature(varargin{:}); + + end + % --- + % extract feature data from raw audio features + % --- + function data = extract(feature, clip) + % --- + % get features. this includes possible + % local normalisations + % --- + + global globalvars; + global comparison_ids; + global sonfeatbase; + global db_MTTClip; + + if isempty(sonfeatbase); + sonfeatbase = load(feature.my_params.son_filename); + end + % + + % --- + % note: this should reference clip.my_db + % get the actual clip id + idx = db_MTTClip.comparison_ids(clip.id); + + % --- + % NOTE: we just copy everything in a big matrix and then + % normalise the data later + % --- + if isfield(sonfeatbase,'nfvec') + rawf = sonfeatbase.nfvec; + elseif isfield(sonfeatbase,'sonfeatures') + rawf = sonfeatbase.sonfeatures'; + end + + if idx <= size(rawf,2) + + % get the vector from loaded data + data.sonraw = rawf(:,idx); + + else + % --- + % CAVE: Clip indices outside + % the range of the supplied mat file + % are filled up with zeros + % --- + data.sonraw = zeros(size(rawf,1),1); + end + + + + data.vector_info = {'Sonfeat'}; + % padd further info struct + data.vector_info(end+1:size(data.sonraw,1)) =... + cell(size(data.sonraw,1) - numel(data.vector_info) , 1); + + % --- + % prepare field for final features + % --- + data.final.vector = []; + data.final.vector_info = struct(); + data.final.dim = 0; + + % save info data + data.info.type = 'MTTMixedFeatureSon'; + data.info.owner_id = clip.id; + data.info.creatorrev = feature.my_revision; + + % save parameters + data.info.params = feature.my_params; + end + + function define_global_transform(features) + % calculate and set normalization factors from the group of + % input features. These features will be set for the full database + + final = zeros(size(features(1).data.sonraw,1), numel(features)); + for i = 1:numel(features) + if ~isempty(features(i).data.sonraw) + final(:,i) = features(i).data.sonraw; + end + end + + % set common to 1 to tell normalisation is done + features(1).my_db.set_common([1]); + + % save the normalised features straight away! + features.finalise(final); + end + + + function finalise(features, final) + % applies a final transformation and + % collects the information of this feature within a single vector + % see info for types in specific dimensions + % check if features have been finalised already + + % --- + % set feature labelling + % --- + + info = {}; + + % --- + % construct resulting feature vector out of features + % --- + if nargin == 2 && isempty(final) + + % the final vector etc already are set to zero; + return; + + elseif nargin == 2 && (numel(features) == size(final, 2)) + % the features have already been preassembled + + for i = 1:numel(features) + + % check for neccesary parameters + if isempty(features(i).my_db.commondb) + + error('Define the global transformation first') + return; + end + + features(i).data.final.vector = final(:,i); + features(i).data.final.dim = size(final,1); + + % fill up info struct and append to feature + features(i).data.final.vector_info.labels = ... + features(i).data.vector_info; + end + else + % --- + % if features have been added after gettin gnormalisation + % parameters, ther should be still an option to include + % them + % --- + + for i = 1:numel(features) + + % check for neccesary parameters + if isempty(features(i).my_db.commondb) + + error('Define the global transformation first') + return; + end + + final = zeros(numel(features(1).data.sonraw), numel(features)); + for i = 1:numel(features) + if ~isempty(features(i).data.sonraw) + final(:,i) = features(i).data.sonraw; + end + end + features(i).data.final.vector = final; + features(i).data.final.dim = size(final,1); + + % fill up info struct and append to feature + features(i).data.final.vector_info.labels = ... + features(i).data.vector_info; + end + + end + + % --- + % TODO: Maybe delete more basic features again at this point? + % --- + end + + % --- + % destructor: do we really want to remove this + % from the database? No, but + % TODO: create marker for unused objects in db, and a cleanup + % function + % --- + function delete(feature) + + end + end +end \ No newline at end of file