📄 analyze_duc_dds.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 + -