www.gusucode.com > rf 工具箱matlab源码程序 > rf/+rfckt/@mixer/addmixspur.m

    function spurdata = addmixspur(h, spurdata, zl, zs, z0, cktindex)
%ADDMIXSPUR Add mixer spurs.
%   SPURDATA = ADDMIXSPUR(H, SPURDATA, ZL, ZS, Z0, CKTINDEX) adds the spurs
%   generated by mixer spur table.
%
%   See also RFCKT.MIXER

%   Copyright 2003-2007 The MathWorks, Inc.

narginchk(6,6);

% Calculate new spurs
if isa(h.MixerSpurData, 'rfdata.mixerspur')
    psignal = spurdata.Pin;
    frf = spurdata.Freq{cktindex+1-1}(1);
    flo = h.FLO;
    table = h.MixerSpurData.Data;
    [N, M] = size(h.MixerSpurData.Data);
    nfreq = length(spurdata.Freq{cktindex+1});
    nspur = 0;
    if spurdata.TotalNMixers == 1
        for n1=1:N
            n = n1-1;
            for m1=1:M
                m = m1-1;
                if ((n+m)<=min(N,M)) && (table(n1,m1) < 99)
                    pspur = psignal - table(n1,m1);
                    if (n==1) && (m==1)
                        if strcmpi(h.MixerType,'Downconverter')
                            fspur = frf + flo;
                            idxspur = 'Spur: FRF+FLO';
                        else
                            fspur = abs(frf - flo);
                            idxspur = 'Spur: |FRF-FLO|';
                        end
                        nspur = nspur + 1;
                        spurdata.Pout{cktindex+1}(nfreq+nspur, 1) = pspur;
                        spurdata.Freq{cktindex+1}(nfreq+nspur, 1) = fspur;
                        spurdata.Indexes{cktindex+1}{nfreq+nspur, 1} = idxspur;
                        spurdata.Pin(nspur, 1) = pspur;
                        spurdata.Fin(nspur, 1) = fspur;
                        spurdata.Idxin{nspur, 1} = idxspur;
                    else
                        fspur = abs(n*frf - m*flo);
                        if m == 0
                            idxspur = sprintf('Spur: %dFRF', n);
                        elseif n == 0
                            idxspur = sprintf('Spur: %dFLO', m);
                        elseif m == 1
                            idxspur = sprintf('Spur: |%dFRF-FLO|', n);
                        elseif n == 1
                            idxspur = sprintf('Spur: |FRF-%dFLO|', m);
                        else
                            idxspur = sprintf('Spur: |%dFRF-%dFLO|', n, m);
                        end
                        nspur = nspur + 1;
                        spurdata.Pout{cktindex+1}(nfreq+nspur, 1) = pspur;
                        spurdata.Freq{cktindex+1}(nfreq+nspur, 1) = fspur;
                        spurdata.Indexes{cktindex+1}{nfreq+nspur, 1} = idxspur;
                        spurdata.Pin(nspur, 1) = pspur;
                        spurdata.Fin(nspur, 1) = fspur;
                        spurdata.Idxin{nspur, 1} = idxspur;
                        if ~(n==0) && ~(m==0)
                            fspur = n*frf + m*flo;
                            if m == 1
                                idxspur = sprintf('Spur: %dFRF+FLO', n);
                            elseif n == 1
                                idxspur = sprintf('Spur: FRF+%dFLO', m);
                            else
                                idxspur = sprintf('Spur: %dFRF+%dFLO', n, m);
                            end
                            nspur = nspur + 1;
                            spurdata.Pout{cktindex+1}(nfreq+nspur, 1) = pspur;
                            spurdata.Freq{cktindex+1}(nfreq+nspur, 1) = fspur;
                            spurdata.Indexes{cktindex+1}{nfreq+nspur, 1} = idxspur;
                            spurdata.Pin(nspur, 1) = pspur;
                            spurdata.Fin(nspur, 1) = fspur;
                            spurdata.Idxin{nspur, 1} = idxspur;
                        end
                    end
                end
            end
        end
    else
        for n1=1:N
            n = n1-1;
            for m1=1:M
                m = m1-1;
                if ((n+m)<=min(N,M)) && (table(n1,m1) < 99)
                    pspur = psignal - table(n1,m1);
                    if (n==1) && (m==1)
                        if strcmpi(h.MixerType,'Downconverter')
                            fspur = frf + flo;
                            idxspur = sprintf('Spur by mixer_%d: FRF+FLO', spurdata.NMixers);
                        else
                            fspur = abs(frf - flo);
                            idxspur = sprintf('Spur by mixer_%d: |FRF-FLO|', spurdata.NMixers);
                        end
                        nspur = nspur + 1;
                        spurdata.Pout{cktindex+1}(nfreq+nspur, 1) = pspur;
                        spurdata.Freq{cktindex+1}(nfreq+nspur, 1) = fspur;
                        spurdata.Indexes{cktindex+1}{nfreq+nspur, 1} = idxspur;
                        spurdata.Pin(nspur, 1) = pspur;
                        spurdata.Fin(nspur, 1) = fspur;
                        spurdata.Idxin{nspur, 1} = idxspur;
                    else
                        fspur = abs(n*frf - m*flo);
                        if m == 0
                            idxspur = sprintf('Spur by mixer_%d: %dFRF', spurdata.NMixers, n);
                        elseif n == 0
                            idxspur = sprintf('Spur by mixer_%d: %dFLO', spurdata.NMixers, m);
                        elseif m == 1
                            idxspur = sprintf('Spur by mixer_%d: |%dFRF-FLO|', spurdata.NMixers, n);
                        elseif n == 1
                            idxspur = sprintf('Spur by mixer_%d: |FRF-%dFLO|', spurdata.NMixers, m);
                        else
                            idxspur = sprintf('Spur by mixer_%d: |%dFRF-%dFLO|', spurdata.NMixers, n, m);
                        end
                        nspur = nspur + 1;
                        spurdata.Pout{cktindex+1}(nfreq+nspur, 1) = pspur;
                        spurdata.Freq{cktindex+1}(nfreq+nspur, 1) = fspur;
                        spurdata.Indexes{cktindex+1}{nfreq+nspur, 1} = idxspur;
                        spurdata.Pin(nspur, 1) = pspur;
                        spurdata.Fin(nspur, 1) = fspur;
                        spurdata.Idxin{nspur, 1} = idxspur;
                        if ~(n==0) && ~(m==0)
                            fspur = n*frf + m*flo;
                            if m == 1
                                idxspur = sprintf('Spur by mixer_%d: %dFRF+FLO', spurdata.NMixers, n);
                            elseif n == 1
                                idxspur = sprintf('Spur by mixer_%d: FRF+%dFLO', spurdata.NMixers, m);
                            else
                                idxspur = sprintf('Spur by mixer_%d: %dFRF+%dFLO', spurdata.NMixers, n, m);
                            end
                            nspur = nspur + 1;
                            spurdata.Pout{cktindex+1}(nfreq+nspur, 1) = pspur;
                            spurdata.Freq{cktindex+1}(nfreq+nspur, 1) = fspur;
                            spurdata.Indexes{cktindex+1}{nfreq+nspur, 1} = idxspur;
                            spurdata.Pin(nspur, 1) = pspur;
                            spurdata.Fin(nspur, 1) = fspur;
                            spurdata.Idxin{nspur, 1} = idxspur;
                        end
                    end
                end
            end
        end
    end
end