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

📄 analyze_duc.m

📁 This is GMS down upper converter and down converter in simulink. you may understand the structure in
💻 M
📖 第 1 页 / 共 2 页
字号:
        clear cic_i_dout cic_q_dout cic_i_chan cic_q_chan ycic_duc;
    end
end
%% Clear variables
clear failed ch i_mismatches q_mismatches;

%% Analyze CIC scaled sample output
if exist('cic_i_scaled_dout')
    load results/ycic_duc_norm.mat
    %cic_start = min(find(cic_i_vout>0));
    cic_start = 693;   % From analyzing cic_vout

    %% Chop preceding zeroes and tail
    cic_i_scaled_temp = cic_i_scaled_dout(cic_start:end-2);
    cic_q_scaled_temp = cic_q_scaled_dout(cic_start:end-2);

    %% Adjust for rate change and clock oversampling
    cic_i_scaled_temp2 = [];
    cic_q_scaled_temp2 = [];
    for ii=1:m_cic*clk_os:size(cic_i_scaled_temp)-m_cic*n_carr
        %display(sprintf('Index %d',ii));
        cic_i_scaled_temp2 = [ cic_i_scaled_temp2; cic_i_scaled_temp(ii:ii+m_cic*n_carr-1) ];
        cic_q_scaled_temp2 = [ cic_q_scaled_temp2; cic_q_scaled_temp(ii:ii+m_cic*n_carr-1) ];
    end
    clear cic_i_scaled_temp cic_q_scaled_temp;

    %% Split CIC dout into channels and analyze
    cic_i_scaled_chan = zeros(ceil(length(cic_i_scaled_temp2)/n_carr),n_carr);
    cic_q_scaled_chan = zeros(ceil(length(cic_q_scaled_temp2)/n_carr),n_carr);
    cic_i_scaled_temp2 = [ cic_i_scaled_temp2 ; zeros(numel(cic_i_scaled_chan)-length(cic_i_scaled_temp2),1) ];
    cic_q_scaled_temp2 = [ cic_q_scaled_temp2 ; zeros(numel(cic_q_scaled_chan)-length(cic_q_scaled_temp2),1) ];
    for ii=1:n_carr
        cic_i_scaled_chan(:,ii) = cic_i_scaled_temp2(ii:n_carr:end);
        cic_q_scaled_chan(:,ii) = cic_q_scaled_temp2(ii:n_carr:end);
    end
    clear cic_i_scaled_temp2 cic_q_scaled_temp2;
    cic_i_scaled_chan = cic_i_scaled_chan(1:end-1,:);   % Drop end row, may hold filler zeros
    cic_q_scaled_chan = cic_q_scaled_chan(1:end-1,:);   % Drop end row, may hold filler zeros

    % Trim leading zeros from Matlab model output
    ycic_duc_norm_x = ycic_duc_norm(5:5+size(cic_i_scaled_chan(1:end,ii),1),:);

    if ShowPlots>=0
        for ii=1:n_carr
            figure; plot(real(ycic_duc_norm_x(1:size(cic_i_scaled_chan(1:end,ii),1),ii)));
            hold on; plot(cic_i_scaled_chan(1:end,ii),'r:'); hold off;
            figure; plot(imag(ycic_duc_norm_x(1:size(cic_q_scaled_chan(1:end,ii),1),ii)));
            hold on; plot(cic_q_scaled_chan(1:end,ii),'r:'); hold off;
        end
    end

    %% Check samples match
    failed=0;
    for ch=1:n_carr
        i_mismatches = 0; q_mismatches = 0;
        display(sprintf('Checking Carrier %d',ch));
        %for ii=1:size(cic_i_scaled_temp,1)
        for ii=1:size(cic_i_scaled_chan(1:end,1),1)
            if real(ycic_duc_norm_x(ii,ch)) ~= cic_i_scaled_chan(ii,ch)
                if (i_mismatches+q_mismatches)<50
                    display(sprintf('I value mismatch on Channel %d at position %d',ch,ii));
                end
                i_mismatches = i_mismatches+1;
            end
            if imag(ycic_duc_norm_x(ii,ch)) ~= cic_q_scaled_chan(ii,ch)
                if (i_mismatches+q_mismatches)<50
                    display(sprintf('Q value mismatch on Channel %d at position %d',ch,ii));
                end
                q_mismatches = q_mismatches+1;
            end
        end
        display(sprintf('Carrier %d: I mismatches = %d',ch,i_mismatches));
        display(sprintf('Carrier %d: Q mismatches = %d',ch,q_mismatches));
        display(sprintf('Carrier %d: Total mismatches = %d',ch,i_mismatches+q_mismatches));
        if (i_mismatches+q_mismatches)>0
            failed=1;
        end
    end
    clear ycic_duc_norm_x;
    if failed==1
        error('Output from CIC does not match Matlab model CIC output!')
    else
        display(sprintf('Matched CIC scaled output to Matlab model normalized CIC output! [Samples=%d]',size(cic_i_scaled_chan,1)))
    end
end
%% Clear variables
clear cic_i_scaled_dout cic_q_scaled_dout ycic_duc_norm;
clear failed ch i_mismatches q_mismatches;

%% Analyze Mixer input
if exist('mixer_din')
    mixer_din_start = min(find(mixer_din(:,3)>0));
    %mixer_din_start = 697;   % From analyzing mixer_din(:,3)

    %% Chop preceding zeroes and tail
    mixer_din_temp = (mixer_din(mixer_din_start:end-2,1)+j*mixer_din(mixer_din_start:end-2,2));

    %% Split CIC dout into channels and analyze
    mixer_din_chan = zeros(ceil(length(mixer_din_temp)/n_carr),n_carr);
    mixer_din_temp = [ mixer_din_temp ; zeros(numel(mixer_din_chan)-length(mixer_din_temp),1) ];
    for ii=1:n_carr
        mixer_din_chan(:,ii) = mixer_din_temp(ii:n_carr:end);
    end
    clear mixer_din_temp;
    mixer_din_chan = mixer_din_chan(1:end-1,:);   % Drop end row, may hold filler zeros

    if ShowPlots>=0
        for ii=1:n_carr
            figure;  plot(cic_i_scaled_chan(:,ii));
            hold on; plot(real(mixer_din_chan(1:size(cic_i_scaled_chan,1),ii)),'r:'); hold off;
            figure;  plot(cic_q_scaled_chan(:,ii));
            hold on; plot(imag(mixer_din_chan(1:size(cic_q_scaled_chan,1),ii)),'r:'); hold off;
        end
    end

    %% Check samples match
    failed=0;
    for ch=1:n_carr
        i_mismatches = 0; q_mismatches = 0;
        display(sprintf('Checking Carrier %d',ch));
        for ii=1:size(cic_i_scaled_chan(1:end,1),1)
            if cic_i_scaled_chan(ii,ch) ~= real(mixer_din_chan(ii,ch))
                if (i_mismatches+q_mismatches)<50
                    display(sprintf('I value mismatch on Channel %d at position %d',ch,ii));
                end
                i_mismatches = i_mismatches+1;
            end
            if cic_q_scaled_chan(ii,ch) ~= imag(mixer_din_chan(ii,ch))
                if (i_mismatches+q_mismatches)<50
                    display(sprintf('Q value mismatch on Channel %d at position %d',ch,ii));
                end
                q_mismatches = q_mismatches+1;
            end
        end
        display(sprintf('Carrier %d: I mismatches = %d',ch,i_mismatches));
        display(sprintf('Carrier %d: Q mismatches = %d',ch,q_mismatches));
        display(sprintf('Carrier %d: Total mismatches = %d',ch,i_mismatches+q_mismatches));
        if (i_mismatches+q_mismatches)>0
            failed=1;
        end
    end
    if failed==1
        error('Input to mixer does not match scaled output from CIC!')
    else
        display(sprintf('Matched mixer input to CIC scaled output! [Samples=%d]',size(mixer_din,1)))
    end
end
%% Clear variables
clear mixer_din mixer_din_chan;
clear failed ch i_mismatches q_mismatches;

