📄 analyze_ddc.m
字号:
%% Clear variables
if ClearVars, clear ycic_ddc_norm sg_ycic_tdm sg_ycic_tdm_chan failed ii ch; end
%% Analyze raw CFIR output
if exist('sg_yc_ddc_raw')
load results/yc_ddc1.mat
sg_yc1_start = min(find(sg_yc_ddc_raw(:,2)==1));
yc1_start = 2; % Trim padded zero
%% Chop preceding zeroes and tail, decimate and combine real/imag
sg_yc1_temp = [];
for ii=sg_yc1_start:2*clk_os*m_cic*m_cfir/n_ch:size(sg_yc_ddc_raw,1)-1
sg_yc1_temp = [ sg_yc1_temp ; sg_yc_ddc_raw(ii,1)+j*sg_yc_ddc_raw(ii+clk_os*m_cic*m_cfir/n_ch,1) ];
end
%% Split CIC dout into channels and analyze
sg_yc1_chan = zeros(ceil(length(sg_yc1_temp)/n_carr),n_carr);
sg_yc1_temp = [ sg_yc1_temp ; zeros(numel(sg_yc1_chan)-length(sg_yc1_temp),1) ];
for ii=1:n_carr
sg_yc1_chan(:,ii) = sg_yc1_temp(ii:n_carr:end);
end
clear sg_yc1_temp;
sg_yc1_chan = sg_yc1_chan(1:end-1,:); % Drop end row, may hold filler zeros
if ShowPlots>=0
for ii=1:n_carr
figure; plot(real(yc_ddc1(yc1_start:yc1_start-1+size(sg_yc1_chan(1:end,ii),1),ii)));
hold on; plot(real(sg_yc1_chan(:,ii)),'r:'); hold off;
figure; plot(imag(yc_ddc1(yc1_start:yc1_start-1+size(sg_yc1_chan(1:end,ii),1),ii)));
hold on; plot(imag(sg_yc1_chan(:,ii)),'r:'); hold off;
end
end
% %% Check samples match
% failed=0;
% display('CFIR RAW OUTPUT CHECK :');
% for ch=1:n_carr
% i_mismatches = 0; q_mismatches = 0;
% display(sprintf('Checking Carrier %d',ch));
% for ii=1:size(sg_yc1_chan,1)
% if real(yc_ddc1(ii+yc1_start-1,ch)) ~= real(sg_yc1_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(yc_ddc1(ii+yc1_start-1,ch)) ~= imag(sg_yc1_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('Raw output from CFIR does not match Matlab model raw CFIR output!')
% else
% display(sprintf('Matched raw CFIR output to Matlab model raw CFIR output! [Samples=%d]',size(sg_yc1_chan,1)))
% end
end
%% Clear variables
if ClearVars, clear yc_ddc1 sg_yc_ddc_raw sg_yc1_chan failed ii ch; end
%% Analyze CFIR output
if exist('sg_yc_ddc')
load results/yc_ddc.mat
sg_yc_start = min(find(sg_yc_ddc(:,2)==1));
yc_start = 2; % Trim padded zero
%% Chop preceding zeroes and tail, decimate and combine real/imag
sg_yc_temp = [];
for ii=sg_yc_start:2*clk_os*m_cic*m_cfir/n_ch:size(sg_yc_ddc,1)-clk_os*m_cic*m_cfir/n_ch
sg_yc_temp = [ sg_yc_temp ; sg_yc_ddc(ii,1)+j*sg_yc_ddc(ii+clk_os*m_cic*m_cfir/n_ch,1) ];
end
%% Split CIC dout into channels and analyze
sg_yc_chan = zeros(ceil(length(sg_yc_temp)/n_carr),n_carr);
sg_yc_temp = [ sg_yc_temp ; zeros(numel(sg_yc_chan)-length(sg_yc_temp),1) ];
for ii=1:n_carr
sg_yc_chan(:,ii) = sg_yc_temp(ii:n_carr:end);
end
clear sg_yc_temp;
sg_yc_chan = sg_yc_chan(1:end-1,:); % Drop end row, may hold filler zeros
if ShowPlots>=0
for ii=1:n_carr
figure; plot(real(yc_ddc(yc_start:yc_start-1+size(sg_yc_chan(1:end,ii),1),ii)));
hold on; plot(real(sg_yc_chan(:,ii)),'r:'); hold off;
figure; plot(imag(yc_ddc(yc_start:yc_start-1+size(sg_yc_chan(1:end,ii),1),ii)));
hold on; plot(imag(sg_yc_chan(:,ii)),'r:'); hold off;
end
end
% %% Check samples match
% failed=0;
% display('CFIR OUTPUT CHECK :');
% for ch=1:n_carr
% i_mismatches = 0; q_mismatches = 0;
% display(sprintf('Checking Carrier %d',ch));
% for ii=1:size(sg_yc_chan,1)
% if real(yc_ddc(ii+yc_start-1,ch)) ~= real(sg_yc_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(yc_ddc(ii+yc_start-1,ch)) ~= imag(sg_yc_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 CFIR does not match Matlab model CFIR output!')
% else
% display(sprintf('Matched CFIR output to Matlab model CFIR output! [Samples=%d]',size(sg_yc_chan,1)))
% end
end
%% Clear variables
if ClearVars, clear yc_ddc sg_yc_ddc sg_yc_chan failed ii ch; end
%% Analyze PFIR output
if exist('sg_yp_ddc')
load results/yp_ddc.mat
sg_yp_start = min(find(sg_yp_ddc(:,3)==1));
yp_start = 2; % Trim padded zero
%% Chop preceding zeroes and tail, decimate and combine real/imag
sg_yp_temp = [];
for ii=sg_yp_start:2*clk_os*m_cic*m_cfir*m_pfir/n_ch:size(sg_yp_ddc,1)-clk_os*m_cic*m_cfir*m_pfir/n_ch
sg_yp_temp = [ sg_yp_temp ; sg_yp_ddc(ii,1)+j*sg_yp_ddc(ii+clk_os*m_cic*m_cfir*m_pfir/n_ch,1) ];
end
%% Split CIC dout into channels and analyze
sg_yp_chan = zeros(ceil(length(sg_yp_temp)/n_carr),n_carr);
sg_yp_temp = [ sg_yp_temp ; zeros(numel(sg_yp_chan)-length(sg_yp_temp),1) ];
for ii=1:n_carr
sg_yp_chan(:,ii) = sg_yp_temp(ii:n_carr:end);
end
clear sg_yp_temp;
sg_yp_chan = sg_yp_chan(1:end-1,:); % Drop end row, may hold filler zeros
if ShowPlots>=0
for ii=1:n_carr
figure; plot(real(yp_ddc(yp_start:yp_start-1+size(sg_yp_chan(1:end,ii),1),ii)));
hold on; plot(real(sg_yp_chan(:,ii)),'r:'); hold off;
figure; plot(imag(yp_ddc(yp_start:yp_start-1+size(sg_yp_chan(1:end,ii),1),ii)));
hold on; plot(imag(sg_yp_chan(:,ii)),'r:'); hold off;
end
end
% %% Check samples match
% failed=0;
% display('PFIR OUTPUT CHECK :');
% for ch=1:n_carr
% i_mismatches = 0; q_mismatches = 0;
% display(sprintf('Checking Carrier %d',ch));
% for ii=1:size(sg_yp_chan,1)
% if real(yp_ddc(ii+yp_start-1,ch)) ~= real(sg_yp_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(yp_ddc(ii+yp_start-1,ch)) ~= imag(sg_yp_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 PFIR does not match Matlab model PFIR output!')
% else
% display(sprintf('Matched PFIR output to Matlab model PFIR output! [Samples=%d]',size(sg_yp_chan,1)))
% end
end
%% Clear variables
if ClearVars, clear yp_ddc sg_yp_ddc sg_yp_chan failed ii ch; end
%% Analyze Scaler output
if exist('sg_scaler_ddc')
load results/scaled_yp_ddc.mat
sg_scaler_start = min(find(sg_scaler_ddc(:,3)==1));
scaled_yp_start = 2; % Trim padded zero
%% Chop preceding zeroes and tail, decimate and combine real/imag
sg_scaler_temp = [];
for ii=sg_scaler_start:2:size(sg_scaler_ddc,1)-1
sg_scaler_temp = [ sg_scaler_temp ; sg_scaler_ddc(ii,1)+j*sg_scaler_ddc(ii+1,1) ];
end
%% Split CIC dout into channels and analyze
sg_scaler_chan = zeros(ceil(length(sg_scaler_temp)/n_carr),n_carr);
sg_scaler_temp = [ sg_scaler_temp ; zeros(numel(sg_scaler_chan)-length(sg_scaler_temp),1) ];
for ii=1:n_carr
sg_scaler_chan(:,ii) = sg_scaler_temp(ii:n_carr:end);
end
clear sg_scaler_temp;
sg_scaler_chan = sg_scaler_chan(1:end-1,:); % Drop end row, may hold filler zeros
if ShowPlots>=0
for ii=1:n_carr
figure; plot(real(scaled_yp_ddc(scaled_yp_start:scaled_yp_start-1+size(sg_scaler_chan(1:end,ii),1),ii)));
hold on; plot(real(sg_scaler_chan(:,ii)),'r:'); hold off;
figure; plot(imag(scaled_yp_ddc(scaled_yp_start:scaled_yp_start-1+size(sg_scaler_chan(1:end,ii),1),ii)));
hold on; plot(imag(sg_scaler_chan(:,ii)),'r:'); hold off;
end
end
% %% Check samples match
% failed=0;
% display('SCALER OUTPUT CHECK :');
% for ch=1:n_carr
% i_mismatches = 0; q_mismatches = 0;
% display(sprintf('Checking Carrier %d',ch));
% for ii=1:size(sg_scaler_chan,1)
% if real(scaled_yp_ddc(ii+scaled_yp_start-1,ch)) ~= real(sg_scaler_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(scaled_yp_ddc(ii+scaled_yp_start-1,ch)) ~= imag(sg_scaler_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 Scaler does not match Matlab model Scaler output!')
% else
% display(sprintf('Matched Scaler output to Matlab model Scaler output! [Samples=%d]',size(sg_scaler_chan,1)))
% end
end
%% Clear variables
if ClearVars, clear scaled_yp_ddc sg_scaler_ddc sg_scaler_chan failed ii ch; end
%% Analyze TDDM output
if exist('sg_scaler_ddc')
load results/scaled_yp_ddc.mat
sg_scaler_start = min(find(sg_scaler_ddc(:,3)==1));
scaled_yp_start = 2; % Trim padded zero
%% Chop preceding zeroes and tail, decimate and combine real/imag
sg_scaler_temp = [];
for ii=sg_scaler_start:2:size(sg_scaler_ddc,1)-1
sg_scaler_temp = [ sg_scaler_temp ; sg_scaler_ddc(ii,1)+j*sg_scaler_ddc(ii+1,1) ];
end
%% Split CIC dout into channels and analyze
sg_scaler_chan = zeros(ceil(length(sg_scaler_temp)/n_carr),n_carr);
sg_scaler_temp = [ sg_scaler_temp ; zeros(numel(sg_scaler_chan)-length(sg_scaler_temp),1) ];
for ii=1:n_carr
sg_scaler_chan(:,ii) = sg_scaler_temp(ii:n_carr:end);
end
clear sg_scaler_temp;
sg_scaler_chan = sg_scaler_chan(1:end-1,:); % Drop end row, may hold filler zeros
if ShowPlots>=0
for ii=1:n_carr
figure; plot(real(scaled_yp_ddc(scaled_yp_start:scaled_yp_start-1+size(sg_scaler_chan(1:end,ii),1),ii)));
hold on; plot(real(sg_scaler_chan(:,ii)),'r:'); hold off;
figure; plot(imag(scaled_yp_ddc(scaled_yp_start:scaled_yp_start-1+size(sg_scaler_chan(1:end,ii),1),ii)));
hold on; plot(imag(sg_scaler_chan(:,ii)),'r:'); hold off;
end
end
% %% Check samples match
% failed=0;
% display('SCALER OUTPUT CHECK :');
% for ch=1:n_carr
% i_mismatches = 0; q_mismatches = 0;
% display(sprintf('Checking Carrier %d',ch));
% for ii=1:size(sg_scaler_chan,1)
% if real(scaled_yp_ddc(ii+scaled_yp_start-1,ch)) ~= real(sg_scaler_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(scaled_yp_ddc(ii+scaled_yp_start-1,ch)) ~= imag(sg_scaler_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 Scaler does not match Matlab model Scaler output!')
% else
% display(sprintf('Matched Scaler output to Matlab model Scaler output! [Samples=%d]',size(sg_scaler_chan,1)))
% end
end
%% Clear variables
if ClearVars, clear scaled_yp_ddc sg_scaler_ddc sg_scaler_chan failed ii ch; end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -