!=================================== ! rSNOB2 X pulse ! BENJAMIN WYLIE AND YING LI !=================================== ! WTF additions 010706 ! 1. streamlined phase/freq hopping implementation. ! 2. added variables to make it fully internal (an actual includes file) ! 3. Changed variable/Macro naming conventions ! 4. Added acq params here.(010906) !=================================== ! Li, Wylie, Rienstra JMR 2006? ! ! phase cycling may be done within ch1 or loop1 (after declaring into ch1) ! !calculation phases .phase phi_rSNOB2 = 0.0; .phase ph0_rSNOB2 = 0.0; .phase p00_rSNOB2 = 0.0; .phase p_err_rSNOB2 = 0.0; .phase d_ph_rSNOB2 = 0.0; !timings .time extern pw_rSNOB2 = 10m; .time autofix PW_rSNOB2 = 10u; .time t_rSNOB2 = 10u; .time rSNOB2_rm = 10u; .time tau_r_rSNOB2 = 10u; .long steps_rSNOB2 "shape steps" = 256; .long cycles_rSNOB2; .time cyclesrem_rSNOB2; ! .long ii,jj,kk; ! r-SNOB fourier coefficients (Shape) .float Ac_rSNOB2[]=0.5000,-1.1472, 0.5572,-0.0829, 0.0525; .float Bc_rSNOB2[]=0.0000, 0.0000, 0.0000, 0.0000, 0.0000; ! rSNOB2 amplitudes !ch++ ch1; .long list fixed ap_rSNOB2[256]; .float list a_rSNOB2[256]; .phase p_rSNOB2[256]; .phase list rSNOB2_plist[256]; .float extern freqhop_rSNOB2 = 0.0; !ch--; .ampl extern aX_rSNOB2 = 0.1; .ampl amplrSNOB2 = 0.1; .float nml_rSNOB2 = 0.0; ! .float norm = 0.0; ! .phase pshift; .scale scX_rSNOB2 "X rSNOB2 scaler" = 0.1; ! .phase phi_0 = 0.0; ! .phase phi_00 = 0.0; ! .phase perror = 0.0; .ampl AX_rSNOB2; !Add to .acq file !# Selective echo !scX_rSNOB2;X scalar soft;0.1;-;0.0;1.0;3;1;float !pw_rSNOB2;soft 180 pulse;360;u;200;10000;2;1;float !aX_rSNOB2;X 180 soft.;0.1;-;0.0;1.0;4;1;float !freqhop_rSNOB2;softpulse offset;0;Hz;-100000.0;100000.0;3;0;float DEFINE rSNOB2_prog(t_soft) PW_rSNOB2=(pw_rSNOB2-12u)/steps_rSNOB2; while(PW_rSNOB2 < 1.0u){ steps_rSNOB2 = steps_rSNOB2 - 1; PW_rSNOB2=(pw_rSNOB2-12u)/steps_rSNOB2; } rSNOB2_rm = pw_rSNOB2 - (steps_rSNOB2*PW_rSNOB2); d_ph_rSNOB2 = 0.0; norm=0.0; i=0; do(steps_rSNOB2){ amplrSNOB2=0.0; j=0; ss Ac_rSNOB2; ss Bc_rSNOB2; do(Ac_rSNOB2.size){ amplrSNOB2=amplrSNOB2+(@Ac_rSNOB2++)*cos(i*j*(2*pi/steps_rSNOB2)); amplrSNOB2=amplrSNOB2+(@Bc_rSNOB2++)*sin(i*j*(2*pi/steps_rSNOB2)); j++; } if( abs(amplrSNOB2) > norm ){norm=abs(amplrSNOB2);} i++; } d_ph_rSNOB2 = 0.0; t_rSNOB2 = pw_rSNOB2 ; t_soft = t_rSNOB2; ch++ ch1; MAKE_rSNOB2; MAKE_ampl_rSNOB2; ch--; cycles_rSNOB2= floor((t_soft)/(2.0*pw_tppm_rSNOB)); cyclesrem_rSNOB2=t_soft+pw180X-cycles_rSNOB2*2.0*pw_tppm_rSNOB ; if( cyclesrem_rSNOB2 < 1.0u){ cycles_rSNOB2=cycles_rSNOB2-1; cyclesrem_rSNOB2=t_soft+pw180X-cycles_rSNOB2*2.0*pw_tppm_rSNOB; } ENDDEF DEFINE MAKE_rSNOB2 p_err_rSNOB2 = 0.0; AX_rSNOB2=aX_rSNOB2/scX_rSNOB2; ss ap_rSNOB2; ss p_rSNOB2; ss a_rSNOB2; i=0; ii=0; norm=0.0; do(steps_rSNOB2){ amplrSNOB2=0.0; jj=0; do(Ac_rSNOB2.size){ a_rSNOB2[ii] = a_rSNOB2[ii] + Ac_rSNOB2[jj]*cos(ii*jj*(2*pi/steps_rSNOB2)); a_rSNOB2[ii] = a_rSNOB2[ii] + Bc_rSNOB2[jj]*sin(ii*jj*(2*pi/steps_rSNOB2)); jj++; } if(abs(a_rSNOB2[ii]) > norm) { norm = abs(a_rSNOB2[ii]); } ii++; } ii = 0; freqhop_rSNOB2=freqhop_F3; pshift=(freqhop_rSNOB2*360.0)*((pw_rSNOB2-12u)/steps_rSNOB2); perror = 0.0; ss ap_rSNOB2; do(steps_rSNOB2){ phi_0 = -1.0*(freqhop_rSNOB2*180.0)*(pw_rSNOB2); ! normally phi_0 = 0.0; a_rSNOB2[ii] = (a_rSNOB2[ii]/norm)*AX_rSNOB2; if(a_rSNOB2[ii] < 0.0){ a_rSNOB2[ii] = abs(a_rSNOB2[ii]); phi_0 = phi_0 + 180.0; } phi_0 = phi_0 + pshift*(ii+1); phi_0 = phi_0; phi_00 = floor(phi_0+0.5); perror = perror + (phi_0 - phi_00); if(abs(perror) > 1.0){ phi_00 = phi_00 + floor(perror); perror = perror - floor(perror); } p_rSNOB2[ii]=phi_00; ii++; } ENDDEF DEFINE MAKE_ampl_rSNOB2 p_err_rSNOB2 = 0.0; ph0_rSNOB2 = 0.0; ss a_rSNOB2; ss p_rSNOB2; do(steps_rSNOB2){@a_rSNOB2++=0.0;@p_rSNOB2++=0.0;} ss a_rSNOB2; ss p_rSNOB2; i = 0; do(steps_rSNOB2){ amplrSNOB2=0.0; ss Ac_rSNOB2; ss Bc_rSNOB2; j=0; do(Ac_rSNOB2.size){ amplrSNOB2=amplrSNOB2 + Ac_rSNOB2[j]*cos(j*2*pi*i/steps_rSNOB2); amplrSNOB2=amplrSNOB2 + Bc_rSNOB2[j]*sin(j*2*pi*i/steps_rSNOB2); j++; } amplrSNOB2=aX_rSNOB2*amplrSNOB2/scX_rSNOB; if(amplrSNOB2 < 0.0){ ph0_rSNOB2=p180+ph0_rSNOB2; amplrSNOB2=abs(amplrSNOB2); } ph0_rSNOB2= ph0_rSNOB2 + (i*d_ph_rSNOB2); p00_rSNOB2=floor(ph0_rSNOB2 + 0.5); p_err_rSNOB2 = p_err_rSNOB2 + (ph0_rSNOB2 - p00_rSNOB2); if(abs(p_err_rSNOB2)>1.0){ p00_rSNOB2 = p00_rSNOB2 + floor(p_err_rSNOB2); p_err_rSNOB2 = p_err_rSNOB2 - floor(p_err_rSNOB2); } p00_rSNOB2=p00_rSNOB2 - floor(p00_rSNOB2/360.0)*360.0; @a_rSNOB2++ = amplrSNOB2 ; @p_rSNOB2++ = p00_rSNOB2 ; i++; } ENDDEF DEFINE rSNOB2_X ss ap_rSNOB2; out time(3u) ch1: TB ; out time(3u) ch1: SC(scX_rSNOB2); ! out time(tau_r_rSNOB2); for(i=0, i