%% Analyze DDS against model sinusoid
if exist('dds_sg')
    load results/sinusoid.mat
    dds_sg_start = 697;   % From analyzing dds_sg(:,3)
    sinusoid_start = 5;   % From analyzing dds_sg(:,3)

    chk_length=min((size(dds_sg,1)-dds_sg_start)/n_carr-n_carr,size(sinusoid,1)-1);
    dds_compare_i=zeros(chk_length,n_carr);
    dds_compare_q=zeros(chk_length,n_carr);
    for ii=1:n_carr
        dds_compare_i(:,ii)=dds_sg(dds_sg_start+ii-1:n_carr:dds_sg_start+ii-1+n_carr*chk_length-1,1)==real(sinusoid(sinusoid_start:sinusoid_start+chk_length-1,ii));
        dds_compare_q(:,ii)=dds_sg(dds_sg_start+ii-1:n_carr:dds_sg_start+ii-1+n_carr*chk_length-1,2)==imag(sinusoid(sinusoid_start:sinusoid_start+chk_length-1,ii));
    end

    if ShowPlots>=0
        for ii=1:n_carr
            figure;  plot(dds_sg(dds_sg_start+ii-1:n_carr:dds_sg_start+ii-1+n_carr*chk_length-1,1));
            hold on; plot(real(sinusoid(sinusoid_start:sinusoid_start+chk_length-1,ii)),'r:'); hold off;
            figure;  plot(dds_sg(dds_sg_start+ii-1:n_carr:dds_sg_start+ii-1+n_carr*chk_length-1,2));
            hold on; plot(imag(sinusoid(sinusoid_start:sinusoid_start+chk_length-1,ii)),'r:'); hold off;
        end
    end

    if size(find(dds_compare_i==0),1)>0 || size(find(dds_compare_i==0),1)>0 
        error('DDS output does not match Matlab model sinusoid!')
    else
        display(sprintf('Matched DDS output to Matlab model sinusoid! [Samples=%d]',size(dds_sg,1)))
    end
end
%% Clear variables
clear sinusoid dds_sg;
clear dds_compare_i dds_compare_q failed ch i_mismatches q_mismatches;

%% Analyze mixer output
if exist('mixed_sg')
    load results/upmixed.mat
    mixed_sg_start = min(find(mixed_sg(:,3)>0));
    %mixed_sg_start = 701;   % From analyzing mixed_sg(:,3)
    upmixed_start=5;

    %% Chop preceding zeroes and tail, and de-integerize
    mixed_sg_temp = (mixed(mixed_start:end-2,1)+j*mixed(mixed_start:end-2,2))*2^-41;

    %% Split CIC dout into channels and analyze
    mixed_sg_chan = zeros(ceil(length(mixed_sg_temp)/n_carr),n_carr);
    mixed_sg_temp = [ mixed_sg_temp ; zeros(numel(mixed_sg_chan)-length(mixed_sg_temp),1) ];
    for ii=1:n_carr
        mixed_sg_chan(:,ii) = mixed_sg_temp(ii:n_carr:end);
    end
    clear mixed_sg_temp;
    mixed_sg_chan = mixed_sg_chan(1:end-1,:);   % Drop end row, may hold filler zeros

    if ShowPlots>=0
        for ii=1:n_carr
            figure;  plot(real(upmixed(upmixed_start:upmixed_start-1+size(mixed_sg_chan(1:end,ii),1),ii)));
            hold on; plot(real(mixed_sg_chan(:,ii)),'r:'); hold off;
            figure;  plot(imag(upmixed(upmixed_start:upmixed_start-1+size(mixed_sg_chan(1:end,ii),1),ii)));
            hold on; plot(imag(mixed_sg_chan(:,ii)),'r:'); hold off;
        end
    end

    %% Check samples match
    failed=0;
    for ch=1:n_carr
        i_mismatches = 0; q_mismatches = 0;
        display(sprintf('Checking Carrier %d',ch));
        %for ii=1:size(cic_i_scaled_temp,1)
        for ii=1:size(mixed_sg_chan,1)
            if real(upmixed(ii+upmixed_start-1,ch)) ~= real(mixed_sg_chan(ii,ch))
                if (i_mismatches+q_mismatches)<50
                    display(sprintf('I value mismatch on Channel %d at position %d',ch,ii));
                end
                i_mismatches = i_mismatches+1;
            end
            if imag(upmixed(ii+upmixed_start-1,ch)) ~= imag(mixed_sg_chan(ii,ch))
                if (i_mismatches+q_mismatches)<50
                    display(sprintf('Q value mismatch on Channel %d at position %d',ch,ii));
                end
                q_mismatches = q_mismatches+1;
            end
        end
        display(sprintf('Carrier %d: I mismatches = %d',ch,i_mismatches));
        display(sprintf('Carrier %d: Q mismatches = %d',ch,q_mismatches));
        display(sprintf('Carrier %d: Total mismatches = %d',ch,i_mismatches+q_mismatches));
        if (i_mismatches+q_mismatches)>0
            failed=1;
        end
    end
    if failed==1
        error('Output from mixer does not match Matlab model mixer output!')
    else
        display(sprintf('Matched mixer output to Matlab model mixer output! [Samples=%d]',size(mixed,1)))
    end
