gusucode.com > wlan工具箱matlab源码程序 > wlan/wlanexamples/helperSpectralMaskTest.m

    function helperSpectralMaskTest(x, fs, osr, varargin)
%helperSpectralMaskTest Featured example helper function
%   Plots the power spectral density (PSD) and overlays WLAN PSD limits to
%   check if spectral emissions are within specified levels.

%   Copyright 2015-2016 The MathWorks, Inc.

narginchk(3,5);

cbwMHz = fs/1e6;    % Channel bandwidth in MHz
if nargin>3
    % Must be same size vectors
    dBrLimits = varargin{1};
    fLimits = varargin{2};
else % Default
    %  From IEEE Std 802.11ac-2013 Section 22.3.18.1
    dBrLimits = [-40 -40 -28 -20 0 0 -20 -28 -40 -40];
    fLimits = [-Inf -1.5*cbwMHz -cbwMHz -(cbwMHz/2+1) -(cbwMHz/2-1) ...
        (cbwMHz/2-1) (cbwMHz/2+1) cbwMHz 1.5*cbwMHz Inf];
end
rbw = 100e3;        % Resolution bandwidth
vbw = 30e3;         % Video bandwidth
N = floor(rbw/vbw); % number of spectral averages
spectrumAnalyzer = cell(size(x,2),1); % Spectrum analyzer per antenna
for txIdx = 1:size(x,2)
    % Construct dsp.SpectrumAnalyzer and set SpectralMask property
    spectrumAnalyzer{txIdx} = dsp.SpectrumAnalyzer('SampleRate',fs*osr, ...
        'SpectrumType','Power density','PowerUnits','dBm', ...
        'SpectralAverages',N,'RBWSource','Property','RBW',rbw, ...
        'ReducePlotRate',false,'ShowLegend',true, ...
        'Name',sprintf('Spectrum Analyzer, Transmit Antenna %d',txIdx), ...
        'ChannelNames',{sprintf('Transmit Antenna %d',txIdx)});
    spectrumAnalyzer{txIdx}.SpectralMask.EnabledMasks = 'Upper';
    spectrumAnalyzer{txIdx}.SpectralMask.ReferenceLevel = 'Spectrum peak';
    spectrumAnalyzer{txIdx}.SpectralMask.UpperMask = [fLimits*1e6; dBrLimits].'; % fLimits must be in Hz.
    specVisual = spectrumAnalyzer{txIdx}.getFramework.Visual;
    
    % Get the number of segments to process
    setup(spectrumAnalyzer{txIdx},x(1,1));
    segLen = spectrumAnalyzer{txIdx}.getFramework.Visual.SpectrumObject.getInputSamplesPerUpdate(true);
    numSegments = floor(size(x,1)/segLen);
    
    % Process each segment and test the PSD against the mask
    for idx = 1:numSegments
        spectrumAnalyzer{txIdx}(x((idx-1)*segLen+(1:segLen),txIdx));
        [freqVector, psd] = getAllData(specVisual, 1);
        if idx == 1
            maskLineObj = findobj(specVisual.Axes,'Tag','SpectralMaskLine_Upper');
        end
        maskFreqVector = get(maskLineObj, 'XData');
        maskPowerVector = get(maskLineObj, 'YData');
        finiteMaskFreqVector = maskFreqVector(isfinite(maskFreqVector));
        finiteMaskPowerVector = maskPowerVector(isfinite(maskFreqVector));
        maskPowerLimitBins = interp1(finiteMaskFreqVector, finiteMaskPowerVector, freqVector);
        if any(psd > maskPowerLimitBins)
            disp('   Spectrum mask failed');
            releaseAnaylzers(spectrumAnalyzer);
            assignin('caller', 'spectrumAnalyzer', spectrumAnalyzer);
            return; % Do not update any more
        end
    end
end
disp('   Spectrum mask passed');
releaseAnaylzers(spectrumAnalyzer);
assignin('caller', 'spectrumAnalyzer', spectrumAnalyzer);
end

function releaseAnaylzers(spectrumAnalyzer)
    for i = 1:numel(spectrumAnalyzer)
        release(spectrumAnalyzer{i});
    end
end