Code covered by the BSD License  

Highlights from
MATLAB GUI Example for Agilent N8241A Arbitrary Waveform Generator

image thumbnail
genWaveForms
function f = genWaveForms

f.genSinusoid = @genSinusoid;
f.genSquareWave = @genSquareWave;
f.genChirp = @genChirp;
f.genSineNComponents = @genSineNComponents;
f.amplitudeModulation = @amplitudeModulation;

% the AWG doesn't work if the data are at exactly -1 or +1
scaleFactor = 0.8; 
% the AWG requires the waveform length to be a multiple of 8
sampleGranularity = 8;

%%  
    function out = genSinusoid(Fs, frequency, nCycles)
        [frequency,durationSec,t] = checkFreq(Fs, frequency, nCycles);
        out = scaleFactor * cos(2*pi*frequency*t);
    end       

%%  
    function out = genSquareWave(Fs, frequency, nCycles, dutyCycle)
        [frequency,durationSec,t] = checkFreq(Fs, frequency, nCycles);
        out = scaleFactor * square(2*pi*frequency*t, dutyCycle);
    end

%%
    function out = genChirp(Fs, fstart, fend, durationSec)
      t = ( 0:(1/Fs):durationSec-(1/Fs) );
      tlen = floor(length(t)/sampleGranularity) * sampleGranularity;
      t = t(1:tlen);      
      out = scaleFactor * chirp(t, fstart, t(end), fend, 'linear');
    end

%% 
    function out = genSineNComponents(Fs, frequency, nCycles, amplitudeList, phaseList)
        nComponents = length(amplitudeList);
        freqList = [1:nComponents] * frequency;        
        [freqLists,durationSec,t] = checkFreq(Fs, freqList, nCycles);
        out = zeros(size(t));
        for i=1:length(freqList)
            out = out + amplitudeList(i) * cos(2*pi*freqList(i)*t + phaseList(i));
        end
        out = scaleFactor * out / max(abs(out));
    end

%%
    function out= amplitudeModulation(Fs, carrierfreq, nCycles)
        basebandFreq = Fs/1e4;
        freqList = [basebandFreq carrierfreq];
        [freqLists,durationSec,t] = checkFreq(Fs, freqList, nCycles);
        out = cos(2*pi*freqList(1)*t) .* cos(2*pi*freqList(2)*t);
        out = scaleFactor * out / max(abs(out));
    end
%% ------------------------------------------------------
    function [freqList,durationSec,t] = checkFreq(Fs, freqList, nCycles)
        if any(freqList > Fs*0.4),
            warning('Frequency near Nyquist limit, clipping the value');
            freqList(freqList > Fs*0.4) = Fs*0.4;
        end
        period = 1/min(freqList);
        durationSec = period * nCycles;
        t = ( 0:(1/Fs):durationSec-(1/Fs) );
        tlen = floor(length(t)/sampleGranularity) * sampleGranularity;
        t = t(1:tlen);
    end


end

Contact us at files@mathworks.com