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);