|
25 | 25 | clc
|
26 | 26 |
|
27 | 27 | %% multiband pulse
|
28 |
| -fprintf(1, '\nHere''s a C13 multiband excitation pulse example, for [1-13C]pyr+13C-urea\n'); |
29 |
| -fprintf(1, 'dynamic MR spectroscopic or chemical shift imaging on a 3T clinical system\n\n'); |
| 28 | +fprintf(1, '************************************************************\n') |
| 29 | +fprintf(1, 'Here''s a C13 multiband excitation pulse example, for [1-13C]pyr+13C-urea\n'); |
| 30 | +fprintf(1, 'dynamic MR spectroscopic or chemical shift imaging on a 3T clinical system\n'); |
| 31 | +fprintf(1, '************************************************************\n') |
30 | 32 | fprintf(1,'Hit any key to continue:\n');
|
31 | 33 | pause;
|
32 | 34 |
|
|
70 | 72 | pause;
|
71 | 73 |
|
72 | 74 | %% multiband pulse - minimum phase
|
73 |
| -fprintf(1, '\nThis pulse is shortened by using a Minimum-phase spectral filter\n'); |
| 75 | +fprintf(1, '************************************************************\n') |
| 76 | +fprintf(1, 'This pulse is shortened by using a Minimum-phase spectral filter\n'); |
74 | 77 | fprintf(1, 'This may add some phase offset between metabolites and may slightly distort lineshapes\n');
|
75 | 78 | fprintf(1, 'but under most circumstances won''t reduce SNR and allows for shorter TEs\n\n');
|
76 |
| -fprintf(1, 'Here is the resulting pulse with a linear-phase (which is longer and may have higher peak power)\n\n'); |
| 79 | +fprintf(1, 'Here is the resulting pulse with a linear-phase (which is longer and may have higher peak power)\n'); |
| 80 | +fprintf(1, '************************************************************\n') |
77 | 81 | fprintf(1,'Hit any key to continue:\n');
|
78 | 82 | pause;
|
79 | 83 |
|
|
91 | 95 | s_ftype = 'min';
|
92 | 96 |
|
93 | 97 | %% minimum phase - spectral correction
|
94 |
| -fprintf(1, '\nThis pulse also is corrected for chemical-shift slice misregistration\n'); |
| 98 | +fprintf(1, '************************************************************\n') |
| 99 | +fprintf(1, 'This pulse also is corrected for chemical-shift slice misregistration\n'); |
95 | 100 | fprintf(1, 'by using the ''Spect Correct'' option.\n');
|
96 | 101 | fprintf(1, 'If the frequency specification bandwidth is too large and/or not sparse, \n');
|
97 | 102 | fprintf(1, 'the spectral correction can fail and/or result in high RF pulse powers.\n\n');
|
98 | 103 | fprintf(1, 'Here is the resulting pulse without spectral correction\n');
|
99 |
| -fprintf(1, '(the slices for different frequencies are slightly shifted and distorted).\n\n'); |
| 104 | +fprintf(1, '(the slices for different frequencies are slightly shifted and distorted).\n'); |
| 105 | +fprintf(1, '************************************************************\n') |
100 | 106 | fprintf(1,'Hit any key to continue:\n');
|
101 | 107 | pause;
|
102 | 108 |
|
|
113 | 119 |
|
114 | 120 | opt = ss_opt({'Spect Correct', 1});
|
115 | 121 | %% multiband pulse - thicker slice
|
116 |
| -fprintf(1, '\nIncreasing slice thickness from 5mm to 1cm will allow for a higher\n'); |
117 |
| -fprintf(1, 'spatial time-bandwidth and a sharper slice profile\n\n'); |
| 122 | +fprintf(1, '************************************************************\n') |
| 123 | +fprintf(1, 'Increasing slice thickness from 5mm to 1cm will allow for a higher\n'); |
| 124 | +fprintf(1, 'spatial time-bandwidth and a sharper slice profile\n'); |
| 125 | +fprintf(1, '************************************************************\n') |
118 | 126 | fprintf(1,'Hit any key to continue:\n');
|
119 | 127 | pause;
|
120 | 128 |
|
|
132 | 140 |
|
133 | 141 | %% short duration pyruvate-lactate pulse
|
134 | 142 |
|
135 |
| -fprintf(1, '\nHere''s a short C13 multiband excitation pulse, for [1-13C]pyr/lac imaging on a 3T clinical system\n'); |
| 143 | +fprintf(1, '************************************************************\n') |
| 144 | +fprintf(1, 'Here''s a short C13 multiband excitation pulse, for [1-13C]pyr/lac imaging on a 3T clinical system\n'); |
136 | 145 | fprintf(1, 'with unspecified flip angles for other metabolites for cancer imaging applications.\n');
|
137 |
| -fprintf(1, 'This type of design is used in UCSF clinical MRSI studies.\n\n'); |
| 146 | +fprintf(1, 'This type of design is used in UCSF clinical MRSI studies.\n'); |
| 147 | +fprintf(1, '************************************************************\n') |
138 | 148 | fprintf(1,'Hit any key to continue:\n');
|
139 | 149 | pause;
|
140 | 150 |
|
|
158 | 168 | % create vectors of angles, ripples, and band edges for input to pulse design
|
159 | 169 | [fspec, a_angs, d] = create_freq_specs(mets);
|
160 | 170 | fctr = 0; % force pulse design to optimize for center of frequency specification
|
161 |
| -s_ftype = 'lin'; % linear-phase spectral filter |
| 171 | +s_ftype = 'min'; % linear-phase spectral filter |
162 | 172 |
|
163 | 173 | % SPATIAL PULSE PARAMETERS
|
164 | 174 | z_thk = .5; % thickness (cm)
|
|
171 | 181 | ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ...
|
172 | 182 | z_ftype, s_ftype, ss_type, fctr);
|
173 | 183 | set(gcf,'Name', '[1-13C]pyr+lac Simple Multiband');
|
| 184 | + |
| 185 | + |
| 186 | +%% short duration pyruvate-lactate pulse with variable flip angles |
| 187 | + |
| 188 | +fprintf(1, '************************************************************\n') |
| 189 | +fprintf(1, 'To improve the SNR for dynamic imaging, the flip angle should be varied over time.\n'); |
| 190 | +fprintf(1, 'Here is an example to design a set of RF pulses, with identical gradients.\n\n'); |
| 191 | +fprintf(1, 'and different variable flip angles for pyruvate and lactate.\n'); |
| 192 | +fprintf(1, '************************************************************\n') |
| 193 | +fprintf(1,'Hit any key to continue: (design is slower since a set of pulses)\n'); |
| 194 | +pause; |
| 195 | + |
| 196 | +clear all; ss_opt([]); ss_globals; % Reset all options |
| 197 | + |
| 198 | +% GENERAL PULSE PARAMETERS |
| 199 | +ss_type = 'EP Whole'; |
| 200 | +ptype = 'ex'; % excitation pulse |
| 201 | +opt = ss_opt({'Nucleus', 'Carbon', ... |
| 202 | + 'Max Duration', 8e-3, ... |
| 203 | + 'Max B1', 0.5, ... |
| 204 | + 'Spect Correct', 1}); |
| 205 | + |
| 206 | +% SPECTRAL PULSE PARAMETERS |
| 207 | +B0 = 3e4; % G |
| 208 | +df = 0.5e-6 * B0 * SS_GAMMA; % 0.5 ppm = gamma_C13 * B0 * 0.5e-6 |
| 209 | +% metabolite frequency (Hz) freq bandwidth (Hz) |
| 210 | +mets(1).name = 'pyr'; mets(1).f = -230; mets(1).df = 2*df; |
| 211 | +mets(2).name = 'lac'; mets(2).f = 165; mets(2).df = 2*df; |
| 212 | + |
| 213 | +% define variable flip angles |
| 214 | +% (see hyperpolarized-mri-toolbox for more info and code on schemes) |
| 215 | +TR = 3; N = 16; |
| 216 | +kPLest = .05; R1est = [1/35 1/30]; % [T1pyr, T1lac], 1/s |
| 217 | + |
| 218 | +flips = zeros(2,N); |
| 219 | +% pyruvate flips for constant signal |
| 220 | +% vfa_const_amp(N, pi/2, exp(-TR * (R1(1)+kPL))) |
| 221 | +E1 = exp(-TR * (R1est(1)+kPLest)); |
| 222 | +flips(1,N) = pi/2; |
| 223 | +for n = N-1:-1:1 |
| 224 | + flips(1,n) = atan(E1*sin(flips(1,n+1))); |
| 225 | +end |
| 226 | + |
| 227 | +% lactate flips for maximum total SNR |
| 228 | +% vfa_opt_signal(N, exp(-TR * R1(2))); |
| 229 | +E1 = exp(-TR * R1est(2)); |
| 230 | +flips(2,:) = acos( sqrt((E1^2-E1.^(2.*(N-[1:N]+1))) ./ (1-E1.^(2*(N-[1:N]+1)))) ); |
| 231 | + |
| 232 | + |
| 233 | +dr = .02; % here ripple is a fraction of the flip angle |
| 234 | + |
| 235 | +for n = 1:length(mets) |
| 236 | + fspec(2*n-1) = mets(n).f - mets(n).df; |
| 237 | + fspec(2*n) = mets(n).f + mets(n).df; |
| 238 | +end |
| 239 | +fmid = (mets(1).f+mets(end).f)/2; |
| 240 | +fspec = fspec - fmid; |
| 241 | + |
| 242 | +fctr = 0; % force pulse design to optimize for center of frequency specification |
| 243 | +s_ftype = 'min'; % linear-phase spectral filter |
| 244 | + |
| 245 | +% SPATIAL PULSE PARAMETERS |
| 246 | +z_thk = .5; % thickness (cm) |
| 247 | +z_tb = 3; % time-bandwidth, proportional to profile sharpness |
| 248 | +z_ftype='ls'; % least-squares filter design |
| 249 | +z_d1 = 0.01; z_d2 = 0.01; % slice profile pass and stop-band ripples, respectively |
| 250 | + |
| 251 | +% DESIGN THE PULSE! |
| 252 | +[g,rf,fs,z,f,mxy] = ... |
| 253 | + ss_design_dyn(z_thk, z_tb, [z_d1 z_d2], fspec, flips, dr, ptype, ... |
| 254 | + z_ftype, s_ftype, ss_type, fctr); |
| 255 | + |
| 256 | +% % for saving dynamic pulses: |
| 257 | +% for t = 1:N |
| 258 | +% ss_save_dyn(g(:,t),rf(:,t),max(flips(:,t)),z_thk, [], 'GE', fspec, flips(:,t), root_fname, t); |
| 259 | +% end |
| 260 | + |
| 261 | + |
0 commit comments