diff --git a/src/octave/ddpm_mod.m b/src/octave/ddpm_mod.m index a31527ec..33c24565 100644 --- a/src/octave/ddpm_mod.m +++ b/src/octave/ddpm_mod.m @@ -6,14 +6,33 @@ ddpm_s = zeros(size(s)); - for tidx = 1:length(s) - for bidx = 1:nbits - if bitand(count(tidx), (2^(nbits-bidx)-1) ) == 2^(nbits-1-bidx) - if bitand(s(tidx),bitshift(1,bidx)) - ddpm_s(tidx) = 1; - end + if 0 + % loop form (slower) + + for tidx = 1:length(s) + for bidx = 1:nbits + if bitand(count(tidx), (2^(nbits-bidx)-1) ) == 2^(nbits-1-bidx) + if bitand(s(tidx),bitshift(1,bidx)) + ddpm_s(tidx) = 1; + end + end end end - end + else + % matrix form (faster) + + for bidx = 1:nbits + idxs = find( + (bitand(count, (2^(nbits-bidx)-1) ) == 2^(nbits-1-bidx) ) & + ( bitand(s,bitshift(1,bidx)) > 0 ) + ); + + % size(idxs) + + ddpm_s(idxs) = ones(size(idxs)); + end + + end + end \ No newline at end of file diff --git a/src/octave/sd1_mod.m b/src/octave/sd1_mod.m index ad27b9dd..e709187d 100644 --- a/src/octave/sd1_mod.m +++ b/src/octave/sd1_mod.m @@ -15,10 +15,18 @@ minval = 0; for idx = 2:length(inval) - delta(idx) = saturated_adder( inval(idx), qerr(idx-1), maxval, minval); + if 1 + delta(idx) = saturated_adder( inval(idx), qerr(idx-1), maxval, minval); + else + % just slightly faster + delta(idx) = inval(idx) + qerr(idx-1); + end qerr(idx) = bitand( delta(idx), 2^(nbits-nbits_out) - 1); sd_out(idx) = bitshift(delta(idx),-(nbits-nbits_out)); end + + % check for saturation + saturation_check(delta, maxval, minval); if 1 fh = figure(541); @@ -53,6 +61,20 @@ ret = a + b; + if ret > maxval + ret = maxval; + else + if ret < minval + ret = minval; + end + end + +end + +function ret = saturated_adder_vec(a, b, maxval, minval) + + ret = a + b; + maxidx = find(ret > maxval); ret(maxidx) = maxval * ones(size(maxidx)); @@ -61,3 +83,13 @@ end +function saturation_check(s, maxval, minval) + + maxidx = find(s > maxval); + assert(isempty(maxidx)); + + minidx = find(s < minval); + assert(isempty(maxidx)); + +end + diff --git a/src/octave/sim_top.m b/src/octave/sim_top.m index a0d9de38..b01e5c3c 100644 --- a/src/octave/sim_top.m +++ b/src/octave/sim_top.m @@ -3,7 +3,9 @@ clear all; close all; -pkg load signal +profile off; +profile clear; +profile on; % inputs fclock = 12.5; # khz @@ -16,8 +18,16 @@ nbit_pwm_phase = 8; nbit_sine_phase = 8; nbit_pwm_amplitude = 8; - nperiods = 5; + nperiods = 5; end + +if 0 + nbit_pwm_phase = 10; + nbit_sine_phase = 6; + nbit_pwm_amplitude = nbit_pwm_phase; + nperiods = 3; +end + nbit_sd_amplitude = nbit_pwm_amplitude + 2; % parameters @@ -66,16 +76,16 @@ xlim((1/fclock)*[0 (2^nbit_phase)-1]); end -if 0 - figure(111); - stairs(t,s); - hold on; grid on; - stairs(t,max(s)*sd1_s,'r'); - xlabel('time [ms]'); - ylabel('amplitude [LSB]'); - legend('quant sine','sd1'); - xlim((1/fclock)*[0 (2^nbit_phase)-1]); -end +##if 0 +## figure(111); +## stairs(t,s); +## hold on; grid on; +## stairs(t,max(s)*sd1_s,'r'); +## xlabel('time [ms]'); +## ylabel('amplitude [LSB]'); +## legend('quant sine','sd1'); +## xlim((1/fclock)*[0 (2^nbit_phase)-1]); +##end if 1 fh = figure(1111); @@ -108,7 +118,7 @@ xlim((1/fclock)*[0 (2^nbit_phase)-1]); saveas(fh, 'timedomain', 'png'); - close(fh) + % close(fh) end %% freq domain plots %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -147,4 +157,9 @@ legend('pwm', 'ddpm', 'sd1','Location','southwest'); saveas(fh, 'freqdomain', 'png'); % close(fh) -end \ No newline at end of file +end + +profile off; +prof = profile ('info'); +profshow(prof); +% profexplore(prof);