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

📄 analyze_duc_dds.m

📁 This is GMS down upper converter and down converter in simulink. you may understand the structure in
💻 M
字号:
function [ dds_chan ] = analyze_duc_dds(dds_out,dds_start,carriers,fs_dds,dds_bits,tolerance,ShowPlots)
% ANALYZE_DUC_DDS   Takes the captured DDS output signal and turns it into a
% complex sinusoid array with a column per carrier.  The function strips of
% leading zeros and the repeated first sample, in order to match to a
% general sinusoid as modelled by Matlab.

%% Parameters
%dds_start = min(find(dds_out(:,3)==0));
channels = length(carriers);      % Number of channels to split

%% Chop preceding zeroes and tail
dds_temp = dds_out(dds_start-4*channels:size(dds_out,1)-2,1)+j*dds_out(dds_start-4*channels:size(dds_out,1)-2,2);
clear dds_out;

%% Split DDS output into channels and analyze
dds_chan = zeros(ceil(length(dds_temp)/channels),channels);
dds_temp = [ dds_temp ; zeros(numel(dds_chan)-length(dds_temp),1) ];
for ii=1:channels
    dds_chan(:,ii) = dds_temp(ii:channels:end);
end
clear dds_temp;
% Last row may contain filler zeros
dds_chan = dds_chan(1:end-1,:);   % Drop end row
if ShowPlots>=4
    for ii=1:channels
        sinusoid = gen_duc_sinusoid(carriers(ii),fs_dds,size(dds_chan,1),dds_bits);
        figure; plot(real(sinusoid(1:size(dds_chan,1))));
        hold on; plot(real(dds_chan(:,ii)),'r:'); hold off;
        figure; plot(imag(sinusoid(1:size(dds_chan,1))));
        hold on; plot(imag(dds_chan(:,ii)),'r:'); hold off;
    end
end

if ShowPlots>=2
    figure; hold on;
    for ii=1:channels
        sinusoid = gen_duc_sinusoid(carriers(ii),fs_dds,size(dds_chan,1),dds_bits);
        sin_fft = fftshift(fft(sinusoid));
        sin_fft = sin_fft/max(abs(sin_fft));
        ff=1:length(sin_fft);
        ff=ff*fs_dds/length(sin_fft)-fs_dds/2;
        ff=ff/1e6;
        plot(ff,20*log10(abs(sin_fft)));
        dds_fft = fftshift(fft(dds_chan(:,ii)));
        dds_fft = dds_fft/max(abs(dds_fft));
        plot(ff,20*log10(abs(dds_fft)),'r:');
        title(sprintf('Ideal vs DDS Power Spectral Density'));
        xlabel('Frequency (MHz)');
        ylabel('Relative Power (dB/Hz)');
        grid on;
        axis([-3 3 -140 2]);
    end
    hold off;
end

%% Check samples match

for ch=1:4
    sinusoid = gen_duc_sinusoid(carriers(ch),fs_dds,size(dds_chan,1),dds_bits);
    if max(abs(abs(sinusoid)-abs(dds_chan(:,ch)))) > tolerance
        display(sprintf('CARRIER %d: DDS output and ideal sinusoid differ by more than the specified tolerance level of %g [Samples=%d]',ch,tolerance,size(dds_chan(1:end,1),1)));
    else
        display(sprintf('CARRIER %d: DDS output and ideal sinusoid match within specified tolerance level of %g [Samples=%d]',ch,tolerance,size(dds_chan(1:end,1),1)));
    end
end

% failed=0;
% for ch=1:4
%     i_mismatches = 0; q_mismatches = 0;
%     display(sprintf('Checking Carrier sinusoid %d to tolerance of %g',ch,tolerance));
%     for ii=1:size(dds_chan(1:end,1),1)
%         if abs(real(sinusoid(ii,ch)) - real(dds_chan(ii,ch))) > tolerance
%             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 abs(imag(sinusoid(ii,ch)) - imag(dds_chan(ii,ch))) > tolerance
%             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 DDS does not match Matlab model sinusoids!');
% else
%     display(sprintf('Matched DDS output to Matlab model sinusoids! [Samples=%d]',size(dds_chan(1:end,1),1)));
% end

⌨️ 快捷键说明

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