end
%% Clear variables
clear mixed mixed_sg_chan upmixed;
clear failed ch i_mismatches q_mismatches;

%% Analyze multi-carrier summation output
if exist('mc_mixed_i')
    load results/mc_upmixed.mat
    %mc_mixed_start = min(find(mc_mixed_vout>0));
    mc_mixed_start = 178;   % From analyzing mc_mixed_vout
    mc_upmixed_start=5;     % First 4 outputs from CIC are zero

    %% Chop preceding zeroes and tail
    mc_mixed_i_temp = mc_mixed_i(mc_mixed_start:1:end-2);
    mc_mixed_q_temp = mc_mixed_q(mc_mixed_start:1:end-2);

    if ShowPlots>=0
        figure; plot(real(mc_upmixed(mc_upmixed_start:mc_upmixed_start-1+size(mc_mixed_i_temp,1))));
        hold on; plot(mc_mixed_i_temp,'r:'); hold off;
        figure; plot(imag(mc_upmixed(mc_upmixed_start:mc_upmixed_start-1+size(mc_mixed_q_temp,1))));
        hold on; plot(mc_mixed_q_temp,'r:'); hold off;
    end

    if ShowPlots>=1
        %spec=spectrum.welch('Hamming',spec_win*m_pfir*m_cfir*m_cic,50);
        spec=spectrum.burg(512);
        sg_mc_mixed_psd = psd(spec,mc_mixed_i_temp+j*mc_mixed_q_temp,'Fs',fs_cic,'Centerdc',true);
        figure;
        plot(sg_mc_mixed_psd.Frequencies/1e6,10.*log10(sg_mc_mixed_psd.Data/max(sg_mc_mixed_psd.Data)));
        title('Multi-Channel Power Spectral Density of Sysgen Implementation');
        xlabel('Frequency (MHz)');
        ylabel('Relative Power (dB/Hz)');
        grid on;
        hold on; plot_mcgsm_tx_mask(fs_cic/1e6,'MHz',carriers.'/1e6); hold off;
        axis([-3 3 -100 0]);
        
        sg_mc_mixed_fft=fftshift(fft(mc_mixed_i_temp+j*mc_mixed_q_temp));
        ff=1:length(sg_mc_mixed_fft);
        ff=ff*fs_dds/length(sg_mc_mixed_fft)-fs_dds/2;
        ff=ff/1e6;
        figure; plot(ff, 20*log10( abs( sg_mc_mixed_fft / max(abs(sg_mc_mixed_fft)) ) ) );
        title('Multi-Channel Power Spectral Density of Sysgen Implementation');
        xlabel('Frequency (MHz)');
        ylabel('Relative Power (dB/Hz)');
        grid on;
        hold on; plot_mcgsm_tx_mask(fs_cic/1e6,'MHz',carriers.'/1e6); hold off;
        axis([-3 3 -100 0]);
    end

    %% Check samples match
    i_mismatches = 0; q_mismatches = 0;
    for ii=1:size(mc_mixed_i_temp,1)
        if real(mc_upmixed(ii+mc_upmixed_start-1)) ~= mc_mixed_i_temp(ii)
            if (i_mismatches+q_mismatches)<50
                display(sprintf('I value mismatch on at position %d',ii));
            end
            i_mismatches = i_mismatches+1;
        end
        if imag(mc_upmixed(ii+mc_upmixed_start-1)) ~= mc_mixed_q_temp(ii)
            if (i_mismatches+q_mismatches)<50
                display(sprintf('Q value mismatch on at position %d',ii));
            end
            q_mismatches = q_mismatches+1;
        end
    end
    display(sprintf('Mixer: I mismatches = %d',i_mismatches));
    display(sprintf('Mixer: Q mismatches = %d',q_mismatches));
    display(sprintf('Mixer: Total mismatches = %d',i_mismatches+q_mismatches));
    if (i_mismatches+q_mismatches)>0
        error('Output from mixer does not match Matlab model output!')
    else
        display(sprintf('Matched mixer output to Matlab model output! [Samples=%d]',size(mc_mixed_i_temp,1)))
    end
end
%% Clear variables
clear mc_upmixed mc_mixed_i_dout mc_mixed_q_dout mc_mixed_i_temp mc_mixed_q_temp;
clear i_mismatches q_mismatches;
rmpath ../../model

⌨️ 快捷键说明

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