www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/birds/birdsfn.m
% function birdsfn(action) if nargin < 1 action='init'; end 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' setwindow(f); movegui(f,'center'); birds = {'Yellow_Warbler', 'Western_Meadowlark', 'Orchard_Oriole',... 'Chipping_Sparrow', 'Scissor_Tailed_Flycatcher',... 'Black_Throated_Gray_Warbler', 'Cassins_Kingbird',... 'Black_Necked_Stilt', 'Chestnut_Sided_Warbler',... 'Great_Horned_Owl', 'Grasshopper_Sparrow', 'Swamp_Sparrow',... 'Golden_Crowned_Sparrow', 'Indigo_Bunting', 'Robin',... 'Nashville_Warbler', 'Rufous_Sided_Towhee', 'Random_Bird'}; set(handles.birdlist,'String',birds); case 'plot' if ~isfield(handles,'pscore') [handles.audiodata,handles.pscore] = synthbird(handles); end plotdata(handles.pscore); case 'play' [handles.audiodata,handles.pscore] = synthbird(handles); play_audiodata(handles.audiodata); case 'save' if isfield(handles, 'audiodata') save_audiodata(handles.audiodata); end case {'sonogram','fourier'} handles.audiodata = synthbird(handles); switch action case 'sonogram' sonoexpogui(handles.audiodata); case 'fourier' fourierexpo(handles.audiodata); end case 'close' close_figure(f,figname(1:end-4)); return; end set(f,'UserData',handles); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function setwindow(f) load 'forest.mat'; set(f,'Units','Pixels',... 'Position',[100 100 size(x,2)*1.1 size(x,1)*1.1]); setdefaults; axes('pos',[0 0 1 1]); image(x); axis image; colormap(cmap); switch computer case {'GLNX86','MAC'} birdfontsize = 12; titlesize = 24; authorsize = 14; case 'PCWIN' birdfontsize = 10; titlesize = 18; authorsize = 12; end y = -35; text(52.5,y+60,'Additive Synthesis Forest',... 'fontsize',titlesize,... 'fontweight','bold',... 'color',[0.5 0.9 0.8]); function [audiodata,pscore] = synthbird(handles) contents = get(handles.birdlist,'String'); bird = contents{get(handles.birdlist,'Value')}; if strncmp(bird,'Random',6) birdname=['RandBird_' num2str(rand*5280) '_' char(floor(rand*26+65))]; fprintf('%s\n', birdname); pscore = randbird(floor(rand*40)); else pscore = birdcall(bird); end timestretch = str2num(get(handles.timestretch,'String')); randtime = str2num(get(handles.randtime,'String')); randamp = str2num(get(handles.randamp,'String')); randfreq = str2num(get(handles.randfreq,'String')); % Format is: {begin dur freq freq_skew amp freq_env amp_env <partials>} for i=1:size(pscore,1) pscore{i,1} = pscore{i,1}*(timestretch+(rand-0.5)*randtime); pscore{i,2} = pscore{i,2}*(timestretch+(rand-0.5)*randtime); pscore{i,3} = pscore{i,3}*(1+(rand-0.5)*randfreq); pscore{i,4} = pscore{i,4}*(1+(rand-0.5)*randfreq); pscore{i,5} = pscore{i,5}*(1+(rand-0.5)*randamp); freqenv = pscore{i,6}; freqenv(1:2:end) = freqenv(1:2:end).*(timestretch+(rand-0.5)*randtime); freqenv(2:2:end) = freqenv(2:2:end).*(1+(rand-0.5)*randfreq); freqenv = freqenv./max(freqenv(1:2:end)); pscore{i,6} = freqenv; ampenv = pscore{i,7}; ampenv(1:2:end) = ampenv(1:2:end).*(timestretch+(rand-0.5)*randtime); ampenv(2:2:end) = ampenv(2:2:end).*(1+(rand-0.5)*randamp); ampenv = ampenv./max(ampenv(1:2:end)); pscore{i,7} = ampenv./max(ampenv(1:2:end)); end Fs = 44100; audiodata.data = normalize(synth(pscore, Fs,'add')'); audiodata.Fs = Fs; function plotdata(pscore) % Format is: {begin dur freq freq_skew amp freq_env amp_env <partials>} % Make plot for each note? figure; for i=1:size(pscore,1) ampenv = pscore{i,7}; amptimes = pscore{i,1} + pscore{i,2}*ampenv(1:2:end); ampvals = pscore{i,5}*ampenv(2:2:end); freqenv = pscore{i,6}; freqtimes = pscore{i,1} + pscore{i,2}*freqenv(1:2:end); freqvals = pscore{i,3} + pscore{i,4}*freqenv(2:2:end); subplot(size(pscore,1),2,i*2-1) plot(amptimes,ampvals); axis tight; if i == 1, title('Amplitude Envelopes'); end if i == size(pscore,1) xlabel('Time (s)'); end ylabel(['Note ' num2str(i)]); subplot(size(pscore,1),2,i*2) plot(freqtimes,freqvals); axis tight; if i == 1, title('Frequency Envelopes'); end if i == size(pscore,1) xlabel('Time (s)'); end end