⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sigan.m

📁 信号实验常用的simulink模型和mfile,可直接在matlan下运行。
💻 M
📖 第 1 页 / 共 2 页
字号:
function sigan(action,in1,in2);
%sigan 交互式信号演示 - 1 : 信号的 DFT
%	Illustrating some basic signal processing concepts, such as 
%	sampling, aliasing, and windowing.

%	possible actions:
%	  'start'
%	  'down'
%	  'move'
%	  'up'
%	  'redraw'
%	  'done'
%	  'setfreq'
%	  'setwindow'
%	  'showwin'

if nargin<1,
    action='start';
end;

global sigan_DAT
global ADDIT_DAT	% this is for WINDOW pop-up button
global fun_str
global ws

if strcmp(action,'start'),

    %====================================
    % Graphics initialization
    oldFigNumber = watchon;
    figNumber = figure;
    set(gcf, ...
        'NumberTitle','off', ...
        'Name','离散非周期信号傅立叶变换', ...
        'backingstore','off',...
        'Units','normalized');

    %====================================
    % Information for all buttons
    labelColor=192/255*[1 1 1];
    top=0.95;
    bottom=0.05;
    left=0.75;
    yInitLabelPos=0.90;
    left = 0.78;
    labelWid=0.18;
    labelHt=0.05;
    btnWid = 0.18;
    btnHt=0.07;
    % Spacing between the label and the button for the same command
    btnOffset=0.003;
    % Spacing between the button and the next command's label
    spacing=0.05;
 
    %====================================
    % The CONSOLE frame
    frmBorder=0.02;
    yPos=0.05-frmBorder;
    frmPos=[left-frmBorder yPos btnWid+2*frmBorder 0.9+2*frmBorder];
    h=uicontrol( ...
        'Style','frame', ...
        'Units','normalized', ...
        'Position',frmPos, ...
        'BackgroundColor',[0.5 0.5 0.5]);
    
    %====================================
    % The SIGNAL command popup button

    btnNumber=1;
    yLabelPos=top-(btnNumber-1)*(btnHt+labelHt+spacing);
    labelStr=' 信号';

    % Generic label information
    labelPos=[left yLabelPos-labelHt labelWid labelHt];
    uicontrol( ...
        'Style','text', ...
        'Units','normalized', ...
        'Position',labelPos, ...
        'BackgroundColor',labelColor, ...
        'HorizontalAlignment','left', ...
        'String',labelStr);

    btnPos=[left yLabelPos-labelHt-btnHt-btnOffset btnWid btnHt];
    popup=uicontrol('Style','Popup','String','矩形脉冲|单位脉冲',...
        'Position', btnPos, ...
        'BackgroundColor','w', ...
        'ForegroundColor','k', ...
        'Units','normalized',...
        'CallBack',[...
		'global sigan_DAT;',...
		'popup=sigan_DAT(11);',...
		'val = get(popup,''Value'');',...
		'if val<=3',...
		'	sigan(''redraw'');',...
		'else',...
		'	getstr;',...
		'end']);

    %====================================
    % The WINDOW command popup button
   % btnNumber=2;
    %yLabelPos=top-(btnNumber-1)*(btnHt+labelHt+spacing);
   % labelStr=' 窗口函数';
    %popupStr= '矩形|三角形|汉宁|海明';
   % if ~isstudent
    %    popupStr= [popupStr '|切比雪夫|恺撒'];
    %end
   % callbackStr= 'sigan(''setwindow'')';

    % Generic label information
%    labelPos=[left yLabelPos-labelHt labelWid labelHt];
 %   uicontrol( ...
  %      'Style','text', ...
   %     'Units','normalized', ...
    %    'Position',labelPos, ...
     %   'BackgroundColor',labelColor, ...
      %  'HorizontalAlignment','left', ...
       % 'String',labelStr);

    % Generic popup button information
