www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/feature/create_CSSDB.m
function database = create_CSSDB(sounddata, varargin) %vargin can be window_size, window_skip, analysis parameters: (zero, rms, ...) % sounddata = struct('data',[],'Fs',44100,'nBits',16,'filename'); error(nargchk(2,15,nargin)); anal_param = cell(1,10); sound = sounddata.data; Fs = sounddata.Fs; if nargin < 2 & ~ischar(varargin{1}), window_size = 512; fprintf('Assuming window_size = %d\n', window_size); elseif nargin < 3 & ~ischar(varargin{2}), window_size = varargin{1}; window_skip = window_size/2; fprintf('Assuming window_skip = %d\n', window_skip); elseif nargin >= 4 window_size = varargin{1}; window_skip = varargin{2}; % determine analysis types param_num = 1; for i=3:nargin-1, arg = varargin{i}; anal_param(param_num) = {lower(arg)}; param_num = param_num + 1; end end num_params = param_num-1; num_samples = size(sound,1); anal_window = hamming(window_size); num_windows = floor(num_samples/window_skip-1); num_channels = size(sound,2); % Print out analysis parameters fprintf('Analysis:\n\t%s\n\tnum_samples = %d\n\tnum_channels = %d\n\tFs = %d\n\twindow_size = %d\n\twindow_skip = %d\n\t',... sounddata.filename, num_samples, num_channels, Fs, window_size, window_skip); fprintf('Analysis Types:\t'); for i=1:num_params, fprintf('%s ', anal_param{i}); end fprintf('\n'); % Generate database % Samples Analysis Types database = struct('data',{{}},'datatype',{{}},'anal_file','',... 'num_channels',num_channels,'Fs',Fs, 'window_skip',window_skip); database.data = cell(num_windows*num_channels,num_params+1); database.datatype = cell(1,num_params); database.anal_file = sounddata.filename; database.datatype(1,1) = {cellstr('samples')}; for i=1:num_params, database.datatype(1,i+1) = {anal_param(i)}; end for k = 1:num_channels, for i = 1:num_windows, start_sample = (i-1)*window_skip + 1; end_sample = start_sample + window_size-1; frame = sound(start_sample:end_sample,k).*anal_window; database.data{i+(k-1)*num_windows,1} = frame; for j=1:num_params, switch(anal_param{j}) case 'zero' database.data{i+(k-1)*num_windows,j+1} = zero_crossings(frame); case 'rms' database.data{i+(k-1)*num_windows,j+1} = rms(frame); case 'spec_centroid' database.data{i+(k-1)*num_windows,j+1} = ... spec_centroid(frame,Fs); end end end end for j=1:num_params, fprintf('\tMean %s = %6.4f\n', anal_param{j}, ... mean(cat(1,database.data{2:end,j+1}))); end fprintf('\t%d data points\n\n', num_windows*num_channels);