📄 modexpofn.m
字号:
function modexpofn(action) if nargin < 1 action='init'; end % Fix singlesideband % Time zoom resets % Create demodulation 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; movegui(f,'center'); reset(handles.sig_1_spec); reset(handles.sig_2_spec); reset(handles.sig_3_spec); reset(handles.sig_1_time); reset(handles.sig_2_time); reset(handles.sig_3_time); handles.fileopen = {false, false, false}; set(handles.freqzoom,'Value',1); case 'loadsound' signum = handles.signum; handles.audio{signum} = load_audiodata; if ~isfield(handles.audio{signum}, 'filenamepath') return; end if (size(handles.audio{signum}.data,2) > 1) handles.audio{signum}.data = to_mono(handles.audio{signum}.data); end handles.fileopen{signum} = true; if signum == 2 & handles.fileopen{1} while length(handles.audio{1}.data) > length(handles.audio{2}.data) handles.audio{2}.data = [handles.audio{2}.data; handles.audio{2}.data]; end handles.audio{2}.data = handles.audio{2}.data(1:length(handles.audio{1}.data)); elseif signum == 1 & handles.fileopen{2} while length(handles.audio{1}.data) > length(handles.audio{2}.data) handles.audio{2}.data = [handles.audio{2}.data; handles.audio{2}.data]; end handles.audio{2}.data = handles.audio{2}.data(1:length(handles.audio{1}.data)); end contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); set(f,'UserData',handles); loadSpecPlot(handles, signum); loadTimePlot(handles, signum); linkedzoom([handles.sig_1_time, handles.sig_1_spec,... handles.sig_2_time, handles.sig_2_spec, ... handles.sig_3_time, handles.sig_3_spec],'onx'); modexpofn 'freqzoom'; timeplot = eval(['handles.sig_' num2str(signum) '_time']); handles.xlim_orig = get(timeplot,'XLim'); modexpofn 'freqzoom'; case 'write_soundfile' if (handles.fileopen{2}) write_soundfile(handles); end case 'write_modsoundfile' if (handles.fileopen{3}) write_soundfile(handles); end case 'play' signum = handles.signum; if (handles.fileopen{signum}) timeplot = eval(['handles.sig_' num2str(signum) '_time']); samples = round(get(timeplot,'XLim').*handles.audio{signum}.Fs+1); if samples(1) <= 0 samples(1) = 1; elseif samples(2) > length(handles.audio{signum}.data) samples(2) = length(handles.audio{signum}.data); end audiodata.data = handles.audio{signum}.data(samples(1):samples(2)); audiodata.Fs = handles.audio{signum}.Fs; eval(['playbutton = handles.s' num2str(signum) '_play;']); play_audiodata(audiodata, playbutton); end case {'fftsize','window'} for signum = 1:3 if (handles.fileopen{signum}) contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); loadSpecPlot(handles, signum); end end modexpofn 'freqzoom'; case {'db','colormap','inverse','interpolate'} for signum = 1:3 if (handles.fileopen{signum}) eval(['timeplot = handles.sig_' num2str(signum) '_time;']); xlim = get(timeplot,'XLim'); eval(['spectrumplot = handles.sig_' num2str(signum) '_spec;']); loadSpecPlot(handles, signum); set(spectrumplot,'XLim',xlim); end end modexpofn 'freqzoom'; case 'create_modsig' % Open new GUI window to create modulation signal [freqenv,ampenv] = modsig; if handles.fileopen{2} Fs = handles.audio{2}.Fs; samples = length(handles.audio{2}.data); else Fs = 44100; samples = 1*Fs; end signum = 1; handles.audio{signum} = calculate_sig(freqenv,ampenv,samples,Fs); handles.fileopen{signum} = true; contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); loadSpecPlot(handles, signum); loadTimePlot(handles, signum); set(f,'UserData',handles); modexpofn 'freqzoom'; case 'create_carsig' % Open new GUI window to create modulation signal [freqenv,ampenv] = modsig; if handles.fileopen{1} Fs = handles.audio{1}.Fs; samples = length(handles.audio{1}.data); else Fs = 44100; samples = 1*Fs; end signum = 2; handles.audio{signum} = calculate_sig(freqenv,ampenv,samples,Fs); handles.fileopen{signum} = true; contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); loadSpecPlot(handles, signum); loadTimePlot(handles, signum); set(f,'UserData',handles); modexpofn 'freqzoom'; case 'amdsbsc' if (handles.fileopen{1} & handles.fileopen{2}) handles = amdsbsc(handles); set(f,'UserData',handles); signum = 3; contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); loadSpecPlot(handles, signum); loadTimePlot(handles, signum); modexpofn 'freqzoom'; else warndlg(['You must open two files to perform modulation ', ... ' synthesis!'],'Error'); end case 'amdsbtc' if (handles.fileopen{1} & handles.fileopen{2}) handles = amdsbtc(handles); set(f,'UserData',handles); signum = 3; contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); loadSpecPlot(handles, signum); loadTimePlot(handles, signum); modexpofn 'freqzoom'; else warndlg(['You must open two files to perform modulation ', ... ' synthesis!'],'Error'); end case 'ssbsc' if (handles.fileopen{1} & handles.fileopen{2}) handles = ssbsc(handles); set(f,'UserData',handles); signum = 3; contents = get(handles.fftsize,'String'); fftsize = str2double(contents{get(handles.fftsize,'Value')}); contents = get(handles.window,'String'); shape = contents{get(handles.window,'Value')}; [handles.audio{signum}.spectrum,... handles.audio{signum}.bin,... handles.audio{signum}.st] = ... spectrogram(handles.audio{signum}, fftsize, shape); loadSpecPlot(handles, signum); loadTimePlot(handles, signum); modexpofn 'freqzoom'; else warndlg(['You must open two files to perform modulation ', ... ' synthesis!'],'Error'); end case 'loadworkspace' handles = loadworkspace(handles); set(f,'UserData',handles); for signum=1:3, if (handles.fileopen{signum}) loadSpecPlot(handles, signum); loadTimePlot(handles, signum); end end case 'saveworkspace' saveworkspace(handles); case 'zoomreset' if isfield(handles,'xlim_orig') for signum=1:3 timeplot = eval(['handles.sig_' num2str(signum) '_time']); specplot = eval(['handles.sig_' num2str(signum) '_spec']); set(timeplot,'XLim',handles.xlim_orig); set(specplot,'XLim',handles.xlim_orig); end end linkedzoom([handles.sig_1_time, handles.sig_1_spec,... handles.sig_2_time, handles.sig_2_spec, ... handles.sig_3_time, handles.sig_3_spec],'onx'); case 'freqzoom' val = get(handles.freqzoom,'Value'); if val == 0, val = 0.001; end for signum = 1:3 specplot = eval(['handles.sig_' num2str(signum) '_spec']); if (handles.fileopen{signum}) Fs = handles.audio{signum}.Fs; set(specplot,'YLim',[0 val*Fs/2]) end end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -