Code covered by the BSD License  

Highlights from
AGC

image thumbnail

AGC

by

 

15 Feb 2014 (Updated )

This exercise designs an automatic gain control (AGC) system for speech companding.

Callbacks_agc_GUI25(f,C,start_path)
function Callbacks_agc_GUI25(f,C,start_path)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x=C{1,1};
y=C{1,2};
a=C{1,3};
b=C{1,4};
u=C{1,5};
v=C{1,6};
m=C{1,7};
n=C{1,8};
lengthbutton=C{1,9};
widthbutton=C{1,10};
enterType=C{1,11};
enterString=C{1,12};
enterLabel=C{1,13};
noPanels=C{1,14};
noGraphicPanels=C{1,15};
noButtons=C{1,16};
labelDist=C{1,17};%distance that the label is below the button
noTitles=C{1,18};
buttonTextSize=C{1,19};
labelTextSize=C{1,20};
textboxFont=C{1,21};
textboxString=C{1,22};
textboxWeight=C{1,23};
textboxAngle=C{1,24};
labelHeight=C{1,25};
fileName=C{1,26};
%SENSE COMPUTER AND SET FILE DELIMITER
switch(computer)				
    case 'MACI64',		char= '/';
    case 'GLNX86',  char='/';
    case 'PCWIN',	char= '\';
    case 'PCWIN64', char='\';
    case 'GLNXA64', char='/';
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%PANELS
for j=0:noPanels-1
uipanel('Parent',f,...
'Units','Normalized',...
'Position',[x(1+4*j) y(1+4*j) x(2+4*j)-x(1+4*j) y(3+4*j)-y(2+4*j)]);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%GRAPHIC PANELS
for i=0:noGraphicPanels-1
switch (i+1)
case 1
graphicPanel1 = axes('parent',f,...
'Units','Normalized',...
'Position',[a(1+4*i) b(1+4*i) a(2+4*i)-a(1+4*i) b(3+4*i)-b(2+4*i)],...
'GridLineStyle','--');
case 2
graphicPanel2 = axes('parent',f,...
'Units','Normalized',...
'Position',[a(1+4*i) b(1+4*i) a(2+4*i)-a(1+4*i) b(3+4*i)-b(2+4*i)],...
'GridLineStyle','--');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%TITLE BOXES
for k=0:noTitles-1
switch (k+1)
case 1
titleBox1 = uicontrol('parent',f,...
'Units','Normalized',...
'Position',[u(1+4*k) v(1+4*k) u(2+4*k)-u(1+4*k) v(3+4*k)-v(2+4*k)],...
'Style','text',...
'FontSize',textboxFont{k+1},...
'String',textboxString(k+1),...
'FontWeight',textboxWeight{k+1},...
'FontAngle',textboxAngle{k+1});
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%BUTTONS
for i=0:(noButtons-1)
enterColor='w';
if strcmp(enterType{i+1},'pushbutton')==1 ||strcmp(enterType{i+1},'text')==1
enterColor='default';
end
if (strcmp(enterLabel{1,(i+1)},'')==0 &&...
        strcmp(enterLabel{1,(i+1)},'...')==0) %i.e. there is a label
%creating a label for some buttons
uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i)-labelDist-labelHeight(i+1) ...
(m(2+2*i)-m(1+2*i)) labelHeight(i+1)],...
'Style','text',...
'String',enterLabel{i+1},...
'FontSize', labelTextSize(i+1),...
'HorizontalAlignment','center');
end
switch (i+1)
case 1
button1=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button1Callback);
case 2
button2=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button2Callback);
case 3
button3=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button3Callback);
case 4
button4=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button4Callback);
case 5
button5=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button5Callback);
case 6
button6=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button6Callback);
case 7
button7=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button7Callback);
case 8
button8=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button8Callback);
case 9
button9=uicontrol('Parent',f,...
'Units','Normalized',...
'Position',[m(1+2*i) n(1+2*i) (m(2+2*i)-m(1+2*i)) (n(2+2*i)-n(1+2*i))],...
'Style',enterType{i+1},...
'String',enterString{i+1},...
'FontSize', buttonTextSize(1+i),...
'BackgroundColor',enterColor,...
'HorizontalAlignment','center',...
'Callback',@button9Callback);
end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%USER CODE FOR THE VARIABLES AND CALLBACKS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initialize Variables
    curr_file=1;
    fs=8000;
    fsd=10000;
    directory_name='abcd';
    wav_file_names='abce';
    fin_path='filename';
    fname='output';
    nsamp=1;
    xin=[];
    xinn=[];
    xscale=[];
    ifilt=1;
    M=200;
    M_msec=25;
    alpha=0.99;

% Name the GUI
    set(f,'Name','agc');

% CALLBACKS
% Callback for button1 -- Get Speech Files Directory
 function button1Callback(h,eventdata)
     directory_name=uigetdir(start_path,'dialog_title');
     A=strvcat(strcat((directory_name),[char,'*.wav']));
     struct_filenames=dir(A);
     wav_file_names={struct_filenames.name};
     set(button2,'String',wav_file_names);
     
% once the popupmenu/drop down menu is created, by default, the first
% selection from the popupmenu/drop down menu id not called
    indexOfDrpDwnMenu=1;
    
% by default first option from the popupmenu/dropdown menu will be loaded
    [curr_file,fs]=loadSelection(directory_name,wav_file_names,indexOfDrpDwnMenu);
 end

 %Callback for button2 -- Choose speech file for play and plot
 function button2Callback(h,eventdata)
     indexOfDrpDwnMenu=get(button2,'val');
     [curr_file,fs]=loadSelection(directory_name,wav_file_names,indexOfDrpDwnMenu);
 end

%*************************************************************************
% function -- load selection from designated directory and file
%
function [curr_file,fs]=loadSelection(directory_name,wav_file_names,...
    indexOfDrpDwnMenu);
%
% read in speech/audio file
% fin_path is the complete path of the .wav file that is selected
    fin_path=strcat(directory_name,char,strvcat(wav_file_names(indexOfDrpDwnMenu)));
    
% clear speech/audio file
    clear curr_file;
    
% read in speech/audio signal into curr_file; sampling rate is fs 
    [curr_file,fs]=wavread(fin_path);
    xin=curr_file*32768;
    
% create title information with file, sampling rate, number of samples
    fname=wav_file_names(indexOfDrpDwnMenu);
    FS=num2str(fs);
    nsamp=num2str(length(curr_file));
    file_info_string=strcat('  file: ',fname,', fs: ',FS,' Hz, nsamp:',nsamp);
    
% read in filename (fname) from cell array
    fname=wav_file_names{indexOfDrpDwnMenu};
end

% Callback for button3 -- ifilt: switch between FIR and IIR filter for agc
 function button3Callback(h,eventdata)
     ifilt=get(button3,'val');
 end

% Callback for button4 -- M: FIR filter length in samples
 function button4Callback(h,eventdata)
     M_msec=str2num(get(button4,'string'));
     if ~((M_msec >= 1 && M_msec <= 500))
        waitfor(errordlg('M_msec must be a positive integer between 1 and 500'))
        return;
     end
     M_msec=round(M_msec);
     M=M_msec*fs/1000;
     M=round(M);
 end

% Callback for button5 -- alpha: IIR filter coefficient
 function button5Callback(h,eventdata)
     alpha=str2num(get(button5,'string'));
     if ~((alpha >= 0.001 && alpha <= 0.99))
        waitfor(errordlg('alpha must be a positive number between 0.001 and 0.99'))
        return;
     end
 end

% Callback for button6 -- Run AGC
 function button6Callback(h,eventdata)
     
% check editable buttons for changes
    button3Callback(h,eventdata);
    button4Callback(h,eventdata);
    button5Callback(h,eventdata);
    
% setup for agc processing of a speech signal
    set_agc(xin,fs,ifilt,M,alpha,fname);
 end

%***********************************************************************
    function set_agc(xin,fs,ifilt,M,alpha,filename)