%    btnPos=[left yLabelPos-labelHt-btnHt-btnOffset btnWid btnHt];
 %   winHndl = uicontrol( ...
  %      'Style','popup', ...
   %     'Units','normalized', ...
    %    'BackgroundColor','w', ...
     %   'ForegroundColor','k', ...
      %  'Position',btnPos, ...
       % 'String',popupStr, ...
	%'visible','on',...
        %'Callback',callbackStr);

  %====================================
    % The FUNDAMENTAL editable text box
    btnNumber=3;
    yLabelPos=top-(btnNumber-1)*(btnHt+labelHt+spacing);
    labelPos=[left yLabelPos-labelHt labelWid+0.02 labelHt];
    freq_text = uicontrol( ...
        'Style','text', ...
        'Position', labelPos, ...
        'Units','normalized', ...
        'BackgroundColor',[0.5 0.5 0.5], ...
        'ForegroundColor','w', ...
        'HorizontalAlignment','left', ...
        'String','脉宽参数(N1):');

    btnPos=[left+0.02  yLabelPos-labelHt-btnHt-btnOffset ...
            0.5*btnWid+frmBorder  btnHt];
    freq_field = uicontrol( ...
        'Style','edit', ...
        'BackgroundColor','w', ...
        'ForegroundColor','k', ...
        'Position', btnPos, ...
        'Units','normalized', ...
        'HorizontalAlignment','left', ...
        'String','5',...
        'CallBack','sigan(''setfreq''); sigan(''redraw'')');

   %====================================
    % The Show Window CheckBox
%    show_window=uicontrol(gcf, ...
 %       'Style','checkbox', ...
  %      'Units','normalized',...
	%'Position',[left yLabelPos-labelHt*4.5 labelWid+0.02 labelHt],...
%	'backgroundcolor',[0.5 0.5 0.5],...
	%'foregroundcolor','w',...
       % 'HorizontalAlignment','left', ...
        %'string','显示窗口函数',...
	%'value',0,...
        %'Callback','sigan(''delshow'');');

   %====================================
    % The INFO button
    uicontrol( ...
        'Style','push', ...
        'Units','normalized', ...
        'Position',[left bottom+(2*labelHt)+spacing btnWid 2*labelHt], ...
        'String','信息', ...
        'Callback','sigan(''info'')');

   %========================================
   % The CLOSE button
    done_button=uicontrol('Style','Pushbutton', ...
        'Position',[left bottom btnWid 2*labelHt], ...
        'Units','normalized','Callback',...
        'sigan(''done'')','String','关闭');
   %====================================

    % Create intial signal
    N=512;     % number of samples
     N1=20;
    amp=1;
    freq=5;    % hertz
    t0=-10;      % seconds
    t1=10;      % seconds
    t=-10:10;
    T=(t1-t0)/N;
    ws=t(2)-t(1);            % sampling rate in seconds
    M=512;     % length of fft
    window=ones(N,1);    % use window to lower side-lobes in the freq. domain
                             % (makes peaks wider)
    
    min_dB=0; % freq. domain lower axis limit
    %w=ws*(1:N/2)/N;
    %w2=ws*(-(0:N/2-1))/N;
    % create axes for time domain and frequency domain plot

     ax_freq=axes('Position',[.12 .14 .6 .3],'XLim',...
             [0,10],'YLim',[0 15]);

    % time domain
    val = get(popup,'Value');
    %if(freq<0.05)freq=0.05;end
     %if(freq>0.95)freq=0.95;end
      %if(amp>1.0)amp=1.0;end
    %if (val == 1),
        %for t=t0:t:t1
         % if t==0,f=1;
          %   else
     %f=amp*sin(freq*t)./(t*pi);
    %      end;
     %    end
    if (val == 1),   % square wave
       for i=1:N1+1
         if abs(i-N1/2-1)<=freq
        
            f(i)=amp;
          else
              f(i)=0;
   
            end
           end

         
        %tt=freq*t*2*pi;
        %tmp=rem(tt,2*pi);
        %f=amp*(2*rem((tt<0)+(tmp>pi | tmp<-pi)+1,2)-1);
    elseif (val == 2),   % sawtooth
        
  for i=1:N1+1  
           if i==(N1/2)+1, f(i)=1;
           else f(i)=0; 
           end;      
         end


               %tt=freq*t*2*pi;
       % f=amp*((tt < 0) + rem(tt,2*pi)/2/pi - .5)*2;
    elseif (val == 3),   % self-defined waveform
	f=eval(fun_str);
    end;

    % frequency domain
    F=fft(f,M);
       %F=F(1:M);
    w=2*pi/ws/M*(0:M-1);
    FF=sqrt(F.*conj(F));
    % ind=find(FF<min_dB);
    % FF(ind)=NaN*ones(size(ind)); % put NaN's in where
         % min_dB shows up - this is to work around no clipping in xor mode
       
      
     freq_line=plot(w,FF,'EraseMode','xor');
      axis([0 10 0 15]);
    grid;
    ylabel('幅频特性');
    xlabel('频率 (Hz)');

    ax_time=axes('Position',[.12 .58 .6 .3],'XLim',[-10 10],'YLim',[0 1]);
   
    time_line=plot(t,f,'EraseMode','xor');
    stem(t,f);
   % stem(-t,f);
      axis([-10 10 0 1]);
    % (set to xor mode to prevent re-rendering, that is, for speed)
    grid;
    ylabel('波形');
    xlabel('时间');
    %text(-7.55, 1.25,'点击并拖放信号波形以改变其基频与振幅。');
  
      %set(time_line,'ButtonDownFcn','sigan(''down'')');

    sigan_DAT = [freq; amp; N; M; min_dB; 0; 0; ...
		time_line; freq_line; freq_field; popup; -1; gcf; ...
		];
    %ADDIT_DAT = winHndl;

    watchoff(oldFigNumber);

