www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/sample/samplexpofn.m

    function samplexpofn(action)

    if nargin < 1
        action='init';
    end

    % Option to show error?
    
	name = mfilename;
    figname = [name(1:end-2) '_fig'];
    f=findobj('Tag',figname);
    handles = get(f,'UserData');

    switch action
        case 'help'
			display_help(figname);
		case 'init'
            setdefaults;
			samplexpofn 'update';
		case 'update'
			update(handles);
			linkedzoom([handles.sampleplot, handles.interplot],'onx');
	end
	set(f,'UserData',handles);


% --------------------------------------------------------------------
function update(handles)
	Fs = str2double(get(handles.Fs,'String'));
	periods = str2double(get(handles.periods,'String'));
	freq1 = str2double(get(handles.freq1,'String'));
	amp1 = str2double(get(handles.amp1,'String'));
	phase1 = str2double(get(handles.phase1,'String'))*pi/180;
	offset = str2double(get(handles.offset,'String'));

% 	sample_t = [0:1/Fs:periods/freq1];
% 	t = [0:1/44100:periods/freq1];
	dur = 0.2;
	sample_t = [0:1/Fs:dur];
	aFs = 11025;
	dt = 0.05;
	t = [0:1/aFs:dur];
	
	plotdur = periods/freq1;

	contents = get(handles.wave,'String');
	switch lower(contents{get(handles.wave,'Value')})
		case 'sine'
			signal = offset + amp1*sin(2*pi*freq1*t + phase1);
			sample_signal = offset + amp1*sin(2*pi*freq1*sample_t + phase1);
		case 'triangle'
			signal = offset + amp1*sawtooth(2*pi*freq1*t + phase1,0.5);
			sample_signal = offset + amp1*sawtooth(2*pi*freq1*sample_t + phase1,0.5);
		case 'sawtooth'
			signal = offset + amp1*sawtooth(2*pi*freq1*t + phase1);
			sample_signal = offset + amp1*sawtooth(2*pi*freq1*sample_t + phase1);
		case 'square'
			signal = offset + amp1*square(2*pi*freq1*t + phase1);
			sample_signal = offset + amp1*square(2*pi*freq1*sample_t + phase1);
	end
	%Quantize samples
	nbits = str2num(get(handles.nbits,'String'));
	sample_signal = quantize(sample_signal,nbits);

	axes(handles.sampleplot);
	cla;
	plot(t-dt,signal);
	
	ylabel('Input');
	hold on;
	if (get(handles.samplebox,'Value'))
		stem(sample_t-dt,sample_signal,'k');
	end

	if (get(handles.gridbox,'Value'))
		grid on;
	else
		grid off;
	end
	% Set plot properties
	set(handles.sampleplot,'YLim',[-1.1 1.1]);
	set(handles.sampleplot,'XLim',[0 plotdur],'XTickLabel','');

	axes(handles.interplot);
	cla;
	if (get(handles.samplebox,'Value'))
		stem(sample_t-dt,sample_signal,'k');
	end
	hold on;

	% Now interpolate
	sample_times = sample_t';
	ts = linspace(0,dur,aFs*dur)';
	a = ts(:,ones(size(sample_times)));
	b = sample_times(:,ones(size(ts)))';
	y = sinc(Fs*(a-b))*sample_signal';
	h = plot(ts-dt,y);
	set(h,'LineWidth',2.0);

	if (get(handles.interpbox,'Value'))
		sinct = -0.1:1/aFs:0.1;
		sincfn = sinc(sinct*Fs);
		% Plot sincs at samples
		for i=1:length(sample_signal),
			plot(sinct+sample_t(i)-dt,sincfn*sample_signal(i));
		end
	end

	xlabel('Time (s)');
	ylabel('Output');
	if (get(handles.gridbox,'Value'))
		grid on;
	else
		grid off;
	end
	% Set plot properties
	set(handles.interplot,'YLim',[-1.1 1.1]);
	set(handles.interplot,'XLim',[0 plotdur]);


% --------------------------------------------------------------------

function signal = quantize(signal,nbits,maxbits)
	% Signal should be -1 <= x <= 1
	if (nbits == 1)
		ps = find(signal < 0);
		signal(ps) = -1;
		signal = ceil(signal);
	else
		signal = floor(signal.*2^(nbits-1))/2^(nbits-1);
		ps = find(signal == 0);
		signal(ps) = 1/2^(nbits-1);
	end