%
% perform agc on speech waveform using either first order IIR filter
% (H(z)=(1-alpha) z^{-1}/(1-alpha z^{-1}), or FIR rectangular window of
% varying length

% Inputs:
%   xin: speech array
%   fs: sampling rate of speech
%   ifilt: FIR (ifilt=1) or IIR (ifilt=2) choice of filter
%   M: FIR filter length in samples
%   alpha: IIR filter coefficient for first order filter
%   filename: speech filename
    
% select entire signal region for analysis (from sample ss=1 to 
% sample es=length(xin))
    ss=1;
    es=length(xin);
    nsamp=es;
    x=xin(ss:es);
    xmax=max(abs(x));
    
% calculate and subtract out the mean of x; store signal as xsq
    xm=sum(x)/length(x);
    x=(x-xm)/32767;
    xmax=max(abs(x));
    xsq=x.^2;
    
% set up numerator (b) and denominator (a) polynomials of FIR (ifilt=1)
% or IIR filter (ifilt=2), 
    if (ifilt == 1)
        b=ones(1,M)/M;
        a=1;
    else
        b=[0 1-alpha];
        a=[1, -alpha];
    end

% filter xsq using filter set up in previous step to give sigmasq
    sigmasq=filter(b,a,xsq)';
    
% compute sigma as square root of sigmasq
    sigmax=sqrt(sigmasq);
    smax=max(sigmax);
    smin=min(sigmax);
% fprintf('smin:%6.2f, smax:%6.2f \n',smin,smax);

% plot results 
% first plot will show speech waveform with estimate of sigma overlaid
% on top of waveform plot

    if (ifilt == 1)
        stitle=sprintf(' file: %s, M: %d ',filename,M);
    else
        stitle=sprintf(' file: %s, alpha: %4.2f ',...
            filename,alpha);
    end
    
% clear graphics Panel 2
        reset(graphicPanel2);
        axes(graphicPanel2);
        cla;
    
% plot original speech signal, and reciprocal of gain for agc in
% graphics Panel 2
    xa=(ss:es)/fs;
    stringx=['Time in Seconds, fs=',num2str(fs),' samples/second'];
    plot(xa,x(ss:es),'b','LineWidth',2),hold on;
    plot(xa,sigmax(ss:es),'g','LineWidth',2); axis tight; grid on;
    xlabel(stringx),ylabel('Signal Amplitude');
    legend('original speech signal','reciprocal of gain for agc');

% restrict range of sigmax to sigmamin <= sigmax <= sigmamax (where
% sigmamax=iratio * sigmamin)
    iratio=20;
    sigmaxmax=max(sigmax);
    sigmaxmin=sigmaxmax/iratio;
% fprintf('sigmaxmin:%6.2f, sigmaxmax:%6.2f \n',sigmaxmin,sigmaxmax);
    sigmax(find(sigmax < sigmaxmin))=sigmaxmin;
    sigmax(find(sigmax > sigmaxmax))=sigmaxmax;
    
% scale input using restricted range of sigmax
    xscale=x./sigmax';
    
% clear graphics Panel 1
        reset(graphicPanel1);
        axes(graphicPanel1);
        cla;
        
% plot gain scaled input signal in graphics Panel 1
    plot(xa,xscale(ss:es),'r','LineWidth',2);
    xlabel(stringx),ylabel('Scaled Signal Amplitude');
    axis tight; grid on;legend('scaled input signal');
    
% display fname and agc parameter in titleBox1
        stitle1=strcat('AGC -- ',stitle);
        set(titleBox1,'string',stitle1);
        set(titleBox1,'FontSize',20);
    end

% Callback for button7 -- play Original Speech File
 function button7Callback(h,eventdata)
     soundsc(x,fs);
 end

% Callback for button8 -- play level adjusted Speech File
 function button8Callback(h,eventdata)
     soundsc(xscale,fs);
 end

% Callback for button9 -- Close GUI
 function button9Callback(h,eventdata)
     close(gcf);
 end
end

Contact us