elseif strcmp(action,'down'),

  popup=sigan_DAT(11);
  val = get(popup,'value');
  if val<=3
    % assumes that a line was clicked
    time_line=sigan_DAT(8);
    axes(get(time_line,'parent'));	% set the right axes

    % Obtain coordinates of mouse click location in axes units
    pt=get(gca,'currentpoint');
    x=pt(1,1);
    y=pt(1,2);


% find closest vertex of line to mouse click location (call it fixed_x, fixed_y)

    line_x=get(time_line,'XData');
    line_y=get(time_line,'YData');
    units_str = get(gca,'units');  % save normalized state
    set(gca,'units','pixels');     % distance must be in pixels
    p=get(gca,'pos');
    xa=get(gca,'xlim');
    ya=get(gca,'ylim');
    
    dist=((line_x-x)*p(3)/(xa(2)-xa(1))).^2 + ...
         ((line_y-y)*p(4)/(ya(2)-ya(1))).^2;
    [temp,i]=min(dist);
    fixed_x=line_x(i);
    fixed_y=line_y(i);
    set(time_line,'LineStyle',':');

    sigan_DAT(6)=fixed_x;
    sigan_DAT(7)=fixed_y;

    set(gca,'units',units_str );
    set(gcf,'WindowButtonMotionFcn', 'sigan(''move'')');
    set(gcf,'WindowButtonUpFcn', 'sigan(''up'')');
  %  set(gcf,'userdata',u);
end

elseif strcmp(action,'move'),
    % u = get(gcf,'userdata');
    freq=sigan_DAT(1);
    amp=sigan_DAT(2);
    N=sigan_DAT(3);
    M=sigan_DAT(4);
    min_dB=sigan_DAT(5);
    fixed_x=sigan_DAT(6);
    fixed_y=sigan_DAT(7);
    time_line=sigan_DAT(8);
    freq_line=sigan_DAT(9);
    freq_field=sigan_DAT(10);
    popup=sigan_DAT(11);
    %t=sigan_DAT(14:14+N-1);
    %window=sigan_DAT(14+N:14+N+N-1);

    pt=get(gca,'currentpoint');
    x=pt(1,1);
    y=pt(1,2);

    amp1=y/fixed_y*amp;
    if (abs(amp1)>1.0),
       amp1=1.0*sign(amp1);
    end;
    if (abs(amp1)<0.05),
       amp1=0.05*sign(amp1);
    end;
    if (amp1 == 0),
        amp1=0.05;
    end;
    freq1=fixed_x/x*freq;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -