From 48cad950831b61599185f9ddd52f67d7a8b58683 Mon Sep 17 00:00:00 2001 From: agentmess Date: Fri, 13 Jun 2014 15:57:33 -0700 Subject: [PATCH 01/18] Initial file upload, including EPSI and variable flip angles --- RF_pulses/variable_flip_angles/README | 14 + .../hyperpolarized_mag_usage.m | 27 ++ .../variable_flip_angles/mvfa_const_amp.m | 62 ++++ .../simulate_2site_model.m | 52 ++++ .../test_data/vfa_example_data.mat | Bin 0 -> 3380 bytes .../variable_flip_angles/vfa_const_amp.m | 33 +++ .../variable_flip_angles/vfa_example_script.m | 55 ++++ trajectories/epsi/design_epsi.m | 272 ++++++++++++++++++ trajectories/epsi/epsi_examples.m | 70 +++++ .../epsi/test_data/epsi_1t_example.mat | Bin 0 -> 248211 bytes .../epsi/test_data/epsi_3t_example.mat | Bin 0 -> 75293 bytes 11 files changed, 585 insertions(+) create mode 100644 RF_pulses/variable_flip_angles/README create mode 100644 RF_pulses/variable_flip_angles/hyperpolarized_mag_usage.m create mode 100644 RF_pulses/variable_flip_angles/mvfa_const_amp.m create mode 100644 RF_pulses/variable_flip_angles/simulate_2site_model.m create mode 100644 RF_pulses/variable_flip_angles/test_data/vfa_example_data.mat create mode 100644 RF_pulses/variable_flip_angles/vfa_const_amp.m create mode 100644 RF_pulses/variable_flip_angles/vfa_example_script.m create mode 100644 trajectories/epsi/design_epsi.m create mode 100644 trajectories/epsi/epsi_examples.m create mode 100644 trajectories/epsi/test_data/epsi_1t_example.mat create mode 100644 trajectories/epsi/test_data/epsi_3t_example.mat diff --git a/RF_pulses/variable_flip_angles/README b/RF_pulses/variable_flip_angles/README new file mode 100644 index 0000000..f30cf6d --- /dev/null +++ b/RF_pulses/variable_flip_angles/README @@ -0,0 +1,14 @@ +Variable Flip Angle RF Pulse Design scripts +Authors: Peder E. Z. Larson and Ann Xing + +(c) 2008-2013 The Regents of the University of California. +All Rights Reserved. +====================== + +These Matlab functions are for designing variable flip angle schemes for hyperpolarized MR applications. All functions are documented within. These accompany the manuscript: +Xing Y, Reed GD, Pauly JM, Kerr AB, and Larson PEZ. Optimal Variable Flip Angle Schemes For Dynamic Acquisition Of Exchanging Hyperpolarized Substrates. J Magn Reson. 2013 Sep; 234:75-81. +http://www.ncbi.nlm.nih.gov/pubmed/23845910 + +All works deriving from this package must be properly cited. Please include the following sources of support: +- Hyperpolarized MRI Technology Resource Center at UCSF (NIH P41-EB013598) + diff --git a/RF_pulses/variable_flip_angles/hyperpolarized_mag_usage.m b/RF_pulses/variable_flip_angles/hyperpolarized_mag_usage.m new file mode 100644 index 0000000..2ca0b48 --- /dev/null +++ b/RF_pulses/variable_flip_angles/hyperpolarized_mag_usage.m @@ -0,0 +1,27 @@ +function [mxy, mz] = hyperpolarized_mag_usage(flip, E1); +% [mxy, mz] = hyperpolarized_mag_usage(flip [, E1]) +% +% Determines the transverse and longitudinal magnetization after each RF +% pulse for hyperpolarized magnetization. +% +% INPUTS: +% flip - flip angles, in radians +% (optional) E1 = exp(-TR/T1) accounts for T1 decay between +% acquisitions. Default is 1. +% +% OUTPUTS: +% mxy,mz - expected magnetization with given E1 +% +% (c) 2008-2013 The Regents of the University of California +% All Rights Reserved. +% +% Author: Peder E. Z. Larson + +if nargin < 2 + E1 = 1; +end + +N = length(flip); + +mxy = sin(flip).* cumprod(cos([0, flip(1:end-1)])) .* E1.^[0:N-1]; +mz = cumprod(cos(flip)) .* E1.^[0:N-1] ; \ No newline at end of file diff --git a/RF_pulses/variable_flip_angles/mvfa_const_amp.m b/RF_pulses/variable_flip_angles/mvfa_const_amp.m new file mode 100644 index 0000000..7dbd850 --- /dev/null +++ b/RF_pulses/variable_flip_angles/mvfa_const_amp.m @@ -0,0 +1,62 @@ +function flips = mvfa_const_amp(N, TR, k12, R1, Minit); +% flips = mvfa_const_amp(N, TR, k12, R1, Minit) +% +% Calculates series of flip angles for substrate and product that +% are exchanging for a constant amplitude signal in +% hyperpolarized MR, assuming negligible thermal magnetization and back-reaction. +% +% INPUTS: +% N - number of pulses +% TR - repetition time, sec +% k12 - conversion rate from substrate to product, 1/sec +% R1 - relaxation rate of substrate and product (specify both) +% Minit - relative initial magnetization levels +% +% OUTPUTS: +% flips - flip angles +% +% Example: TR of 300 ms, for 30 s, with conversion rate of 0.05 +% 1/s and T1s of 30 and 35 s, and initial magnetization level +% of product at 10% of substrate +% flips = mvfa_const_amp(100, 0.3, 0.05, [1/30 1/35], [1 0.1]); +% +% (c) 2012-2013 The Regents of the University of California +% All Rights Reserved. +% +% Authors: Peder E. Z. Larson, Yan Ann Xing 2012 + +if isempty(R1) + R1 = [0 0]; % infinite relaxation time +end + +if length(R1) == 1 + R1 = [R1 R1]; +end + + +flips(1,:) = vfa_const_amp(N, pi/2, exp(-TR * (R1(1) + k12))); % substrate flip angle + +Sbounds = [0 Minit(2)]; % bound product signal + +mag(:,1) = Minit; +A = [-R1(1)-k12 0; + k12 -R1(2)]; + +while diff(Sbounds) > Minit(2)/1e12 + S_test = sum(Sbounds)/2; + + flips(2,1) = asin(S_test/mag(2,1)); + for k = 2:N + mag(:,k)= expm(A*TR)*mag(:,k-1); + flips(2,k)= asin(S_test/mag(2,k)); + mag(:,k) = mag(:,k) .* cos(flips(:,k)); % loss due to RF + end + + if isreal(flips(2,N)) && flips(2,N) < pi/2 + Sbounds(1) = S_test; + else + Sbounds(2) = S_test; + end +end + +flips(2,N) = pi/2; \ No newline at end of file diff --git a/RF_pulses/variable_flip_angles/simulate_2site_model.m b/RF_pulses/variable_flip_angles/simulate_2site_model.m new file mode 100644 index 0000000..69ebf9f --- /dev/null +++ b/RF_pulses/variable_flip_angles/simulate_2site_model.m @@ -0,0 +1,52 @@ +function [Mxy, Mz] = simulate_2site_model(Tin, R1, k, flips, TR) +% [Mxy, Mz] = simulate_2site_model(Tin, R1, k, flips, TR) +% OR +% [Mxy, Mz] = simulate_2site_model(Mz0, R1, k, flips, TR) +% +% Simulates the magnetization evolution in a two-site exchange model with +% varying flip angles. Applied disretely as flips(:,1), TR, flips(:,2), TR, etc... +% +% INPUTS: +% Tin or Mz0 - if Tin is specified, then model will start from all the +% magnetization in one compound, then evolve for Tin prior to applying +% flip angles +% - if Mz0 (1x2) is specified, then model starts from this +% magnetization distribution +% R1 - relaxation times for 2 sites (1/s) +% k - conversion rates between sites (1/s) +% flips - flip angles (radians) +% TR - repetition time (s) +% +% OUTPUTS: +% Mxy,Mz - expected magnetization evolution immediately after flips +% +% (c) 2013-2014 The Regents of the University of California +% All Rights Reserved. +% +% Author: Peder E. Z. Larson + +if isempty(R1) + R1 = [0 0]; % infinite relaxation time +end + +if length(R1) == 1 + R1 = [R1 R1]; +end + +N = size(flips,2); +A = [-R1(1)-k(1) +k(2) + +k(1) -R1(2)-k(2)]; + +if length(Tin) == 1 + Mz0 = expm(A*Tin) * [1;0]; +else + Mz0 = Tin; +end + +Mxy(1:2,1) = Mz0 .* sin(flips(:,1)); +Mz(1:2,1) = Mz0 .* cos(flips(:,1)); +for n = 2:N + Mz_m = expm(A*TR) * Mz(:,n-1); + Mxy(:,n) = Mz_m .* sin(flips(:,n)); + Mz(:,n) = Mz_m .* cos(flips(:,n)); +end \ No newline at end of file diff --git a/RF_pulses/variable_flip_angles/test_data/vfa_example_data.mat b/RF_pulses/variable_flip_angles/test_data/vfa_example_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..9d25b87d4a5957fdcfc8ac11d91bac9ec2632b21 GIT binary patch literal 3380 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 eps | max(abs(flips_constsignalnew - flips_constsignal )) > eps + error('Validation failed for variable flip angle example') + else + disp('Validation passed for variable flip angle example') + end +end diff --git a/trajectories/epsi/design_epsi.m b/trajectories/epsi/design_epsi.m new file mode 100644 index 0000000..7a992a6 --- /dev/null +++ b/trajectories/epsi/design_epsi.m @@ -0,0 +1,272 @@ +function [g, ktraj_g, gparams, opts] = design_epsi(epsi_type, ramp_sampling, spatial_res, spatial_fov, spec_res, spec_bw, opts) +% DESIGN_EPSI - design an echo-planar spectroscopic imaging gradient +% +% [g, ktraj_g, gparams] = design_epsi(epsi_type, ramp_sampling, spatial_res, spatial_fov, spec_res, spec_bw, [opts]) +% +% INPUTS +% epsi_type - 'flyback' (default), 'symmetric' +% ramp_sampling - 1=on, 0=off (partial ramp sampling also supported by +% values between 0-1) +% spatial_res - Spatial resolution (cm) +% spatial_fov - Spatial FOV (cm) +% spec_res - Spectral resolution (Hz), assumes half-echo (half-Fourier) time sampling +% spec_bw - Spectral bandwidth (Hz) +% opts (optional) - structure defining options for the EPSI design. This includes: +% 'max_slew' (default = 20 G/cm/ms), 'max_g' (default = 5 G/cm/ms), +% 'samp_rate' - waveform sampling rate (default = 4e-6 s), +% 'GAMMA' (13C is default = 1071 Hz/G) +% OUTPUTS +% g - gradient (G/cm) +% ktraj_g - k-space trajectory (1/cm) +% gparams - structure containing other EPSI parameters: +% 'data_samp_rate' - data sampling rate (s) +% 'sampling_delay' - delay between first gradient point and first +% readout sample +% 'n_read' - samples to readout per gradient lobe, at data_samp_rate +% 'n_skip' - samples to skip between readout sections, at data_samp_rate +% 'Nlobes' - number of readout gradient lobes +% 'spatial_fov' - actual spatial FOV (cm) +% 'spatial_res' - actual spatial resolution (cm) +% 'spec_res' - actual spectral resolution (Hz) +% 'spec_bw' - actual spectral bandwidth (Hz) + +% +% Author: Peder E. Z. Larson +% +% (c)2014 The Regents of the University of California. +% All Rights Reserved. + +% Note that 'symmetric' is Nyquist-sampled symmetric, meaning nowhere in k-space is +% the Nyquist criteria violated, and there will also be oversampling. + + +if nargin < 7 + opts = []; +end +if ~isfield(opts, 'GAMMA') + opts.GAMMA = 1071; % Hz/G +end +if ~isfield(opts, 'max_g') + opts.max_g = 5; % G/cm +end +if ~isfield(opts, 'max_slew') + opts.max_slew = 20; % G/cm/ms +end +if ~isfield(opts, 'samp_rate') + opts.samp_rate = 4e-6; % s +end + + +% design gradient lobes +% dzg will determine whether spatial_res and spec_bw specifications are +% feasible +switch epsi_type + case 'symmetric' + [g_readlobe, n_samp_delay, gparams.data_samp_rate, gparams.n_skip, gparams.n_read] = ... + dzg_read(floor(1/(2*spec_bw)/opts.samp_rate)*opts.samp_rate, 1/spatial_res, ramp_sampling); + g_dephase = dzg_short(sum(g_readlobe)/2 * opts.samp_rate * opts.GAMMA); + Nlobes = ceil(1/(2*spec_res * 2*length(g_readlobe)* opts.samp_rate)); + g = [-g_dephase, kron(ones(1,Nlobes),[g_readlobe -g_readlobe])]; + + gparams.Nlobes = 2*Nlobes; + gparams.spec_res = 1/(2*Nlobes*2*length(g_readlobe)* opts.samp_rate); + gparams.spec_bw = 1 / (2*length(g_readlobe)*opts.samp_rate); + + case 'flyback' + % prioritizes spec_bw + % g_fblobe = dzg_short(1/spatial_res); + % [g_readlobe gparams.data_samp_rate, gparams.n_skip, gparams.n_read] = ... + % dzg_read(1/spec_bw - length(g_fblobe)*opts.samp_rate, 1/spatial_res, ramp_sampling); + + % prioritizes spatial_res + [g_readlobe, g_fblobe, n_samp_delay, gparams.data_samp_rate, gparams.n_skip, gparams.n_read] = ... + dzg_flyback(floor(1/spec_bw/opts.samp_rate)*opts.samp_rate, 1/spatial_res, ramp_sampling,opts, spatial_fov); + + g_dephase = dzg_short(sum(g_readlobe)/2 * opts.samp_rate * opts.GAMMA); + Nlobes = ceil(1/(2*spec_res * (length(g_readlobe)+length(g_fblobe))* opts.samp_rate)); + g = [-g_dephase, kron(ones(1,Nlobes),[g_readlobe -g_fblobe])]; + + gparams.Nlobes = Nlobes; + gparams.spec_res = 1/(2*Nlobes*(length(g_readlobe)+length(g_fblobe))* opts.samp_rate); + gparams.spec_bw = 1 / ((length(g_readlobe)+length(g_fblobe))*opts.samp_rate); + + +end + +gparams.sampling_delay = (length(g_dephase) + n_samp_delay) * opts.samp_rate; +gparams.spatial_fov = 1/ (opts.GAMMA * max(g_readlobe) * gparams.data_samp_rate); +gparams.spatial_res = spatial_res; + +ktraj_g = opts.GAMMA*opts.samp_rate*cumsum(g); + +% end of main function + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% nested functions: + + function [g, n_samp_delay, data_samp_rate, n_skip, n_read] = dzg_read(T, Ak, framp) + % T - gradient duration (s) + % Ak - total gradient area for data sampling (1/cm) + % framp - fraction of ramp samples to use, [0,1] + + S = opts.max_slew*1e3; + A = Ak / opts.GAMMA; + + t_ramp = ( T*S - sqrt( (T*S)^2 - 4*(2-framp)*S*A) )/(2*(2-framp)*S); + if ~isreal(t_ramp) + error('Cannot design EPSI for chosen spatial_res, spec_bw & ramp_sampling. Try relaxing these contraints.') + end + g_ideal = S*t_ramp; + + % data sampling rate + data_samp_rate_factor = floor(1 / (opts.GAMMA * g_ideal * spatial_fov) / opts.samp_rate); + data_samp_rate = data_samp_rate_factor * opts.samp_rate; + + % only stretch gradient to maintain within slew, g limits + % in units of opts.samp_rate + if framp == 0 + % enforce data_samp_rate on all gradient sections for + % simplifying data reconstruction + n_ramp = ceil(t_ramp / data_samp_rate ) * data_samp_rate_factor ; + n_plateau = floor( (T - 2*n_ramp*opts.samp_rate)/data_samp_rate ) * data_samp_rate_factor ; + else + % only enforce data_samp_rate over total gradient length + n_ramp = ceil(t_ramp / opts.samp_rate ); + n_plateau = floor( T/data_samp_rate)* data_samp_rate_factor - 2*n_ramp ; + + end + + n_samp_delay = floor(n_ramp * (1-framp)); + + % in units of data_samp_rate + n_read = (n_plateau+2*(n_ramp-n_samp_delay)) / data_samp_rate_factor; + n_skip = 2*n_samp_delay / data_samp_rate_factor; + + g_max = A / ( (n_plateau+(n_ramp-n_samp_delay))*opts.samp_rate); + + if g_max > opts.max_g + error('Cannot design EPSI for chosen spatial_res, spec_bw & ramp_sampling. Try relaxing these contraints.') + end + + g = [ [0.5:n_ramp-.5]/n_ramp ones(1, n_plateau) [n_ramp-0.5:-1:0.5]/n_ramp ] * g_max; + + if max(abs(diff(g))/opts.samp_rate) > S + error('Slew rate exceeded') + end + end + + function g = dzg_short(Ak) + % Ak - total gradient area (1/cm) + S = opts.max_slew*1e3; + A = Ak / opts.GAMMA; + + gmax_ideal = sqrt( A * S ); % without gradient limitation + n_ramp = ceil(gmax_ideal / (S * opts.samp_rate)); + n_ramp_max = ceil(opts.max_g / (S * opts.samp_rate)); + if n_ramp > n_ramp_max + n_ramp = n_ramp_max; + n_plateau = ceil( (A - opts.max_g* n_ramp*opts.samp_rate) / (opts.max_g * opts.samp_rate)); + else + n_plateau = 0; + end + + g_max = A / ( (n_plateau+n_ramp)*opts.samp_rate); + g = [ [0.5:n_ramp-.5]/n_ramp ones(1, n_plateau) [n_ramp-0.5:-1:0.5]/n_ramp ] * g_max; + + if max(abs(diff(g))/opts.samp_rate) > S + error('Slew rate exceeded') + end + end +end + +function [gread, gfb, n_samp_delay, data_samp_rate, n_skip, n_read] = dzg_flyback(T, Ak, framp,opts,spatial_fov) +% T - total gradient duration (s) +% Ak - total gradient area for data sampling (1/cm) +% framp - fraction of ramp samples to use, [0,1] + +S = opts.max_slew*1e3; +A = Ak / opts.GAMMA; +n_ramp_max = ceil(opts.max_g / (S * opts.samp_rate)); + +syms d1 d2 D1 D2 positive + +% determine whether plateau samples required on flyback lobe +solns = solve(A == (D1 + framp*d1)*S*d1, T == D1 + 2*(d1+d2), S*d1*(D1+d1) == S*d2^2, 'Real', true); +if isempty(solns) + error('Cannot design EPSI for chosen spatial_res, spec_bw & ramp_sampling. Try relaxing these contraints.') +end +SD1 = eval(solns.D1); SD2 = zeros(size(SD1)); Sd1 = eval(solns.d1); Sd2 = eval(solns.d2); + +n_ramp1 = ceil(Sd1 / opts.samp_rate); +n_ramp2 = ceil(Sd2 / opts.samp_rate); +n_plateau1 = floor( (T - 2*(n_ramp1+n_ramp2)*opts.samp_rate)/opts.samp_rate ); +n_plateau2 = zeros(size(n_plateau1)); + +Isoln = find(n_ramp1 <= n_ramp_max & n_ramp2 <= n_ramp_max); +if isempty(Isoln) + % plateau samples required + solns = solve(A == (D1 + framp*d1)*S*d1, T == D1 + D2 + 2*(d1+d2), S*d1*(D1+d1) == S*d2*(D2+d2), opts.max_g == S*d2, 'Real', true); + if isempty(solns) + error('Cannot design EPSI for chosen spatial_res, spec_bw & ramp_sampling. Try relaxing these contraints.') + end + SD1 = eval(solns.D1); SD2 = eval(solns.D2); Sd1 = eval(solns.d1); Sd2 = eval(solns.d2); + n_ramp1 = ceil(Sd1 / opts.samp_rate); + n_ramp2 = ceil(Sd2 / opts.samp_rate); + n_plateau1 = floor( (T - SD2 - 2*(n_ramp1+n_ramp2)*opts.samp_rate)/opts.samp_rate ); + n_plateau2 = ceil( (T - (n_plateau1 + 2*(n_ramp1+n_ramp2))*opts.samp_rate)/opts.samp_rate ); + Isoln = find(n_ramp1 <= n_ramp_max & n_ramp2 <= n_ramp_max); +end + +if length(Isoln > 1) + % Choose solution with longest readout plateau duration + [temp ImaxD1] = max(SD1(Isoln)); + Isoln = Isoln(ImaxD1); +end +n_ramp1 = n_ramp1(Isoln); n_ramp2 = n_ramp2(Isoln); +n_plateau1 = n_plateau1(Isoln); n_plateau2 = n_plateau2(Isoln); + +% correct waveform to use a specific data sampling rate +g_ideal = S*Sd1(Isoln); +data_samp_rate_factor = floor(1 / (opts.GAMMA * g_ideal * spatial_fov) / opts.samp_rate); +data_samp_rate = data_samp_rate_factor * opts.samp_rate; + +% only stretch gradient to maintain within slew, g limits +% in units of opts.samp_rate +if framp == 0 + % enforce data_samp_rate on read gradient ramps and flyback lobe for + % simplifying data reconstruction + n_ramp1 = ceil(Sd1(Isoln) / data_samp_rate ) * data_samp_rate_factor; + n_ramp2 = ceil(Sd2(Isoln) / opts.samp_rate ); + n_plateau1 = floor( (T - SD2(Isoln) - 2*(n_ramp1+n_ramp2)*opts.samp_rate)/data_samp_rate ) * data_samp_rate_factor; + n_plateau2 = ceil( (T - (n_plateau1 + 2*n_ramp1)*opts.samp_rate)/data_samp_rate)* data_samp_rate_factor - 2*n_ramp2; +else + % enforce data_samp_rate over read and flyback gradient lobes + n_plateau1 = floor( (SD1(Isoln) + 2*Sd1(Isoln))/data_samp_rate)* data_samp_rate_factor - 2*n_ramp1; + n_plateau2 = ceil( (SD2(Isoln) + 2*Sd2(Isoln))/data_samp_rate)* data_samp_rate_factor - 2*n_ramp2; +end + +n_samp_delay = floor(n_ramp1 * (1-framp)); + +% in units of data_samp_rate +n_read = (n_plateau1+2*(n_ramp1-n_samp_delay)) / data_samp_rate_factor; +n_skip = (2*n_samp_delay + n_plateau2 + 2*n_ramp2) / data_samp_rate_factor; + +g_max1 = A / ( (n_plateau1+(n_ramp1-n_samp_delay))*opts.samp_rate); + +g_max2 = g_max1 * (n_plateau1 + n_ramp1) / (n_plateau2 + n_ramp2); + +if g_max1 > opts.max_g || g_max2 > opts.max_g + error('Cannot design EPSI for chosen spatial_res, spec_bw & ramp_sampling. Try relaxing these contraints.') +end + +gread = [ [0.5:n_ramp1-.5]/n_ramp1 ones(1, n_plateau1) [n_ramp1-0.5:-1:0.5]/n_ramp1 ] * g_max1; +gfb = [ [0.5:n_ramp2-.5]/n_ramp2 ones(1, n_plateau2) [n_ramp2-0.5:-1:0.5]/n_ramp2 ] * g_max2; + +if max(abs(diff([gread,-gfb]))/opts.samp_rate) > S + error('Slew rate exceeded') +end + +end + + + diff --git a/trajectories/epsi/epsi_examples.m b/trajectories/epsi/epsi_examples.m new file mode 100644 index 0000000..a81a3bd --- /dev/null +++ b/trajectories/epsi/epsi_examples.m @@ -0,0 +1,70 @@ +% EPSI design examples +% +% Author: Peder E. Z. Larson +% +% (c)2014 The Regents of the University of California. +% All Rights Reserved. + +validate = 0; + +%% Design for a clinical 3T MRI + +% Note that default gradient options are for 13C on a typical clinical MRI system + +spatial_res = 0.3; % cm +spatial_fov = 21.9; % cm +spec_res = 5; % Hz +spec_bw = 470; % Hz - cover from pyruvate to lactate + +epsi_type = 'symmetric'; ramp_sampling = 1; + +[g, ktraj_g, gparams, opts] = design_epsi(epsi_type, ramp_sampling, spatial_res, spatial_fov, spec_res, spec_bw); + +disp(gparams) + +figure +subplot(211), plot([1:length(g)]*opts.samp_rate, g), ylabel('Gradient (G/cm)') +subplot(212), plot([1:length(g)]*opts.samp_rate, ktraj_g), ylabel('k-space (1/cm)'), xlabel('time (s)') + +if validate + gnew = g; ktraj_gnew = ktraj_g; + load test_data/epsi_3t_example + if max(abs(gnew - g)) > eps || max(abs(ktraj_gnew - ktraj_g)) > eps + error('Validation failed for 3T EPSI example') + else + disp('Validation passed for 3T EPSI example') + end +end +pause + +%% Design for a high performance, small-animal 1T MRI system +clear opts +opts.max_g = 45; % G/cm +opts.max_slew = 45 / .25; % G/cm/ms +opts.samp_rate = 2e-6; % s (system allows for 0.1 us, but this is much more than necessary) +opts.GAMMA = 1071; % Hz/G + +spatial_res = 0.2; % cm +spatial_fov = 16; % cm +spec_res = 5; % Hz +spec_bw = 275; % Hz - should cover from bicarbonate to lactate + +epsi_type = 'flyback'; ramp_sampling = 0; % high gradient strengths should allow for use of flyback without ramp sampling + +[g, ktraj_g, gparams] = design_epsi(epsi_type, ramp_sampling, spatial_res, spatial_fov, spec_res, spec_bw, opts); + +disp(gparams) + +figure +subplot(211), plot([1:length(g)]*opts.samp_rate, g), ylabel('Gradient (G/cm)') +subplot(212), plot([1:length(g)]*opts.samp_rate, ktraj_g), ylabel('k-space (1/cm)'), xlabel('time (s)') + +if validate + gnew = g; ktraj_gnew = ktraj_g; + load test_data/epsi_1t_example + if max(abs(gnew - g)) > eps || max(abs(ktraj_gnew - ktraj_g)) > eps + error('Validation failed for 1T EPSI example') + else + disp('Validation passed for 1T EPSI example') + end +end diff --git a/trajectories/epsi/test_data/epsi_1t_example.mat b/trajectories/epsi/test_data/epsi_1t_example.mat new file mode 100644 index 0000000000000000000000000000000000000000..1fea62c5ea943b2cb1c659ecf52b8088a6e2e405 GIT binary patch literal 248211 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 literal 0 HcmV?d00001 diff --git a/trajectories/epsi/test_data/epsi_3t_example.mat b/trajectories/epsi/test_data/epsi_3t_example.mat new file mode 100644 index 0000000000000000000000000000000000000000..ca4d75206ef14690af3a67585f65aee44eec526c GIT binary patch literal 75293 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

_0!8^`eyChO|r*8j_viZM{AC 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 Date: Wed, 9 Jul 2014 13:29:42 -0700 Subject: [PATCH 02/18] Added function to calculate NSA --- nsa.m | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 nsa.m diff --git a/nsa.m b/nsa.m new file mode 100644 index 0000000..5fd4864 --- /dev/null +++ b/nsa.m @@ -0,0 +1,65 @@ +function out = nsa(df, ne) +%This function calculates the number of signal averages (NSA) for an IDEAL +%acquisition with n species and ne echoes. Echo spacing (dTE) is assumed to +%be constant. +% +%SYNTAX: +%out = nsa(df,ne) +% +%INPUT: +%df is a vector containing the relative frequencies for the species of +%interest. +% +%ne is the number of echoes to acquire +% +%OUTPUT: +%out.NSA: Number of signal averages (i.e. noise performance) for each species +%out.CN: Condition number +%out.dte: echo spacings used to calculate condition number and NSA +% +%EXAMPLE: +%df = [620 414 288 0]; %lac pa-h2o ala pa @ 4.7T +%out = nsa(df,7); +% +%JWG 2013-03-07 + +df = df(:); +n = length(df); +t0 = 1e-3; %s +dte = (0.01:0.01:8)*1e-3; %s + +NSA = zeros(n,length(dte)); +CN = zeros(1,length(dte)); + +for ii = 1:length(dte) + for jj = 1:n + te = t0:dte(ii):t0+(ne-1)*dte(ii); + te = te(:); + A = exp(1i*2*pi*te*df.'); % te*df.' is matrix multiplication + inv_AHA = inv(A'*A); + NSA(jj,ii) = 1/inv_AHA(jj,jj); + CN(1,ii) = cond(A,2); + end +end + +%plot results +figure() +subplot(2,1,1),plot(dte*1e3,real(NSA.')) +hold on +title([int2str(ne) ' echo acquisition for ' int2str(length(df)) ' species']); +xlabel('\DeltaTE (ms)') +ylabel('NSA') +ylim([0 ne+1]) + +% now plot condition # +subplot(2,1,2) +plot(dte*1e3,CN) +ylim([1 10]) +xlabel('\DeltaTE (ms)') +ylabel('Condition #') + +% save results in structure +out.nsa = NSA; +out.cond_number = CN; +out.dte = dte; +end \ No newline at end of file From be8f2eb3e166dba40f093deefd55daccf4146298 Mon Sep 17 00:00:00 2001 From: agentmess Date: Wed, 9 Jul 2014 16:42:02 -0700 Subject: [PATCH 03/18] Added Spectral-Spatial RF Pulse MATLAB Toolbox --- .../spectral_spatial/Copyright_Information | 12 + RF_pulses/spectral_spatial/README | 34 ++ .../spectral_spatial/create_freq_specs.m | 46 ++ RF_pulses/spectral_spatial/examples/demo.m | 367 ++++++++++++ .../spectral_spatial/examples/demo_C13.m | 237 ++++++++ .../examples/demo_dualband_se.m | 98 ++++ .../spectral_spatial/examples/demo_mband.m | 217 +++++++ .../examples/demo_mband_phs.m | 132 +++++ RF_pulses/spectral_spatial/fftf.m | 82 +++ RF_pulses/spectral_spatial/fftr.m | 78 +++ RF_pulses/spectral_spatial/fir_expand.m | 408 +++++++++++++ RF_pulses/spectral_spatial/fir_linprog.m | 380 +++++++++++++ RF_pulses/spectral_spatial/fir_min_order.m | 231 ++++++++ .../spectral_spatial/fir_min_order_linprog.m | 226 ++++++++ .../spectral_spatial/fir_min_order_qprog.m | 228 ++++++++ .../fir_min_order_qprog_phs.m | 213 +++++++ RF_pulses/spectral_spatial/fir_minphase.m | 210 +++++++ .../spectral_spatial/fir_minphase_power.m | 211 +++++++ RF_pulses/spectral_spatial/fir_pm.m | 256 +++++++++ RF_pulses/spectral_spatial/fir_pm_minpow.m | 384 +++++++++++++ RF_pulses/spectral_spatial/fir_qprog.m | 318 +++++++++++ RF_pulses/spectral_spatial/fir_qprog_phs.m | 400 +++++++++++++ RF_pulses/spectral_spatial/grad_min_bridge.m | 117 ++++ RF_pulses/spectral_spatial/grad_mintrap.m | 70 +++ RF_pulses/spectral_spatial/grad_ss.m | 185 ++++++ RF_pulses/spectral_spatial/plot_spec.m | 35 ++ RF_pulses/spectral_spatial/plot_spec_phs.m | 49 ++ RF_pulses/spectral_spatial/rf_ripple.m | 119 ++++ RF_pulses/spectral_spatial/signa.m | 63 ++ RF_pulses/spectral_spatial/spec_interp.m | 130 +++++ .../spectral_spatial/spec_interp_nonuniform.m | 137 +++++ RF_pulses/spectral_spatial/spectral_fact.m | 64 +++ RF_pulses/spectral_spatial/ss_alias.m | 385 +++++++++++++ RF_pulses/spectral_spatial/ss_b1verse.m | 238 ++++++++ RF_pulses/spectral_spatial/ss_band_plot.m | 99 ++++ RF_pulses/spectral_spatial/ss_band_plot_phs.m | 99 ++++ RF_pulses/spectral_spatial/ss_design.m | 492 ++++++++++++++++ RF_pulses/spectral_spatial/ss_design_phs.m | 495 ++++++++++++++++ RF_pulses/spectral_spatial/ss_ep.m | 524 +++++++++++++++++ RF_pulses/spectral_spatial/ss_ep_phs.m | 535 +++++++++++++++++ RF_pulses/spectral_spatial/ss_flyback.m | 507 +++++++++++++++++ RF_pulses/spectral_spatial/ss_flyback_phs.m | 536 ++++++++++++++++++ RF_pulses/spectral_spatial/ss_globals.m | 114 ++++ RF_pulses/spectral_spatial/ss_opt.m | 186 ++++++ RF_pulses/spectral_spatial/ss_plot.m | 267 +++++++++ RF_pulses/spectral_spatial/ss_response_mxy.m | 67 +++ RF_pulses/spectral_spatial/ss_save.m | 236 ++++++++ RF_pulses/spectral_spatial/ss_save_dyn.m | 232 ++++++++ RF_pulses/spectral_spatial/ss_spect_correct.m | 332 +++++++++++ RF_pulses/spectral_spatial/ss_verse.m | 45 ++ 50 files changed, 11126 insertions(+) create mode 100644 RF_pulses/spectral_spatial/Copyright_Information create mode 100644 RF_pulses/spectral_spatial/README create mode 100644 RF_pulses/spectral_spatial/create_freq_specs.m create mode 100644 RF_pulses/spectral_spatial/examples/demo.m create mode 100644 RF_pulses/spectral_spatial/examples/demo_C13.m create mode 100644 RF_pulses/spectral_spatial/examples/demo_dualband_se.m create mode 100644 RF_pulses/spectral_spatial/examples/demo_mband.m create mode 100644 RF_pulses/spectral_spatial/examples/demo_mband_phs.m create mode 100644 RF_pulses/spectral_spatial/fftf.m create mode 100644 RF_pulses/spectral_spatial/fftr.m create mode 100644 RF_pulses/spectral_spatial/fir_expand.m create mode 100644 RF_pulses/spectral_spatial/fir_linprog.m create mode 100644 RF_pulses/spectral_spatial/fir_min_order.m create mode 100644 RF_pulses/spectral_spatial/fir_min_order_linprog.m create mode 100644 RF_pulses/spectral_spatial/fir_min_order_qprog.m create mode 100644 RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m create mode 100644 RF_pulses/spectral_spatial/fir_minphase.m create mode 100644 RF_pulses/spectral_spatial/fir_minphase_power.m create mode 100644 RF_pulses/spectral_spatial/fir_pm.m create mode 100644 RF_pulses/spectral_spatial/fir_pm_minpow.m create mode 100644 RF_pulses/spectral_spatial/fir_qprog.m create mode 100644 RF_pulses/spectral_spatial/fir_qprog_phs.m create mode 100644 RF_pulses/spectral_spatial/grad_min_bridge.m create mode 100644 RF_pulses/spectral_spatial/grad_mintrap.m create mode 100644 RF_pulses/spectral_spatial/grad_ss.m create mode 100644 RF_pulses/spectral_spatial/plot_spec.m create mode 100644 RF_pulses/spectral_spatial/plot_spec_phs.m create mode 100644 RF_pulses/spectral_spatial/rf_ripple.m create mode 100644 RF_pulses/spectral_spatial/signa.m create mode 100644 RF_pulses/spectral_spatial/spec_interp.m create mode 100644 RF_pulses/spectral_spatial/spec_interp_nonuniform.m create mode 100644 RF_pulses/spectral_spatial/spectral_fact.m create mode 100644 RF_pulses/spectral_spatial/ss_alias.m create mode 100644 RF_pulses/spectral_spatial/ss_b1verse.m create mode 100644 RF_pulses/spectral_spatial/ss_band_plot.m create mode 100644 RF_pulses/spectral_spatial/ss_band_plot_phs.m create mode 100644 RF_pulses/spectral_spatial/ss_design.m create mode 100644 RF_pulses/spectral_spatial/ss_design_phs.m create mode 100644 RF_pulses/spectral_spatial/ss_ep.m create mode 100644 RF_pulses/spectral_spatial/ss_ep_phs.m create mode 100644 RF_pulses/spectral_spatial/ss_flyback.m create mode 100644 RF_pulses/spectral_spatial/ss_flyback_phs.m create mode 100644 RF_pulses/spectral_spatial/ss_globals.m create mode 100644 RF_pulses/spectral_spatial/ss_opt.m create mode 100644 RF_pulses/spectral_spatial/ss_plot.m create mode 100644 RF_pulses/spectral_spatial/ss_response_mxy.m create mode 100644 RF_pulses/spectral_spatial/ss_save.m create mode 100644 RF_pulses/spectral_spatial/ss_save_dyn.m create mode 100644 RF_pulses/spectral_spatial/ss_spect_correct.m create mode 100644 RF_pulses/spectral_spatial/ss_verse.m diff --git a/RF_pulses/spectral_spatial/Copyright_Information b/RF_pulses/spectral_spatial/Copyright_Information new file mode 100644 index 0000000..b08cc88 --- /dev/null +++ b/RF_pulses/spectral_spatial/Copyright_Information @@ -0,0 +1,12 @@ +Copyright © 2011, Board of Trustees, Leland Stanford Junior University and The Regents of the University of California. +All Rights Reserved. + +Permission to use, copy, modify, and distribute this software and its documentation for educational, research and non-profit purposes, without fee, and without a written agreement is hereby granted, provided that the above copyright notice, this paragraph and the following three paragraphs appear in all copies. + +Permission to incorporate this software into commercial products may be obtained by contacting the University of California and Leland Stanford Junior University. + +This software program and documentation are copyrighted by The Regents of the University of California and the Leland Stanford Junior University Board of Trustees. The software program and documentation are supplied "as is", without any accompanying services from The Regents or Board of Trustees. The Regents and Board of Trustees does not warrant that the operation of the program will be uninterrupted or error-free. The end-user understands that the program was developed for research purposes and is advised not to rely exclusively on the program for any reason. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA OR LELAND STANFORD JUNIOR UNIVERSITY BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA AND LELAND STANFORD JUNIOR UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND ANY STATUTORY WARRANTY OF NON-INFRINGEMENT. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA AND LELAND STANFORD JUNIOR UNIVERSITY HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + diff --git a/RF_pulses/spectral_spatial/README b/RF_pulses/spectral_spatial/README new file mode 100644 index 0000000..13d9fb0 --- /dev/null +++ b/RF_pulses/spectral_spatial/README @@ -0,0 +1,34 @@ +Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +Authors: Adam B. Kerr and Peder E. Z. Larson + +(c) 2007-2011 Board of Trustees, Leland Stanford Junior University and + The Regents of the University of California. +All Rights Reserved. +====================== + +This package includes Matlab functions to design spectral-spatial RF pulses (also known as spatial-spectral RF pulses) for application to magnetic resonance spectroscopy and imaging. See the "examples/" folder for sample code and pulse designs. + +Requirements: +-Signal Processing Toolbox (MathWorks) +-Optimization Toolbox (MathWorks) +-rf_tools package : This is available for download at http://rsl.stanford.edu/research/software.html + +====================== + +All works deriving from this package must be properly cited. Please include the following sources of support: +- Center for Advanced Magnetic Resonance Technology at Stanford (NIH P41-RR009784) +- Hyperpolarized MRI Technology Resource Center at UCSF (NIH P41-EB013598) + +The following references describe the design methods used: +- Kerr, A.B., Larson,P. E., Lustig, M., Cunningham, C. H., Chen, A. P., Vigneron, D. B., and Pauly, +J. M. Multiband spectral-spatial design for high-field and hyperpolarized C-13 +applications. In Proceedings of the 16th Annual Meeting of ISMRM (Toronto, +2008), p. 226. +- Larson, P. E. Z., Kerr, A. B., Chen, A. P., Lustig, M., +Zierhut, M. L., Hu, S., Cunningham, C. H., Pauly, J. M., Kurhanewicz, J., and +Vigneron, D. B. Multiband excitation pulses for hyperpolarized 13C dynamic +chemical shift imaging. J Magn Reson 194, 1 (Sept. 2008), 121--127. + +====================== + +For additional information, please contact Peder Larson (peder.larson@ucsf.edu) or Adam Kerr (akerr@stanford.edu) \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/create_freq_specs.m b/RF_pulses/spectral_spatial/create_freq_specs.m new file mode 100644 index 0000000..9cf5997 --- /dev/null +++ b/RF_pulses/spectral_spatial/create_freq_specs.m @@ -0,0 +1,46 @@ +function [fspec, a_angs, d] = create_freq_specs(mets) +% CREATE_FREQ_SPECS - Helper function for creating spectral-spatial +% frequency specifications +% +% [fspec, a_angs, d] = create_freq_specs(mets); +% +% INPUT +% mets - structure containing: +% mets(i).f - center frequency of bands (Hz) +% mets(i).df - bandwidth of bands (Hz) +% mets(i).ang - flip angle of bands (degress) +% mets(i).d - ripple of bands (Mxy, default = .01) +% +% OUTPUT +% spec, a_angs, d - inputs for ss_design() + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2014 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + +for n = 1:length(mets) + a_angs(n) = mets(n).ang*pi/180; + fspec(2*n-1) = mets(n).f - mets(n).df; + fspec(2*n) = mets(n).f + mets(n).df; + if isfield(mets(n), 'd') && ~isempty(mets(n).d) + d(n) = mets(n).d; + else + d(n) = .01; + end +end + +% by default, center frequency specification +fmid = (mets(1).f+mets(end).f)/2; +fspec = fspec - fmid; diff --git a/RF_pulses/spectral_spatial/examples/demo.m b/RF_pulses/spectral_spatial/examples/demo.m new file mode 100644 index 0000000..554cf3d --- /dev/null +++ b/RF_pulses/spectral_spatial/examples/demo.m @@ -0,0 +1,367 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% Reset SS package globals +% +ss_globals; +fprintf(1, '************************************************************\n') +fprintf(1, 'Here are some parameters that can be set:\n'); +fprintf(1, 'You can type "help ss_globals" for more information on\n'); +fprintf(1, 'each of them.\n'); +fprintf(1, '************************************************************\n') +fprintf(1, '\n'); +ss_opt([]) +fprintf(1, 'Hit key to continue:'); +pause; + +clc; + +% Set up small-tip water/fat spectral/spatial +% + +% Water/fat chemical shifts +% +df = 0.5e-6; % Conservative shim requirement +water = 4.7e-6; +fat2 = 1.3e-6; +fat1 = 0.9e-6; + +% Convert to frequency +% +B0 = 15000; +gamma_h = 4258; +fspec = B0 * ([(fat1-df) (fat2+df) (water-df) (water+df)]-water) * gamma_h; + +water_ctr = (fspec(3) + fspec(4))/2; +fat_ctr = (fspec(1) + fspec(2))/2; + + +% Set up pulse parameters +% +ang = pi/6; +z_thk = 1; +z_tb = 4; + +% Set up spectral/spatial specifications +% +a = [0 1]; +d = [0.02 0.005]; +ptype = 'ex'; +z_ftype='ls'; % Use this to get rid of "Conolly Wings" +z_d1 = 0.01; +z_d2 = 0.01; +f_ctr = []; %water_ctr; + +s_ftype = 'min'; % min-phase spectral +ss_type = 'Flyback Half'; % Flyback, symmetric frequency +dbg = 0; % dbg level + % 0 -none, 1 - little, 2 -lots, ... + +opt = ss_opt({'Max Duration', 16e-3, ... + 'Num Lobe Iters', 5, ... + 'Min Order', 1, ... + 'Max B1', 0.2, ... + 'Spect Correct', 0, ... + 'SLR', 0, ... + 'Verse Fraction', 0.9, ... + 'B1 Verse', 0}); + +if 1 % set to 0 to skip to ss-spect-correct demo + +fprintf(1, '************************************************************\n') +fprintf(1, 'Here''s an example of a water/fat spectral spatial pulse for 1.5T\n\n'); +fprintf(1, 'The pulse is a ''Flyback Half'' type, meaning that it\n'); +fprintf(1, 'uses a flyback trajectory, and has a symmetric frequency\n'); +fprintf(1, 'response.\n'); +fprintf(1, 'The frequency spec includes a passband at [%3f,%3f]\n',fspec(3),fspec(4)); +fprintf(1, 'and stopbands at [%3f,%3f]\n',fspec(1),fspec(2)); +fprintf(1, '************************************************************\n') +fprintf(1, '\n'); + +[g,rf,fs,z,f,mxy] = ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); + +set(gcf,'Name', 'Water/Fat Flyback Half'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc +fprintf(1, '************************************************************\n') +fprintf(1, 'By default the spectral-spatial package uses the shortest possible\n'); +fprintf(1, 'RF pulse, but this can cause large ripples outside of the specified \n'); +fprintf(1, 'bands which also results in higher peak and total power.\n'); +fprintf(1, 'The ripples and power can be reduced by turning off the\n'); +fprintf(1, '''Min Order'' option, in which case the resulting pulses will become longer\n'); +fprintf(1, '(approximately the ''Max Duration'')\n'); +fprintf(1, '************************************************************\n') +fprintf(1, '\n'); + +opt = ss_opt({'Min Order', 0}); +[g,rf,fs,z,f,mxy] = ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); + +set(gcf,'Name', 'Water/Fat Flyback Half'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc +fprintf(1, '************************************************************\n') +fprintf(1, 'The pulse design will fail if the specifications are too aggressive\n'); +fprintf(1, 'In the following case, the Max Duration is too short\n'); +fprintf(1, 'ss_design returns an approximate solution with increased ripples.\n'); +fprintf(1, '(This could be corrected by reducing bandwidths, increasing ripple,\n'); +fprintf(1, 'or increasing the Max Duration.)\n'); +fprintf(1, '************************************************************\n') +fprintf(1, '\n'); + +opt = ss_opt({'Max Duration', 6e-3, ... + 'Min Order', 1}); +[g,rf,fs,z,f,mxy] = ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); + +set(gcf,'Name', 'Water/Fat Flyback Half - Increased ripple'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc +fprintf(1, '************************************************************\n') +fprintf(1, 'Here''s an example of how we can verse the gradient lobes\n'); +fprintf(1, 'to reduce the peak B1\n'); +fprintf(1, '************************************************************\n') +fprintf(1, '\n'); + + +opt = ss_opt({'Max Duration', 16e-3, ... + 'Num Lobe Iters', 5, ... + 'Max B1', 0.03, ... + 'Spect Correct', 0, ... + 'SLR', 0, ... + 'Verse Fraction', 0.9, ... + 'B1 Verse', 1}); + +[g,rf,fs,z,f,mxy] = ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); + +set(gcf,'Name', 'Water/Fat Flyback Half - B1 Min'); + +opt = ss_opt({'Max Duration', 16e-3, ... + 'Num Lobe Iters', 5, ... + 'Max B1', 0.2, ... + 'Spect Correct', 0, ... + 'SLR', 0, ... + 'Verse Fraction', 0.9, ... + 'B1 Verse', 0}); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc; +fprintf(1, '************************************************************\n') +fprintf(1, 'In contrast, here''s a Flyback Half pulse with symmetric response\n'); +fprintf(1, 'but with the response specified to be centered on water.\n'); +fprintf(1, 'Note that the pulse has a much different response from the\n'); +fprintf(1, 'previous design in which the center was not specified.\n'); +fprintf(1, '************************************************************\n') +fprintf(1, '\n'); + +f_ctr = water_ctr; +[g_water,rf_water,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'Water/Fat Flyback Half - Fat Center'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc; +fprintf(1, '************************************************************\n') +fprintf(1, 'We can also emulate a conventional LP design as a comparison\n'); +fprintf(1, 'to our multiband specification\n'); +fprintf(1, 'Note that the transition region on the multiband is narrower\n'); + +f_ctr = water_ctr; + +% get sampling freq from previous soln and duration of rf +% +zidx = find(g_water == 0); +fs_max = 1 / (zidx(2) * SS_TS); +flp = fspec; +flp(1) = -0.5*fs_max + f_ctr; +ss_opt({'Max Duration', 11e-3}); + + +[g_lp,rf_lp,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], flp, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'Water/Fat Flyback Half - LP Emulate'); + +fprintf(1, 'The power is lower too: %f compared to %f\n', ... + sum(abs(rf).^2), sum(abs(rf_lp).^2)); +fprintf(1, '************************************************************\n') + +% Plot spectral responses +% +z = 0; +f = linspace(-fs_max/2, fs_max/2, 200); +mxy = ss_response_mxy(g,rf,z,f,SS_TS,SS_GAMMA); +mxy_lp = ss_response_mxy(g_lp,rf_lp,z,f,SS_TS,SS_GAMMA); + +figure; +plot([f(:),f(:)],abs([mxy(:) mxy_lp(:)])); +hold on; +a2 = [a(:).'; a(:).']; +a2 = a2(:).'; +plot_spec(fspec,sin(ang)*a2,d); +title('Spectral Response'); +xlabel('Frequency'); +ylabel('M_{xy}'); +legend('Multiband', 'LP'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc; +fprintf(1, '************************************************************\n') +fprintf(1, 'What happens if we do not require a symmetric frequency\n'); +fprintf(1, 'response? Good question. We get a shorter pulse still!!\n'); +fprintf(1, '************************************************************\n') + +ss_opt({'Max Duration', 16e-3}); +ss_type = 'Flyback Whole'; +f_ctr = []; + +[g_fw,rf_fw,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'Water/Fat Flyback Whole'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc; +fprintf(1, '************************************************************\n'); +fprintf(1, 'What about if we design a pulse based on the EP trajectory?\n'); +fprintf(1, 'Shorter still... but there is some more ripple in the stopband\n'); +fprintf(1, '************************************************************\n'); + +ss_type = 'EP Whole'; +[g_ew,rf_ew,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'Water/Fat EP Whole'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +clc; +fprintf(1, '************************************************************\n'); +fprintf(1, 'We can design the same pulse centered on the stopband\n'); +fprintf(1, 'to reduce the ripple, but this won''t work well when\n'); +fprintf(1, 'we have multiple stopbands\n'); +fprintf(1, '************************************************************\n'); + +ss_type = 'EP Whole'; +f_ctr = fat_ctr; +[g_fw,rf_fw,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'Water/Fat EP Whole - Fat Ctr'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +end; + +clc; +fprintf(1, '************************************************************\n'); +fprintf(1, 'There is a more sophisticated solution....\n'); +fprintf(1, 'The ripple arises from the nonuniform sampling in time\n'); +fprintf(1, 'that occurs for EP trajectories\n'); +fprintf(1, '************************************************************\n'); + +ss_type = 'EP Whole'; +f_ctr = []; +ss_opt({'Spect Correct', 1}); +[g_fw,rf_fw,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'Water/Fat EP Whole - Spect Correct'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + + +clc +fprintf(1, '************************************************************\n'); +fprintf(1, 'Here''s a C13 spectral-spatial pulse, symmetric EP,\n'); +fprintf(1, 'for lactate excitation only\n'); +fprintf(1, '(not exciting pyruvate or alanine)\n'); +fprintf(1, '************************************************************\n'); + +% Reset SS package globals +% +ss_opt([]); +ss_globals; + +lac = 165; +pyr_hyd = 40; +ala = -45; +pyr = -230; + +df_stop = 50/2; +df_pass = 50/2; + +fspec = [(pyr-df_stop) (pyr+df_stop) (ala-df_stop) (ala+df_stop)... + (pyr_hyd-df_stop) (pyr_hyd+12) (lac-12) (lac+df_pass)]; +fspec = [(pyr-df_stop) (pyr+df_stop) (ala-df_stop) (ala+df_stop)... + (lac-df_pass) (lac+df_pass)]; + +fspec = fspec - lac; +a = [0 0 1]; +d = [5e-4 5e-4 1e-2]; +fctr = (pyr + ala)/2 - lac; +fctr = []; + +ang = asin(0.1); +z_thk = 9.4; +z_tb = 8; + +ptype = 'ex'; +z_ftype='ls'; +z_d1 = 0.005; +z_d2 = 0.01; + +s_ftype = 'min'; +ss_type = 'EP Whole'; + +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 16e-3, ... + 'Num Lobe Iters', 5, ... + 'Max B1', 0.45, ... + 'Num Fs Test', 100, ... + 'Verse Fraction', 0, ... + 'SLR', 0, ... + 'B1 Verse', 0, ... + 'Spect Correct', 1}); + +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a*ang, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr, 0); + +set(gcf,'Name', '13C-Lactate only Excitation'); diff --git a/RF_pulses/spectral_spatial/examples/demo_C13.m b/RF_pulses/spectral_spatial/examples/demo_C13.m new file mode 100644 index 0000000..a3b3a08 --- /dev/null +++ b/RF_pulses/spectral_spatial/examples/demo_C13.m @@ -0,0 +1,237 @@ +% Demonstration of hyperpolarized C-13 pulse designs, including explanation +% of some key pulse characteristics + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2014 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% Reset SS package globals +% +clear all +ss_opt([]); +ss_globals; + + +%% multiband pulse +fprintf(1, '\nHere''s a C13 multiband excitation pulse, for [1-13C]pyr+13C-urea dynamic imaging on a 3T clinical system\n\n'); + +ss_opt([]); % Reset all options + +% GENERAL PULSE PARAMETERS +ss_type = 'EP Whole'; % Echo-planar design +ptype = 'ex'; % excitation pulse +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 25e-3, ... + 'Max B1', 0.5}); + +% SPECTRAL PULSE PARAMETERS +B0 = 3e4; % G +df = 0.5e-6 * B0 * SS_GAMMA; % 0.5 ppm = gamma_C13 * B0 * 0.5e-6 +% metabolite frequency (Hz) freq bandwidth (Hz) flip angle (deg) allowed ripple +mets(1).name = 'urea'; mets(1).f = -465; mets(1).df = 1.5*df; mets(1).ang = 6; mets(1).d = .005; +mets(2).name = 'pyr'; mets(2).f = -230; mets(2).df = 2*df; mets(2).ang = 6; mets(2).d = .002; +mets(3).name = 'ala'; mets(3).f = -45; mets(3).df = 1.5*df; mets(3).ang = 12; mets(3).d = .005; +mets(4).name = 'pyrh'; mets(4).f = 40; mets(4).df = 1*df; mets(4).ang = 2.5; mets(4).d = .015; +mets(5).name = 'lac'; mets(5).f = 165; mets(5).df = 1.5*df; mets(5).ang = 12; mets(5).d = .005; + +% create vectors of angles, ripples, and band edges for input to pulse design +[fspec, a_angs, d] = create_freq_specs(mets); +fctr = 0; % force pulse design to optimize for center of frequency specification +s_ftype = 'lin'; % linear-phase spectral filter + +% SPATIAL PULSE PARAMETERS +z_thk = .5; % thickness (cm) +z_tb = 3; % time-bandwidth, proportional to profile sharpness +z_ftype='ls'; % least-squares filter design +z_d1 = 0.01; z_d2 = 0.01; % slice profile pass and stop-band ripples, respectively + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +%% multiband pulse - minimum phase +fprintf(1, '\nThe pulse duration can be shortened by using a Minimum-phase spectral filter\n'); +fprintf(1, 'This will add some phase offset between metabolites and may slightly distort lineshapes\n'); +fprintf(1, 'But under most circumstances won''t reduce SNR and allows for shorter TEs\n\n'); + +s_ftype = 'min'; % minimum-phase spectral filter (will add phase between metabolite peaks, use 'lin' if this is undesireable) + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +%% multiband pulse - thicker slice +fprintf(1, '\nIncreasing slice thickness from 5mm to 1cm will allow for a higher\n'); +fprintf(1, 'spatial time-bandwidth and a sharper slice profile\n\n'); + +z_thk = 1; % thickness (cm) +z_tb = 5; % time-bandwidth, proportional to profile sharpness + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); + +fprintf(1,'Hit any key to continue:\n'); +pause; +%% minimum phase - spectral correction +fprintf(1, '\nTurning on the ''Spect Correct'' option will to a limited extent correct\n'); +fprintf(1, 'chemical-shift slice misregistration.\n'); +fprintf(1, 'NOTE: If the frequency specification bandwidth is too large, \n'); +fprintf(1, 'this can fail and result in high RF pulse powers.\n\n'); + +opt = ss_opt({'Spect Correct', 1}); % correct for chemical-shift slice misregistration. This will work for a limited range of frequency shifts + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +%% short duration pyruvate-lactate pulse + +fprintf(1, '\nHere''s a short C13 multiband excitation pulse, for [1-13C]pyr/lac imaging on a 3T clinical system\n'); +fprintf(1, 'with unspecified flip angles for other metabolites. Similar to a design used in first-in-man clinical trial.\n\n'); + +clear all; ss_opt([]); ss_globals; % Reset all options + +% GENERAL PULSE PARAMETERS +ss_type = 'EP Whole'; +ptype = 'ex'; % excitation pulse +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 8e-3, ... + 'Max B1', 0.5, ... + 'Spect Correct', 1}); + +% SPECTRAL PULSE PARAMETERS +B0 = 3e4; % G +df = 0.5e-6 * B0 * SS_GAMMA; % 0.5 ppm = gamma_C13 * B0 * 0.5e-6 +% metabolite frequency (Hz) freq bandwidth (Hz) flip angle (deg) allowed ripple +mets(1).name = 'pyr'; mets(1).f = -230; mets(1).df = 2*df; mets(1).ang = 6; mets(1).d = .005; +mets(2).name = 'lac'; mets(2).f = 165; mets(2).df = 2*df; mets(2).ang = 12; mets(2).d = .005; + +% create vectors of angles, ripples, and band edges for input to pulse design +[fspec, a_angs, d] = create_freq_specs(mets); +fctr = 0; % force pulse design to optimize for center of frequency specification +s_ftype = 'lin'; % linear-phase spectral filter + +% SPATIAL PULSE PARAMETERS +z_thk = .5; % thickness (cm) +z_tb = 3; % time-bandwidth, proportional to profile sharpness +z_ftype='ls'; % least-squares filter design +z_d1 = 0.01; z_d2 = 0.01; % slice profile pass and stop-band ripples, respectively + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); + +fprintf(1,'Hit any key to continue:\n'); +pause; + + +%% lactate-only pulse +fprintf(1, '\nHere''s a C13 single-band excitation pulse, for a 3T clinical system\n\n'); + +clear all; ss_opt([]); ss_globals; % Reset all options + +% GENERAL PULSE PARAMETERS +ss_type = 'EP Whole'; +ptype = 'ex'; % excitation pulse +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 25e-3, ... + 'Max B1', 0.5, ... + 'Spect Correct', 1}); + +% SPECTRAL PULSE PARAMETERS - large pass/stop bands chosen for wide +% supression regions +B0 = 3e4; % G +df = 0.5e-6 * B0 * SS_GAMMA; % 0.5 ppm = gamma_C13 * B0 * 0.5e-6 +% metabolite frequency (Hz) freq bandwidth (Hz) flip angle (deg) +mets(1).name = 'pyr'; mets(1).f = -230; mets(1).df = 2*df; mets(1).ang = 0; +mets(2).name = 'ala'; mets(2).f = -45; mets(2).df = 3*df; mets(2).ang = 0; +mets(3).name = 'pyrh'; mets(3).f = 40; mets(3).df = 2*df; mets(3).ang = 0; +mets(4).name = 'lac'; mets(4).f = 165; mets(4).df = 2*df; mets(4).ang = 90; + +% create vectors of angles, ripples, and band edges for input to pulse design +[fspec, a_angs, d] = create_freq_specs(mets); +fctr = 0; % force pulse design to optimize for center of frequency specification +s_ftype = 'min'; % minimum-phase spectral filter + +% SPATIAL PULSE PARAMETERS +z_thk = .5; % thickness (cm) +z_tb = 4; % time-bandwidth, proportional to profile sharpness +z_ftype='ls'; % least-squares filter design +z_d1 = 0.01; z_d2 = 0.01; % slice profile pass and stop-band ripples, respectively + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); + +fprintf(1,'Hit any key to continue:\n'); +pause; + +%% lactate-only for high-field, small animal system +fprintf(1, '\nHere''s a C13 single-band excitation pulse, for a 14T small-animal system\n\n'); + +clear all; ss_opt([]); ss_globals; % Reset all options + +% GENERAL PULSE PARAMETERS +ss_type = 'EP Whole'; +ptype = 'ex'; % excitation pulse +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 10e-3, ... + 'Max B1', 1.5, ... % G + 'Max Grad', 50, ... % G/cm + 'Max Slew', 200, ... % G/cm/ms + 'Verse Fraction', 0.5, ... + 'Spect Correct', 1}); + +% SPECTRAL PULSE PARAMETERS - large pass/stop bands chosen for wide +% supression regions +B0 = 14.1e4; % G +df = 0.5e-6 * B0 * SS_GAMMA; % 0.5 ppm = gamma_C13 * B0 * 0.5e-6 +% metabolite frequency (Hz) freq bandwidth (Hz) flip angle (deg) +mets(1).name = 'pyr'; mets(1).f = -1080; mets(1).df = 2*df; mets(1).ang = 0; +mets(2).name = 'ala'; mets(2).f = -210; mets(2).df = 2*df; mets(2).ang = 0; +mets(3).name = 'pyrh'; mets(3).f = 190; mets(3).df = 2*df; mets(3).ang = 0; +mets(4).name = 'lac'; mets(4).f = 775; mets(4).df = 2*df; mets(4).ang = 90; + +% create vectors of angles, ripples, and band edges for input to pulse design +[fspec, a_angs, d] = create_freq_specs(mets); +fctr = 0; % force pulse design to optimize for center of frequency specification +s_ftype = 'min'; % minimum-phase spectral filter + +% SPATIAL PULSE PARAMETERS +z_thk = .5; % thickness (cm) +z_tb = 3.5; % time-bandwidth, proportional to profile sharpness +z_ftype='ls'; % least-squares filter design +z_d1 = 0.01; z_d2 = 0.01; % slice profile pass and stop-band ripples, respectively + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); diff --git a/RF_pulses/spectral_spatial/examples/demo_dualband_se.m b/RF_pulses/spectral_spatial/examples/demo_dualband_se.m new file mode 100644 index 0000000..259c431 --- /dev/null +++ b/RF_pulses/spectral_spatial/examples/demo_dualband_se.m @@ -0,0 +1,98 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% Reset SS package globals +% +ss_opt([]); +ss_globals; + + +%% +fprintf(1, '\nHere''s a multiband spin-echo pulse for MR spectroscopy at 1.5T\n'); +fprintf(1, 'to not refocus fat, fully-refocus choline, and partially refocus water\n'); +fprintf(1, '(similar to Schricker et al, Magn Reson Med 46: 1079-1087 (2001), DOI: 10.1002/mrm.1302 )\n'); + + +% Water/fat chemical shifts (ppm) +% +df = 0.5e-6; % Conservative +-0.5 ppm shim requirement + +fat1 = 0.9e-6; +fat2 = 1.3e-6; +cho = 3e-6; +water = 4.7e-6; + +% Convert to frequency specification +% +B0 = 15000; +gamma_h = 4258; +% bands: fat, cho, water +fspec = B0 * ([(fat1-df) (fat2+df) (cho-df) (cho+df) (water-df) (water+df)]-water) * gamma_h; +mxy = [0 1 0.1]; % refocused mxy for a single 180 pulse +d = [0.005 0.01 0.005]; % mxy ripple values + +fat_ctr = ((fat1+fat2)/2-water)*B0 * gamma_h; +cho_ctr = (cho-water)*B0 * gamma_h; +water_ctr = 0; + +% Set up pulse parameters +% +z_thk = 1; % cm +z_tb = 5; % time-bandwidth + +% Set up spectral/spatial specifications +% + +a_ang = 2*asin(sqrt(mxy)); % convert Mxy amplitude to flip angle +ptype = 'se'; % pulse type: 'se' spin-echo +z_ftype='ls'; % Use this to get rid of "Conolly Wings" +z_d1 = 0.01; +z_d2 = 0.01; +f_ctr = cho_ctr; + +s_ftype = 'max'; % max-phase spectral +ss_type = 'Flyback Whole'; +dbg = 0; % dbg level: 0 -none, 1 - little, 2 -lots, ... + +ss_opt([]); +opt = ss_opt({'Max Duration', 30e-3, ... % ms + 'Num Lobe Iters', 5, ... + 'Max B1', 0.15, ... + 'Spect Correct', 0, ... + 'SLR', 1, ... + 'Verse Fraction', 0.8, ... + 'Max Grad', 4, ... + 'Max Slew', 15, ... + 'Min Order', 1}) + + +[g,rf,z,f,mxy] = ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'MRS Dual-band spin-echo pulse'); + +fprintf(1,'Hit any key to continue:\n'); +pause + +%% +fprintf(1, '\nBy default the spectral-spatial package uses the shortest possible RF pulse,\n'); +fprintf(1, 'but this can cause large ripples outside of the specified bands, as seen in this pulse.\n'); +fprintf(1, 'The ripples, and also the peak and total power, are reduced by turning off the\n'); +fprintf(1, 'Min Order option, in which case the resulting pulses are the Max Duration:\n'); + +opt = ss_opt({'Min Order', 0}) +[g,rf,z,f,mxy] = ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_ang, d, ptype, ... + z_ftype, s_ftype, ss_type, f_ctr, dbg); +set(gcf,'Name', 'MRS Dual-band spin-echo pulse - Reduced power, longer duration'); diff --git a/RF_pulses/spectral_spatial/examples/demo_mband.m b/RF_pulses/spectral_spatial/examples/demo_mband.m new file mode 100644 index 0000000..d7e4ac6 --- /dev/null +++ b/RF_pulses/spectral_spatial/examples/demo_mband.m @@ -0,0 +1,217 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% Reset SS package globals +% +ss_opt([]); +ss_globals; + + +%% +fprintf(1, '\nHere''s a C13 multiband slab (6cm) excitation pulse, for pyr+urea dynamic imaging\n'); + +% setup flip angles and bandwidths, and ripple +df = 0.5e-6 * 30000 * 1070;% 0.5 ppm = gamma_C13 * 30000 * 0.5e-6 + +mets(5).name = 'lac'; mets(5).f = 165; mets(5).df = 1.5*df; mets(5).ang = 12; mets(5).d = .005; +mets(4).name = 'pyrh'; mets(4).f = 40; mets(4).df = 1*df; mets(4).ang = 2.5; mets(4).d = .015; +mets(3).name = 'ala'; mets(3).f = -45; mets(3).df = 1.5*df; mets(3).ang = 12; mets(3).d = .005; +mets(2).name = 'pyr'; mets(2).f = -230; mets(2).df = 2*df; mets(2).ang = 6; mets(2).d = .002; +mets(1).name = 'urea'; mets(1).f = -465; mets(1).df = 2*df; mets(1).ang = 6; mets(1).d = .002; + +Npe = 8; % number of phase encode steps + +% create vectors of angles, ripples, and band edges +clear a_angs d fspec +for n = 1:length(mets) + a_angs(n) = mets(n).ang*pi/180; + d(n) = mets(n).d; + fspec(2*n-1) = mets(n).f - mets(n).df; + fspec(2*n) = mets(n).f + mets(n).df; + disp([mets(n).name ' metab fraction remaining after Npe = ' int2str(Npe) ' encodes: ' num2str(cos(a_angs(n))^Npe)]) +end +disp(''); + +ang = max(a_angs); + +fmid = (mets(1).f+mets(end).f)/2; +fspec = fspec - fmid; +fctr = 0; + +z_thk = 6; z_tb = 4; ss_type = 'Flyback Whole'; + +ptype = 'ex'; +z_ftype='ls'; +z_d1 = 0.002; +z_d2 = 0.01; + +s_ftype = 'lin'; + +ss_opt([]); % Reset all options +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 20e-3, ... + 'Num Lobe Iters', 15, ... + 'Max B1', 1.6, ... + 'Num Fs Test', 100, ... + 'Verse Fraction', 0.2, ... + 'SLR', 0, ... + 'B1 Verse', 0, ... + 'Min Order', 1,... + 'Spect Correct', 1}); + +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr, 0); + +g_opt = g; +rf_opt = rf; + +% Now compare spectral profiles at z = 0 +ftest = [min([fspec -fs/2]):max([fs/2 fspec])]; +mxy_new = ss_response_mxy(g_opt, rf_opt, 0, ftest, SS_TS, SS_GAMMA); + +figure; +hold on; +nband = length(fspec)/2; +for band = 1:nband, + if a_angs(band) > 0, + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)+z_d1), 'k--'); + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)-z_d1), ... + 'k--'); + else + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)), 'k--'); + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)), ... + 'k--'); + end; +end; +plot(ftest, abs(mxy_new)); +plot([-fs/2 -fs/2], [0 sin(ang)], 'g--'); +plot([fs/2 fs/2], [0 sin(ang)], 'g--'); +hold off + +figure; +subplot(211) +t_opt = [0:length(g_opt)-1] * SS_TS * 1e3; +plot(t_opt, g_opt); +title('Gradient Waveforms'); + +subplot(212) +plot(t_opt, real(rf_opt),t_opt, imag(rf_opt)); +title('RF Waveforms'); + + + +% fprintf(1,'Do you want to save file in Chuck''s format? \n'); +% ss_save(g_opt,rf_opt,ang,z_thk); + +fprintf(1,'Hit any key to continue:\n'); +pause; + + + +%% +fprintf(1, '************************************************************\n'); +fprintf(1, 'Here''s a C13 multiband slice (5mm) excitation pulse, for pyr dynamic imaging\n'); + +% setup flip angles and bandwidths, and ripple +df = 0.5e-6 * 30000 * 1070;% 0.5 ppm = gamma_C13 * 30000 * 0.5e-6 +clear a_angs d fspec mets +mets(1).name = 'pyr'; mets(1).f = -230; mets(1).df = 2*df; mets(1).ang = 3.3; mets(1).d = .005; +mets(2).name = 'ala'; mets(2).f = -45; mets(2).df = 1.3*df; mets(2).ang = 20; mets(2).d = .015; +mets(3).name = 'pyrh'; mets(3).f = 40; mets(3).df = 1*df; mets(3).ang = 0; mets(3).d = .02; +mets(4).name = 'lac'; mets(4).f = 165; mets(4).df = 1.3*df; mets(4).ang = 20; mets(4).d = .01; + +Npe = 8; % number of phase encode steps + +% create vectors of angles, ripples, and band edges +for n = 1:length(mets) + a_angs(n) = mets(n).ang*pi/180; + d(n) = mets(n).d; + fspec(2*n-1) = mets(n).f - mets(n).df; + fspec(2*n) = mets(n).f + mets(n).df; + disp([mets(n).name ' metab fraction remaining after Npe = ' int2str(Npe) ' encodes: ' num2str(cos(a_angs(n))^Npe)]) +end +disp(''); + +ang = max(a_angs); + +fmid = (mets(1).f+mets(end).f)/2; +fspec = fspec - fmid; +fctr = 0; + +z_thk = 0.5; % 5 mm +z_tb = 3; + +ptype = 'ex'; z_ftype='ls'; +z_d1 = 0.01; z_d2 = 0.01; + +s_ftype = 'lin'; +ss_type = 'EP Whole'; + +ss_opt([]); % Reset all options +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 20e-3, ... + 'Num Lobe Iters', 15, ... + 'Max B1', 0.85, ... + 'Num Fs Test', 100, ... + 'Verse Fraction', 0.8, ... + 'SLR', 0, ... + 'B1 Verse', 0, ... + 'Min Order', 1,... + 'Spect Correct', 1}); + +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr, 0); + +g_opt = g; +rf_opt = rf; + +% Now compare spectral profiles at z = 0 +ftest = [min([fspec -fs/2]):max([fs/2 fspec])]; +mxy_new = ss_response_mxy(g_opt, rf_opt, 0, ftest, SS_TS, SS_GAMMA); + +figure; +hold on; +nband = length(fspec)/2; +for band = 1:nband, + if a_angs(band) > 0, + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)+z_d1), 'k--'); + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)-z_d1), ... + 'k--'); + else + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)), 'k--'); + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)), ... + 'k--'); + end; +end; +plot(ftest, abs(mxy_new)); +plot([-fs/2 -fs/2], [0 sin(ang)], 'g--'); +plot([fs/2 fs/2], [0 sin(ang)], 'g--'); +hold off + +figure; +subplot(211) +t_opt = [0:length(g_opt)-1] * SS_TS * 1e3; +plot(t_opt, g_opt); +title('Gradient Waveforms'); + +subplot(212) +plot(t_opt, real(rf_opt),t_opt, imag(rf_opt)); +title('RF Waveforms'); + + +return; diff --git a/RF_pulses/spectral_spatial/examples/demo_mband_phs.m b/RF_pulses/spectral_spatial/examples/demo_mband_phs.m new file mode 100644 index 0000000..9b5cf53 --- /dev/null +++ b/RF_pulses/spectral_spatial/examples/demo_mband_phs.m @@ -0,0 +1,132 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% Reset SS package globals +% +ss_opt([]); +ss_globals; + + +%% +fprintf(1, '\nHere''s a C13 multiband slab (6cm) excitation pulse, for pyr+urea dynamic imaging\n'); + +% setup flip angles and bandwidths, and ripple +df = 0.5e-6 * 30000 * 1070;% 0.5 ppm = gamma_C13 * 30000 * 0.5e-6 + +phs_spec = 1 * pi / 180; + +mets(5).name = 'lac'; mets(5).f = 165; mets(5).df = 1.5*df; mets(5).ang = 12;mets(5).d = .005; +mets(5).phs = 0;mets(5).dphs=phs_spec; + +mets(4).name = 'pyrh'; mets(4).f = 40; mets(4).df = 1*df; mets(4).ang = 2.5; mets(4).d = .015; +mets(4).phs = pi/2;mets(4).dphs=phs_spec; + +mets(3).name = 'ala'; mets(3).f = -45; mets(3).df = 1.5*df; mets(3).ang = 12; mets(3).d = .005; +mets(3).phs = pi/2;mets(3).dphs=phs_spec; + +mets(2).name = 'pyr'; mets(2).f = -230; mets(2).df = 2*df; mets(2).ang = 6; mets(2).d = .002; +mets(2).phs = 0;mets(2).dphs=phs_spec; + +mets(1).name = 'urea'; mets(1).f = -465; mets(1).df = 2*df; mets(1).ang = 6; mets(1).d = .002; +mets(1).phs = 0;mets(1).dphs=phs_spec; + + + +Npe = 8; % number of phase encode steps + +% create vectors of angles, ripples, and band edges +clear a_angs d fspec a_phs d_phs +for n = 1:length(mets) + a_angs(n) = mets(n).ang*pi/180; + d(n) = mets(n).d; + a_phs(n) = mets(n).phs; + d_phs(n) = mets(n).dphs; + fspec(2*n-1) = mets(n).f - mets(n).df; + fspec(2*n) = mets(n).f + mets(n).df; + disp([mets(n).name ' metab fraction remaining after Npe = ' int2str(Npe) ' encodes: ' num2str(cos(a_angs(n))^Npe)]) +end +disp(''); + +ang = max(a_angs); + +fmid = (mets(1).f+mets(end).f)/2; +fspec = fspec - fmid; +fctr = 0; + +z_thk = 6; z_tb = 4; ss_type = 'Flyback Whole'; + +ptype = 'ex'; +z_ftype='ls'; +z_d1 = 0.002; +z_d2 = 0.01; + +s_ftype = 'lin'; + +ss_opt([]); % Reset all options +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 24e-3, ... + 'Num Lobe Iters', 15, ... + 'Max B1', 1.6, ... + 'Num Fs Test', 100, ... + 'Verse Fraction', 0.2, ... + 'SLR', 0, ... + 'B1 Verse', 0, ... + 'Min Order', 1,... + 'Spect Correct', 1}); + +[g,rf,fs,z,f,mxy,isodelay] = ... + ss_design_phs(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, a_phs, d_phs, ptype, ... + z_ftype, s_ftype, ss_type, fctr, 0); + +g_opt = g; +rf_opt = rf; + +% Now compare spectral profiles at z = 0 +ftest = [min([fspec -fs/2]):max([fs/2 fspec])]; +mxy_new = ss_response_mxy(g_opt, rf_opt, 0, ftest, SS_TS, SS_GAMMA); + +figure; +hold on; +nband = length(fspec)/2; +for band = 1:nband, + if a_angs(band) > 0, + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)+z_d1), 'k--'); + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)-z_d1), ... + 'k--'); + else + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)), 'k--'); + plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)), ... + 'k--'); + end; +end; +plot(ftest, abs(mxy_new)); +plot([-fs/2 -fs/2], [0 sin(ang)], 'g--'); +plot([fs/2 fs/2], [0 sin(ang)], 'g--'); +hold off + +figure; +subplot(211) +t_opt = [0:length(g_opt)-1] * SS_TS * 1e3; +plot(t_opt, g_opt); +title('Gradient Waveforms'); + +subplot(212) +plot(t_opt, real(rf_opt),t_opt, imag(rf_opt)); +title('RF Waveforms'); + +ss_save(g,rf,pi/2,z_thk,isodelay); + + diff --git a/RF_pulses/spectral_spatial/fftf.m b/RF_pulses/spectral_spatial/fftf.m new file mode 100644 index 0000000..f14cd08 --- /dev/null +++ b/RF_pulses/spectral_spatial/fftf.m @@ -0,0 +1,82 @@ +function xf = fftf(x, N, dim) +% FFTF - Forward Fourier transform, shifted +% +% function xf = fftf(x, N, dim) +% +% x -- time samples +% N -- dimension of Fourier space +% - length of vector if unspecified +% - length of column if unspecified and xt a matrix +% dim -- dimension to operate over, only used if matrix +% - column dimension if unspecified +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fftf.m,v 1.3 2012/02/01 00:41:22 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + xsize = size(x); + if length(xsize) > 2, + error('Only handles 2D matrices'); + end; + + if nargin < 2, + [mnval, mndim] = min(xsize); + if mnval > 1, + dim = 1; + N = xsize(dim); + else + dim = 3-mndim; % Get opposite of mndim + N = xsize(dim); + end; + elseif nargin < 3, + [mnval, mndim] = min(xsize); + if mnval > 1, + dim = 1; + if (N < xsize(dim)) + error('N less than number of rows of x'); + end; + else + dim = 3-mndim; % Get opposite of mndim + if (N < xsize(dim)) + error('N less than number of elements of x'); + end; + end; + end; + + % Create zeropad array + % + fsize = xsize; + fsize(dim) = N; + pad = zeros(fsize); + + % Fill in pad array + % + Nd2 = ceil((N+1)/2); + nxd2 = ceil((xsize(dim)+1)/2); + sidx = Nd2 - nxd2 + 1; + if dim == 1, + pad(sidx:sidx+xsize(dim)-1, :) = x; + else + pad(:, sidx:sidx+xsize(dim)-1) = x; + end; + + xf = fftshift(fft(ifftshift(pad,dim),N,dim), dim); + + return; + \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/fftr.m b/RF_pulses/spectral_spatial/fftr.m new file mode 100644 index 0000000..7fe476d --- /dev/null +++ b/RF_pulses/spectral_spatial/fftr.m @@ -0,0 +1,78 @@ +function x = fftr(xf, N, dim) +% FFTR - Reverse Fourier transform, shifted +% +% function x = fftr(xf, N, dim) +% +% xf -- Fourier samples +% N -- dimension of x space +% - length of vector if unspecified +% - length of column if unspecified and xt a matrix +% dim -- dimension to operate over, only used if matrix +% - column dimension if unspecified +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fftr.m,v 1.3 2012/02/01 00:41:22 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + xfsize = size(xf); + if length(xfsize) > 2, + error('Only handles 2D matrices'); + end; + + if nargin < 2, + [mnval, mndim] = min(xfsize); + if mnval > 1, + dim = 1; + N = xfsize(dim); + else + dim = 3-mndim; % Get opposite of mndim + N = xfsize(dim); + end; + elseif nargin < 3, + [mnval, mndim] = min(xfsize); + if mnval > 1, + dim = 1; + if (N > xfsize(dim)) + error('N greater than number of rows of xf'); + end; + else + dim = 3-mndim; % Get opposite of mndim + if (N > xfsize(dim)) + error('N greater than number of elements of xf'); + end; + end; + end; + + % Get transform along dim + % + xpad = fftshift(ifft(ifftshift(xf,dim),[],dim),dim); + + % Fill in pad array + % + Nd2 = ceil((N+1)/2); + nxfd2 = ceil((xfsize(dim)+1)/2); + sidx = nxfd2 - Nd2 + 1; + if dim == 1, + x = xpad(sidx:sidx+N-1, :); + else + x = xpad(:,sidx:sidx+N-1); + end; + + return; + \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/fir_expand.m b/RF_pulses/spectral_spatial/fir_expand.m new file mode 100644 index 0000000..d15a360 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_expand.m @@ -0,0 +1,408 @@ +% function [h, fn, an, dn] = fir_expand(n, f, a, d, a_min, dbg) +% +% Inputs: +% n: number of taps +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% a_min: minimum amplitude to allow, default if empty is min(0,min(a-d)); +% dbg: flag to turn on debugging statements/plots +% +% Outputs +% h: new filter +% fn: new frequency bands +% an: new amplitudes +% dn: new ripple +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_expand.m,v 1.5 2012/02/01 00:41:22 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +function [hn,fn,an,dn,status] = fir_expand(n,f,a,d,a_min,dbg) + + % Check input parameters + % + if nargin < 4, + error(['Usage: function [h,fn,an,dn,status] = fir_expand(n,f,a,' ... + 'd,[dbg])']); + end; + + if nargin < 5, + a_min = []; + end; + + if nargin < 6, + dbg = 0; + end; + + if (find(a(1:2:end)-a(2:2:end))) + error('Only works for flat bands now'); + end; + + % Confirm baseline design works + % + fn = f; + an = a; + dn = d; + [hn,status] = fir_pm(n,f,a,d,a_min,dbg); + if strcmp(status,'Failed') +% warning('Baseline design infeasible.'); + return; + end; + + % Now get number of transition regions, and type of filter + % + nband = length(f)/2; + if min(f) < 0, + real_filter = 0; + else + real_filter = 1; + end; + + if bitget(n,1) == 1, + odd_filter = 1; + else + odd_filter = 0; + end; + + % Get frequency grid + % + oversamp = 7; + if real_filter + m = oversamp * n; + fg = [0:m-1]/(m-1); + else + m = 2 * oversamp * n; + fg = [-m/2:m/2-1]/(m/2); + end; + + % Keep expanding each filter band up to point filter fails + % Choose lower-amplitude band to expand if possible, else expand + % bands equally + % + fbest = f; + if real_filter, + ntran = nband+1; + else + ntran = nband; + end; + if dbg >= 2, + ftry_fig = figure; + end + + for tran = 1:ntran, + if dbg >= 1, + fprintf(1, 'Optimizing transition %d of %d\n', tran, ntran); + end; + + % Get indices of left/right bands + % + if real_filter + if (tran == 1) + lband = 0; % Real-filter, no band left of band 1 + rband = 1; + elseif (tran == nband+1) + lband = nband; + rband = 0; + else + lband = tran-1; + rband = tran; + end; + else + lband = mod(tran-2,nband)+1; + rband = mod(tran-1,nband)+1; + end; + + % Get starting fgrid indices corresponding to + % band edges. + % + if lband ~= 0, + lidx = find((fg <= f(lband*2)), 1, 'last'); + end; + if rband ~= 0, + ridx = find((fg >= f(rband*2-1)), 1, 'first'); + end; + + % Get max number of grid points the band edges + % can move, as well as the step size for each + % band + % + if rband == 0, + nlmax = m - lidx; + nrmax = 0; + elseif lband == 0, + nlmax = 0; + nrmax = ridx - 1; + else + nlmax = mod(ridx-lidx, m); + nrmax = nlmax; + end; + ntotal = max(nlmax, nrmax); + + % Find order of band edges to expand + % -- preference is to expand stopbands first, then passbands + % in order to minimize energy in filter + + % Only add bands that are stopbands + % + band_order = []; + if ((lband ~= 0) && (rband~=0)) + if a(lband*2) == min(a) + band_order = [0]; + end; + if (a(rband*2) == min(a)) + band_order = [band_order 1]; + end; + elseif (lband ~= 0) + if a(lband*2) == min(a) + band_order = [band_order 0]; + end; + elseif (rband ~= 0) + if (a(rband*2) == min(a)) + band_order = [band_order 1]; + end; + end; + + if 0 + band_order = [0 1]; % 0 = left, 1 = right + if ((lband ~= 0) && (rband ~= 0) && ... + (a(lband*2) > a(rband*2-1))), % swap order + band_order = [1 0]; + end; + end; + + + % Bisection search on how many points to add to band + % edges. nlbot and nrbot are known working solutions. + % + nlbot = 0; nltop = nlmax; + nrbot = 0; nrtop = nrmax; + for working_band = band_order, + if working_band == 0, % lband + if dbg >= 2, + fprintf(1, 'Expanding left edge...\n'); + end; + % Update nltop for any right edge expansion + % + if lband ~= 0 + nltop = min(nltop, ntotal-nrbot); + end + while ((nltop - nlbot) > 0) + + if dbg >= 2, + fprintf(1,'nlbot: %d nltop: %d -- nrbot: %d nrtop: %d -- ntotal: %d\n', ... + nlbot, nltop, nrbot, nrtop, ntotal); + end; + % Advance left band and calculate feasibility + % + nltry = ceil((nltop + nlbot)/2); + lidxtry = mod(lidx + nltry -1, m) + 1; + ftry_cont = fbest; + ftry_cont(lband*2) = fg(lidxtry); + + % Create new freq spec from ftry_cont that removes + % any possible wraps (only occurs for complex filters) + % + ftry = ftry_cont; + atry = a; + dtry = d; + if ftry(1) > ftry(2), + if (ftry(1) == 1), + ftry(1) = -1; + else + ftry = [-1 ftry(2:end) ftry(1) 1]; + atry = [a a(1) a(2)]; + dtry = [d d(1)]; + end; + elseif ftry(end-1) > ftry(end), + if (ftry(end) == -1) + ftry(end) = 1; + else + ftry = [-1 ftry(end) ftry(1:end-1) 1]; + atry = [a(end) a(end) a]; + dtry = [d(end) d]; + end; + end; + + if dbg>=2, + clf; + hold on; + nb = length(ftry)/2; + for bnd = 1:nb, + plot([ftry(bnd*2-1) ftry(bnd*2-1) ftry(bnd*2) ftry(bnd*2)], ... + log10(1+[0 (atry(bnd*2-1)+dtry(bnd)) (atry(bnd*2)+dtry(bnd)) 0]), 'r'); + end; + for bnd = 1:nband, + plot([f(bnd*2-1) f(bnd*2-1) f(bnd*2) f(bnd*2)], ... + log10(1+[0 (a(bnd*2-1)+d(bnd)) (a(bnd*2)+d(bnd)) 0]), 'b'); + end; + drawnow; + fprintf(1,''); + pause; + fprintf(1,'\r \r'); + end; + + if any(diff(ftry) <= 0) + status = 'Failed'; + else + [h,status] = fir_pm(n,ftry,atry,dtry,a_min,dbg); + end; + if strcmp(status, 'Solved') + if dbg >= 3, + fprintf(1,'nltry: %d Solved\n',nltry); + end; + % Update nlbot + % + nlbot = nltry; + + % Update current best results + % + fbest = ftry_cont; + + % Update output + % + hn = h; + fn = ftry; + an = atry; + dn = dtry; + else + if dbg >= 3, + fprintf(1,'nltry: %d Failed\n',nltry); + end; + % Update nltop + % + if nltop == nlbot+1 + nltop = nlbot; + else + nltop = nltry; + end; + end; + end; % while + else % working band is rband + if dbg >= 2, + fprintf(1, 'Expanding right edge...\n'); + end; + % Update nrtop for any left edge expansion + % + if rband ~= 0 + nrtop = min(nrtop, ntotal-nlbot); + end + while ((nrtop - nrbot) > 0) + if dbg >= 2, + fprintf(1,'nlbot: %d nltop: %d -- nrbot: %d nrtop: %d -- ntotal: %d\n', ... + nlbot, nltop, nrbot, nrtop, ntotal); + end; + % Advance right band and calculate feasibility + % + nrtry = ceil((nrtop + nrbot)/2); + ridxtry = mod(ridx - nrtry -1, m) + 1; + ftry_cont = fbest; + ftry_cont(rband*2-1) = fg(ridxtry); + + % Create new freq spec from ftry_cont that removes + % any possible wraps (only occurs for complex filters) + % + ftry = ftry_cont; + atry = a; + dtry = d; + if ftry(1) > ftry(2), + if (ftry(1) == 1) + ftry(1) = -1; + else + ftry = [-1 ftry(2:end) ftry(1) 1]; + atry = [a a(1) a(2)]; + dtry = [d d(1)]; + end; + elseif ftry(end-1) > ftry(end), + if (ftry(end) == -1) + ftry(end) = 1; + else + ftry = [-1 ftry(end) ftry(1:end-1) 1]; + atry = [a(end) a(end) a]; + dtry = [d(end) d]; + end; + end; + + if dbg>=2, + clf; + hold on; + nb = length(ftry)/2; + for bnd = 1:nb, + plot([ftry(bnd*2-1) ftry(bnd*2-1) ftry(bnd*2) ftry(bnd*2)], ... + log10(1+[0 (atry(bnd*2-1)+dtry(bnd)) (atry(bnd*2)+dtry(bnd)) 0]), 'r'); + end; + for bnd = 1:nband, + plot([f(bnd*2-1) f(bnd*2-1) f(bnd*2) f(bnd*2)], ... + log10(1+[0 (a(bnd*2-1)+d(bnd)) (a(bnd*2)+d(bnd)) 0]), 'b'); + end; + drawnow; + fprintf(1,''); + pause; + fprintf(1,'\r \r'); + end; + + if any(diff(ftry) <= 0) + status = 'Failed'; + else + [h,status] = fir_pm(n,ftry,atry,dtry,a_min,dbg); + end; + if strcmp(status, 'Solved') + if dbg >= 3, + fprintf(1,'nrtry: %d Solved\n',nrtry); + end; + + % Update nrbot + % + nrbot = nrtry; + + % Update current best results + % + fbest = ftry_cont; + + % Update output + % + hn = h; + fn = ftry; + an = atry; + dn = dtry; + else + if dbg >= 3, + fprintf(1,'nrtry: %d Failed\n',nrtry); + end; + % Update nrtop + % + if nrtop == nrbot+1 + nrtop = nrbot; + else + nrtop = nrtry; + end; + end; + end; % while + end; % if working band + end; % for working band + if dbg >= 2, + fprintf(1,'nlbot: %d nltop: %d -- nrbot: %d nrtop: %d -- ntotal: %d\n', ... + nlbot, nltop, nrbot, nrtop, ntotal); + end; + end % for tran + + status = 'Solved'; + + diff --git a/RF_pulses/spectral_spatial/fir_linprog.m b/RF_pulses/spectral_spatial/fir_linprog.m new file mode 100644 index 0000000..1f39e2f --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_linprog.m @@ -0,0 +1,380 @@ + +function [h, status] = fir_linprog(n, f, a, d, h0, dbg) +% FIR_LINPROG - FIR filter design using linear programming +% +% Design n-tap linear-phase filter that meets multiband frequency +% specification. If h0 is provided, it is used as an initial +% estimate of the filter taps. +% +% Also constrain H(f) > min(0, min(a(1:2:end)-d), min(a(2:2:end)-d)) +% Also minimizes sum(H(f)) in transition bands. +% +% function [h, status] = fir_linprog(n, f, a, d, h0, dbg) +% +% Inputs: --- similar to cfirpm +% n: number of taps returned +% f: frequency bands (-1->1) +% a: amplitude at band edges +% d: ripple in bands +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_linprog.m,v 1.11 2013/08/15 16:01:59 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + % Default value for dbg + % + if nargin < 6, + dbg = 0; + end; + + % Determine if real or complex coefficients + % + f = f * pi; % Scale to +/- pi + if min(f) < 0, + real_filter = 0; + else + real_filter = 1; + end; + + % Determine if filter has odd or even number of + % taps + % + if (bitget(n,1) == 1) + odd_filter = 1; + else + odd_filter = 0; + end; + + % If the frequency specification has a non-zero point + % at +/- 1, then the order must be even. A warning is + % printed and a failure returned if this is the case. + % + if (~odd_filter) + idx = find(abs(f) == pi); + if find(a(idx) == 1) + warning('n odd and frequency spec 1 at fs/2'); + + status = 'Failed'; + h = []; + return; + end; + end; + + % Determine number of optimization parameters + % + nhalf = ceil(n/2); % number of taps in half-side of + % filter + nx = nhalf; + if ~real_filter, + if odd_filter, + nx = 2*nhalf-1; + else + nx = 2*nhalf; + end; + end; + + % Create optimization arrays + % + oversamp = 15; + undersamp_tran = 1; % Undersampling factor for transition + % regions + % Get first pass on w + % + if real_filter, + m = oversamp * n; + w = linspace(0,pi,m); + else + m = 2 * oversamp * n; + w = linspace(-pi,pi,m); + end; + + % Add explicit samples to w at the edge of each specified band + % + w = sort([w f]); + + % Find indices to passbands/stopbands, and fill in upper/lower bounds + % + idx_band = []; U_band = []; L_band = []; + nband = length(f)/2; + for band = 1:nband, + idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); + % Get amplitude from linear interpolation on band + % + idx_band = [idx_band idx]; + if (f(band*2-1) == f(band*2)) + amp = a(band*2-1); + else + amp = a(band*2-1) + (a(band*2)-a(band*2-1)) * ... + ((w(idx) - f(band*2-1))/(f(band*2)-f(band*2-1))); + end; + U_band = [U_band (amp + d(band))]; + L_band = [L_band (amp - d(band))]; + end; + + % Get transition indices + % + idx_tmp = ones(1,length(w)); + idx_tmp(idx_band) = 0; + idx_tran = find(idx_tmp == 1); + + % Get average representation of response + % + lb_resp = size(w); + lb_resp(idx_band) = (U_band + L_band)/2; + lb_resp(idx_tran) = (max(U_band) + min(L_band))/2; + if real_filter, + lb_resp = [lb_resp(end:-1:1) lb_resp(2:end-1)]; + end; + if dbg >= 3, + if real_filter, + wplot = [-w(end:-1:1) w(2:end-1)]; + else + wplot = w; + end; + figure; + plot(wplot,lb_resp); + end; + + % Fill in x0 with whatever taps are available from h0 + % + if nargin < 5 || isempty(h0), + h0 = []; + end; + x0 = fill_opt_param(h0,nx,real_filter,odd_filter,lb_resp,dbg); + + % Decimate w in transition regions + % + idx_tran = idx_tran(1:undersamp_tran:end); + + % Add transition band limits to be between the + max + % specification on each band and min of (0,min(L_band)) + % + if ~isempty(idx_tran) + U_amp_tran = max(U_band); + U_tran = U_amp_tran*ones(1,length(idx_tran)); + L_amp_tran = min(0, min(L_band)); + L_tran = L_amp_tran*ones(1,length(idx_tran)); + else + U_tran = []; + L_tran = []; + end; + + % Update w, idx_band + % + wband = w(idx_band); + idx_band = [1:length(wband)]; + wtran = w(idx_tran); + idx_tran = [1:length(wtran)] + length(wband); + w = [wband(:).' wtran(:).']; + m = size(w,2); + + if dbg >= 3, + figure; + plot(w(idx_band),U_band,'*'); + hold on; + plot(w(idx_band),L_band,'o'); + plot(w(idx_tran),U_tran,'r*'); + plot(w(idx_tran),L_tran,'ro'); + pause; + end; + + if real_filter + % create optimization matrices + % A is the matrix used to compute the power spectrum + % A(w,:) = [1 2*cos(w) 2*cos(2*w) ... 2*cos(n*w)] + if (odd_filter) + Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; + else + Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; + end; + Asin = []; + else + if (odd_filter) + Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; + Asin = [2*sin(kron(w',[1:nhalf-1]))]; + else + Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; + Asin = [2*sin(kron(w',[0:nhalf-1]+0.5))]; + end; + end; + + % Get subset of A matrix for current order + % + A = [Acos Asin]; + + % Build matrix for upper bound constraints + % + A_U = [A(idx_band,:); A(idx_tran,:)]; + U_b = [U_band U_tran]; + + % Build matrices for lower bound constraints + % + A_L = [A(idx_band, :); A(idx_tran,:)]; + L_b = [L_band L_tran]; + + % Combine matrices + % + A_b = [A_U; -A_L]; + b = [U_b -L_b]; + + % Set minimization vector to add up transform + % in transition region. For magnitude filter design + % this will minimize the energy. + % + fmin = sum(A(idx_tran,:), 1); + + % Call minimization routine + % + if real_filter, + [x,fval,exitflag,output] = ... + linprog(fmin, A_b, b, [],[],[],[],x0,... + optimset('LargeScale', 'off', 'Algorithm', 'active-set', ... + 'Display','off')); + else + [x,fval,exitflag,output] = ... + linprog(fmin, A_b, b, [],[],[],[],x0,... + optimset('LargeScale','off', 'Algorithm', 'active-set', 'Display','off')); + end; + + if dbg >= 3, + H = A * x; + figure; + plot_spec(f,a,d); + [wsort, sidx] = sort(w); + plot(w(sidx), H(sidx)); + hold on; + plot(w(sidx), H(sidx),'rx'); + title('Frequency response calculated with A'); + end; + + if (exitflag == 1) % feasible + h = fill_h(x,nhalf,real_filter, odd_filter,dbg); + status = 'Solved'; + else + h = []; + status = 'Failed'; + end; + return; + +function h = fill_h(x,nhalf,real_filter,odd_filter,dbg) +% Function to fill in filter taps from optimization parameters +% + x = x(:); + if real_filter, + if odd_filter, + h = x(1:end); + h = [x(end:-1:2); h]; + else + h = x(1:end); + h = [x(end:-1:1); h]; + end; + else + if odd_filter, + h = x(1:nhalf) + i * [0; x(nhalf+1:end)]; + h = [conj(h(end:-1:2)); h]; + else + h = x(1:nhalf) + i * x(nhalf+1:end); + h = [conj(h(end:-1:1)); h]; + end; + end; + + return; + +function x0 = fill_opt_param(h0,nx,real_filter,odd_filter,lb_resp,dbg) +% Function to fill in optimization vector given a filter +% description. Doesn't really work well unless the previous +% filter shares the same oddness/evenness so I will ignore +% that case for now +% + % Initialize x0 and x lengths + % + x0 = zeros(nx,1); + if real_filter, + nx_half = nx; + else + if odd_filter, + nx_half = (nx+1)/2; + else + nx_half = nx/2; + end; + end; + + % Initialize whether FFT init should be used + % + fft_init = 0; + + if isempty(h0), + fft_init = 1; + else + % Get lengths + % + nh = length(h0); + nh_half = ceil(nh/2); + + % Check to see if the oddness/evenness of the filter + % is the same + % + if ((odd_filter && ~bitget(nh,1)) || ... + (~odd_filter && bitget(nh,1))) + fft_init = 1; + end; + end; + + if (fft_init), + % Get FFT of lower bound to use as initialization + % + nh_half = nx_half; + if odd_filter, + nh = nh_half*2 - 1; + else + nh = nh_half * 2; + end; + h0 = fftr(hamming(length(lb_resp)).*lb_resp(:),nh); + end; + + % Now copy taps + % + if odd_filter, + if real_filter, + x0(1:min(nx_half,nh_half)) = ... + real(h0(nh_half:nh_half+min(nx_half,nh_half)-1)); + else + x0(1:min(nx_half,nh_half)) = ... + real(h0(nh_half:nh_half+min(nx_half,nh_half)-1)); + x0(nx_half+1:nx_half+min(nx_half,nh_half)-1) = ... + imag(h0(nh_half+1:nh_half+min(nx_half,nh_half)-1)); + end; + else + if real_filter, + x0(1:min(nx_half,nh_half)) = ... + real(h0(nh_half+1:nh_half+min(nx_half,nh_half))); + else + x0(1:min(nx_half,nh_half)) = ... + real(h0(nh_half+1:nh_half+min(nx_half,nh_half))); + x0(nx_half+1:nx_half+min(nx_half,nh_half)) = ... + imag(h0(nh_half+1:nh_half+min(nx_half,nh_half))); + end; + end; +return; + + + + + diff --git a/RF_pulses/spectral_spatial/fir_min_order.m b/RF_pulses/spectral_spatial/fir_min_order.m new file mode 100644 index 0000000..d7cfcf4 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_min_order.m @@ -0,0 +1,231 @@ +% Determines minimum-order linear-phase filter that meets +% amplitude/ripple specifications. +% +% function [h, status] = fir_min_order(n, f, a, d, odd_or_even, a_min, dbg) +% +% Inputs: --- similar to cfirpm +% n: max number of taps to try +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% even_odd: 1 - odd only +% 2 - even only +% anything else - either odd or even +% a_min: minimum amplitude in transition regions, if [], then +% min(0, min(a-d)) is used +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_min_order.m,v 1.11 2012/02/01 00:41:22 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Bisection search calling fir_pm to determine minimum order +% filter that meets linear phase requirements. By default it will check both +% odd and even length filters. If a non-zero point exists at +/- 1, it will +% only check odd filters. Only odd or even filters can be specified by the +% parameter odd_even. +% +% Inputs: +% n - number of taps +% f - frequency bands +% a - amplitudes at band edges +% even_odd: 1 - odd only +% 2 - even only +% anything else - either odd or even +% dbg - level of debug info to print +% + +function [h, status] = fir_min_order(n, f, a, d, even_odd, a_min, dbg) + if nargin < 4, + error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... + ' a_min, dbg)']); + end; + + if nargin < 5 || isempty(even_odd), + even_odd = 0; + end; + switch (even_odd) + case {1, 2} + otherwise + even_odd = 0; + end; + + if nargin < 6, + a_min = []; + end; + + if nargin < 7, + dbg = 0; + end; + + % Initialize best odd/even filters + % + hbest_odd = []; + hbest_even = []; + + % Get max odd/even num taps + % + n_odd_max = 2*floor((n-1)/2)+1; + n_even_max = 2*floor(n/2); + + if dbg >= 2, + filt_fig = figure; + end; + % Test odd filters first + % + if even_odd ~= 2, + n_bot = 1; + n_top = (n_odd_max+1)/2; + n_cur = n_top; + if (dbg) + fprintf(1, 'Testing odd length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = (n_cur * 2 - 1); + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_pm(n_tap, f, a, d, a_min, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_odd = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + if (dbg >= 2) + figure(filt_fig); + clf; + hold on; + plot_spec(f,a,d); + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + plot(freq,real(H)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + % Test even filters now + % + if even_odd ~= 1, + n_bot = 1; + if isempty(hbest_odd), + n_top = n_even_max/2; + n_cur = n_top; + else + n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); + n_cur = n_top; + end; + if (dbg) + fprintf(1, 'Testing even length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = n_cur * 2; + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_pm(n_tap, f, a, d, a_min, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_even = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + if (dbg >= 2) + figure(filt_fig); + clf; + hold on; + plot_spec(f,a,d); + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + plot(freq,real(H)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + if isempty(hbest_odd) && isempty(hbest_even), + status = 'Failed'; + h = []; + if dbg, + fprintf(1,'\nFailed to achieve specs\n'); + end; + else + status = 'Solved'; + if length(hbest_odd) > length(hbest_even), + h = hbest_odd; + else + h = hbest_even; + end; + if dbg, + fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); + end; + end; + diff --git a/RF_pulses/spectral_spatial/fir_min_order_linprog.m b/RF_pulses/spectral_spatial/fir_min_order_linprog.m new file mode 100644 index 0000000..40f7e28 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_min_order_linprog.m @@ -0,0 +1,226 @@ +% Based on +% "FIR Filter Design via Spectral Factorization and Convex Optimization" +% by S.-P. Wu, S. Boyd, and L. Vandenberghe +% +% function [h, status] = fir_min_order_linprog(n, f, a, d, even_odd, dbg) +% +% Bisection search calling fir_linprog to determine minimum order +% filter that meets linear phase requirements. By default it will check both +% odd and even length filters. If a non-zero point exists at +/- 1, it will +% only check odd filters. Only odd or even filters can be specified by the +% parameter odd_even. +% +% Inputs: +% n - number of taps +% f - frequency bands +% a - amplitudes at band edges +% d - ripple in bands +% even_odd: 1 - odd only +% 2 - even only +% x - either odd or even +% dbg - level of debug info to print +% +% function [h, status] = fir_min_order_linprog(n, f, a, d, dbg) +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_min_order_linprog.m,v 1.5 2013/08/15 15:56:12 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + +function [h, status] = fir_min_order_linprog(n, f, a, d, even_odd, dbg) + if nargin < 4, + error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... + ' dbg)']); + end; + + status = 'Failed'; + h = []; + + if nargin < 5 || isempty(even_odd), + even_odd = 0; + end; + switch (even_odd) + case {1, 2} + otherwise + even_odd = 0; + end; + + if nargin < 6, + dbg = 0; + end; + + % Initialize best odd/even filters + % + hbest_odd = []; + hbest_even = []; + + % Get max odd/even num taps + % + n_odd_max = 2*floor((n-1)/2)+1; + n_even_max = 2*floor(n/2); + + if dbg >= 2, + filt_fig = figure; + end; + % Test odd filters first + % + if even_odd ~= 2, + n_bot = 1; + n_top = (n_odd_max+1)/2; + n_cur = n_top; + if (dbg) + fprintf(1, 'Testing odd length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = (n_cur * 2 - 1); + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_linprog(n_tap, f, a, d, hbest_odd, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_odd = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + if (dbg >= 2) + figure(filt_fig); + clf; + hold on; + plot_spec(f,a,d); + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + plot(freq,real(H)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + % Test even filters now + % + if even_odd ~= 1, + n_bot = 1; + if isempty(hbest_odd), + n_top = n_even_max/2; + n_cur = n_top; + else + n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); + n_cur = n_top; + end; + if (dbg) + fprintf(1, 'Testing even length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = n_cur * 2; + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_linprog(n_tap, f, a, d, hbest_even, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_even = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + if (dbg >= 2) + figure(filt_fig); + clf; + hold on; + plot_spec(f,a,d); + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + plot(freq,real(H)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + if isempty(hbest_odd) && isempty(hbest_even), + status = 'Failed'; + h = []; + if dbg, + fprintf(1,'\nFailed to achieve specs\n'); + end; + else + status = 'Solved'; + if (isempty(hbest_odd)) + h = hbest_even; + elseif (isempty(hbest_even)) + h = hbest_odd; + elseif (length(hbest_odd) < length(hbest_even)) + h = hbest_odd; + else + h = hbest_even; + end; + + if dbg, + fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); + end; + end; + diff --git a/RF_pulses/spectral_spatial/fir_min_order_qprog.m b/RF_pulses/spectral_spatial/fir_min_order_qprog.m new file mode 100644 index 0000000..b603453 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_min_order_qprog.m @@ -0,0 +1,228 @@ +% Based on +% "FIR Filter Design via Spectral Factorization and Convex Optimization" +% by S.-P. Wu, S. Boyd, and L. Vandenberghe +% +% Bisection search calling fir_qprog to determine minimum order +% filter that meets linear phase requirements. By default it will check both +% odd and even length filters. If a non-zero point exists at +/- 1, it will +% only check odd filters. Only odd or even filters can be specified by the +% parameter odd_even. +% +% function [h, status] = fir_min_order_qprog(n, f, a, d, even_odd, dbg) +% +% Inputs: +% n - number of taps +% f - frequency bands +% a - amplitudes at band edges +% d - ripple in bands +% even_odd: 1 - odd only +% 2 - even only +% x - either odd or even +% dbg - level of debug info to print +% +% Also constrains H(f) > max(0, min(a(1:2:end)-d), min(a(2:2:end)-d)) +% Also minimizes sum(|H(f)|^2) in transition bands. +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_min_order_qprog.m,v 1.1 2013/08/15 15:53:38 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% + +function [h, status] = fir_min_order_qprog(n, f, a, d, even_odd, dbg) + if nargin < 4, + error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... + ' dbg)']); + end; + + status = 'Failed'; + h = []; + + if nargin < 5 || isempty(even_odd), + even_odd = 0; + end; + switch (even_odd) + case {1, 2} + otherwise + even_odd = 0; + end; + + if nargin < 6, + dbg = 0; + end; + + % Initialize best odd/even filters + % + hbest_odd = []; + hbest_even = []; + + % Get max odd/even num taps + % + n_odd_max = 2*floor((n-1)/2)+1; + n_even_max = 2*floor(n/2); + + if dbg >= 2, + filt_fig = figure; + end; + % Test odd filters first + % + if even_odd ~= 2, + n_bot = 1; + n_top = (n_odd_max+1)/2; + n_cur = n_top; + if (dbg) + fprintf(1, 'Testing odd length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = (n_cur * 2 - 1); + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_qprog(n_tap, f, a, d, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_odd = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + if (dbg >= 2) + figure(filt_fig); + clf; + hold on; + plot_spec(f,a,d); + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + plot(freq,real(H)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + % Test even filters now + % + if even_odd ~= 1, + n_bot = 1; + if isempty(hbest_odd), + n_top = n_even_max/2; + n_cur = n_top; + else + n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); + n_cur = n_top; + end; + if (dbg) + fprintf(1, 'Testing even length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = n_cur * 2; + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_qprog(n_tap, f, a, d, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_even = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + if (dbg >= 2) + figure(filt_fig); + clf; + hold on; + plot_spec(f,a,d); + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + plot(freq,real(H)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + if isempty(hbest_odd) && isempty(hbest_even), + status = 'Failed'; + h = []; + if dbg, + fprintf(1,'\nFailed to achieve specs\n'); + end; + else + status = 'Solved'; + if (isempty(hbest_odd)) + h = hbest_even; + elseif (isempty(hbest_even)) + h = hbest_odd; + elseif (length(hbest_odd) < length(hbest_even)) + h = hbest_odd; + else + h = hbest_even; + end; + + if dbg, + fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); + end; + end; + diff --git a/RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m b/RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m new file mode 100644 index 0000000..1c0019c --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m @@ -0,0 +1,213 @@ +% Based on +% "FIR Filter Design via Spectral Factorization and Convex Optimization" +% by S.-P. Wu, S. Boyd, and L. Vandenberghe +% +% Determines minimum-order linear-phase filter that meets +% amplitude/ripple specifications. +% +% function [h, status] = fir_min_order(n, f, a, d, dbg) +% +% Inputs: --- similar to cfirpm +% n: max number of taps to try +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_min_order_qprog_phs.m,v 1.2 2012/06/27 16:49:53 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Bisection search calling fir_qprog to determine minimum order +% filter that meets linear phase requirements. By default it will check both +% odd and even length filters. If a non-zero point exists at +/- 1, it will +% only check odd filters. Only odd or even filters can be specified by the +% parameter odd_even. +% +% Inputs: +% n - number of taps +% f - frequency bands +% a - amplitudes at band edges +% even_odd: 1 - odd only +% 2 - even only +% x - either odd or even +% dbg - level of debug info to print +% + +function [h, status] = fir_min_order_qprog_phs(n, f, a, d, even_odd, dbg) + if nargin < 4, + error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... + ' dbg)']); + end; + + status = 'Failed'; + h = []; + + if nargin < 5 || isempty(even_odd), + even_odd = 0; + end; + switch (even_odd) + case {1, 2} + otherwise + even_odd = 0; + end; + + if nargin < 6, + dbg = 0; + end; + + % Initialize best odd/even filters + % + hbest_odd = []; + hbest_even = []; + + % Get max odd/even num taps + % + n_odd_max = 2*floor((n-1)/2)+1; + n_even_max = 2*floor(n/2); + + % Test odd filters first + % + if even_odd ~= 2, + n_bot = 1; + n_top = (n_odd_max+1)/2; + n_cur = n_top; + if (dbg) + fprintf(1, 'Testing odd length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = (n_cur * 2 - 1); + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_qprog_phs(n_tap, f, a, d, hbest_odd, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_odd = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + % Test even filters now + % + if even_odd ~= 1, + n_bot = 1; + if isempty(hbest_odd), + n_top = n_even_max/2; + n_cur = n_top; + else + n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); + n_cur = n_top; + end; + if (dbg) + fprintf(1, 'Testing even length filters...\n'); + end; + while (n_top - n_bot > 1), + n_tap = n_cur * 2; + if (dbg) + fprintf(1, '%4d taps: ...', n_tap) + end; + [h, status] = fir_qprog_phs(n_tap, f, a, d, hbest_even, dbg); + if strcmp(status, 'Solved') + % feasible + hbest_even = h; + if dbg, + fprintf(1,'Feasible\n'); + end; + n_top = n_cur; + if n_top == n_bot+1, + n_cur = n_bot; + else + n_cur = ceil((n_top + n_bot)/2); + end; + else + if dbg, + fprintf(1,'Infeasible\n'); + end; + n_bot = n_cur; + n_cur = ceil((n_bot+n_top)/2); + end; + end; + end + + if isempty(hbest_odd) && isempty(hbest_even), + status = 'Failed'; + h = []; + if dbg, + fprintf(1,'\nFailed to achieve specs\n'); + end; + else + status = 'Solved'; + if (isempty(hbest_odd)) + h = hbest_even; + elseif (isempty(hbest_even)) + h = hbest_odd; + elseif (length(hbest_odd) < length(hbest_even)) + h = hbest_odd; + else + h = hbest_even; + end; + + % dbg = 2; + if (dbg >= 2) + filt_fig = figure; + + m = 512; + H = fftf(h, m); + freq = [-m/2:m/2-1]/m*2; + + % Correct H by half-sample offset if even number of taps + % + n_tap = length(h); + if bitget(n_tap,1) == 0, + H = H .* exp(-i*pi*freq(:)*0.5); + end; + + figure(filt_fig); + clf; + hold on; + plot_spec_phs(f,a,d,freq,H); + title('Frequency Response'); + xlabel('Normalized Frequency'); + fprintf(1,'Pausing...'); + pause; + fprintf(1,'\r \r'); + end; + + if dbg, + fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); + end; + end; + diff --git a/RF_pulses/spectral_spatial/fir_minphase.m b/RF_pulses/spectral_spatial/fir_minphase.m new file mode 100644 index 0000000..9627a49 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_minphase.m @@ -0,0 +1,210 @@ +% Determines minimum-order minimum-phase filter that has a magnitude +% response that meets the magnitude amplitude/ripple specifications. +% It will only return filters with an odd number of taps. +% +% function [h, status] = fir_minphase(n, f, a, d, use_max, dbg) +% +% Inputs: --- similar to cfirpm +% n: max number of taps to try +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% use_max: don't search for min order, use n taps +% dbg: flag to turn on debugging statements/plots +% + +% NOTE: why must spectral factorization accept odd number taps only? +% No chance to do even filters? +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_minphase.m,v 1.10 2012/06/08 21:35:02 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Calls fir_min_order to determine minimum-length odd filter that +% meets magnitude-squared response, then performs spectral +% factorization +% + +function [hn,status,fn,an,dn] = fir_minphase(n, f, a, d, use_max, dbg) + if nargin < 4, + error('Usage: function [h, status] = fir_minphase(n, f, a, d, use_max,dbg)'); + end; + + if nargin < 5, + use_max = 0; + end; + + if nargin < 6, + dbg = 0; + end; + + hn = []; + status = 'Failed'; + + % Get magnitude-squared spec + % + d2 = [d(:).'; d(:).']; + d2 = d2(:).'; + mxspec = (a+d2).^2; + mnspec = max(0,(a-d2)).^2; + + % Get "zero" threshold of 2% of lowest spec + % + ztol_perc = 2; + ztol = min(ztol_perc/100 * (mxspec-mnspec)); + + % Offset magnitude-squared spec by ztol, get n + % + mnspec = max(ztol,mnspec); + a_sqr = (mxspec + mnspec)/2; + d2_sqr = (mxspec-mnspec)/2; + d_sqr = d2_sqr(1:2:end); + n_max = 2*n - 1; + + % Get minimum-order linear-phase filter that meets + % magnitude response + % + odd_only = 1; + if ~use_max, + [r, status] = fir_min_order(n_max, f, a_sqr, d_sqr, odd_only, ztol, dbg); + else + [r, status] = fir_pm(n_max, f, a_sqr, d_sqr, ztol, dbg); + end; + if strcmp(status, 'Failed') + fprintf(1,'Failed to get filter\n'); + return; + end + + Rok = 0; + while ~Rok, + % Expand passband/transition regions to reduce + % transition ripple + % + [rn, fn, an, dn] = fir_expand(length(r), f, a_sqr, d_sqr, ztol, dbg); + + oversamp = 15; + m = 2 * oversamp * length(rn); + m2 = 2^ceil(log2(m)); + R = real(fftf(rn,m2)); + + % Check magnitude response to make sure that it is everywhere 0 + % + if dbg, + freq = [-m2/2:m2/2-1]/m2*2; + Ro = real(fftf(r,m2)); % Linear-phase must have real autocorrelation + figure; + plot(freq(:),real(Ro(:))); + hold on; + plot(freq(:),real(R(:)),'r'); + plot_spec(fn,an,dn,'g'); + plot_spec(f,a_sqr,d_sqr,'k'); + title('Squared Frequency Response of Autocorrelation Fcns'); + xlabel('Normalized Frequency'); + end; + + % Now use spectral factorization to get return filter + % --- first offset to make sure it's positive + if min(R) < 0, + min_stop = min(a_sqr + d2_sqr); + Rtol_perc = 0.1; % 10% stopband tolerance + Rtol = Rtol_perc * min_stop; % Rule of thumb + if min(R) < -Rtol, + fprintf(1, 'Autocorrelation has negative value\n'); + fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... + round(Rtol_perc*100), Rtol, -min(R)); + + % Test spectral factorization + % + rn = rn + Rtol; + hn = spectral_fact(rn); + hn = conj(hn(end:-1:1)); + + % Get squared frequency response and check against specs + % + Rtol + % + H = (fftf(hn, m2)); + freq = [-m2/2:m2/2-1]/m2*2; + H2 = abs(H).^2; % Squared-mag response (H is Min-Phase) + nband = length(f)/2; + atol = 0.05; + Rok = 1; + for band = 1:nband, + idx = find((freq >= f(band*2-1)) & (freq <= f(band*2))); + amax = (1+atol)*(a_sqr(band*2-1) + d_sqr(band) + Rtol); + amin = (1-atol)*(a_sqr(band*2-1) - d_sqr(band)); + fail = find((H2(idx) > amax) | ... + (H2(idx) < amin)); + if fail, + fprintf(1, ' Spectral factorization doesn''t meet specs\n'); + fprintf(1, ' Increase number of taps to: %d\n', ... + length(r)+2); + if (dbg) + fprintf(1,''); + figure; + plot_spec(f,a_sqr,d_sqr,'k'); + hold on; + plot(freq(:),H2(:)); + title('Squared Frequency Response of Factorized Filter'); + xlabel('Normalized Frequency'); + pause; + end; + fprintf(1,'\r \r'); + [r, stat] = fir_pm(length(r)+2, f, a_sqr, d_sqr, ztol, ... + dbg); + Rok = 0; + break; + end; + end; + else + if (dbg) + fprintf(1, 'Autocorrelation has negative value, but within tol\n'); + fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... + round(Rtol_perc*100), Rtol, -min(R)); + end; + rn = rn - min(R); + Rok = 1; + end; + else + if dbg, + fprintf(1,'Autocorrelation OK\n'); + end; + Rok = 1; + end; + end; + + % Spectral factorize and time reverse + % + h = spectral_fact(r); + h = conj(h(end:-1:1)); + + hn = spectral_fact(rn); + hn = conj(hn(end:-1:1)); + if dbg, + m = 512; + freq = [-m/2:m/2-1]/m*2; + H = abs(fftf(h,512)); + Hn = abs(fftf(hn,512)); + figure; + plot(freq,H); + hold on; + plot(freq,Hn,'r'); + plot_spec(f,a,d,'k'); + title('Frequency Response Factorized Filters'); + end; + diff --git a/RF_pulses/spectral_spatial/fir_minphase_power.m b/RF_pulses/spectral_spatial/fir_minphase_power.m new file mode 100644 index 0000000..99897a4 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_minphase_power.m @@ -0,0 +1,211 @@ +% Determines minimum-order minimum-phase filter that has a magnitude +% response that meets the magnitude amplitude/ripple specifications. +% It will only return filters with an odd number of taps. +% +% function [h, status] = fir_minphase_power(n, f, a, d, use_max, dbg) +% +% Inputs: --- similar to cfirpm +% n: max number of taps to try +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% use_max: don't search for min order, use n taps +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_minphase_power.m,v 1.7 2012/06/19 16:53:51 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Calls fir_min_order to determine minimum-length odd filter that +% meets magnitude-squared response, then performs spectral +% factorization +% + +function [hn,status] = fir_minphase_power(n, f, a, d, use_max, dbg) + if nargin < 4, + error('Usage: function [h, status] = fir_minphase_power(n, f, a, d, use_max,dbg)'); + end; + + if nargin < 5, + use_max = 0; + end; + + if nargin < 6, + dbg = 0; + end; + + hn = []; + status = 'Failed'; + + % Get magnitude-squared spec + % + d2 = [d(:).'; d(:).']; + d2 = d2(:).'; + mxspec = (a+d2).^2; + mnspec = max(0,(a-d2)).^2; + + % Get "zero" threshold of 2% of lowest spec + % + ztol_perc = 2; + ztol = min(ztol_perc/100 * (mxspec-mnspec)); + + % Offset magnitude-squared spec by ztol, get n + % + mnspec = max(ztol,mnspec); + a_sqr = (mxspec + mnspec)/2; + d2_sqr = (mxspec-mnspec)/2; + d_sqr = d2_sqr(1:2:end); + n_max = 2*n - 1; + + % Get minimum-order linear-phase filter that meets + % magnitude response + % + odd_only = 1; + if ~use_max, + [r, status] = fir_min_order(n_max, f, a_sqr, d_sqr, odd_only, ztol, dbg); + else + [r, status] = fir_pm(n_max, f, a_sqr, d_sqr, ztol, dbg); + end; + if strcmp(status, 'Failed') + fprintf(1,'Failed to get filter\n'); + return; + end + + Rok = 0; + while ~Rok, + % Get min power filter + % + [rn,status] = fir_pm_minpow(length(r), f, a_sqr, d_sqr, ztol, dbg); + + oversamp = 15; + m = 2 * oversamp * length(rn); + m2 = 2^ceil(log2(m)); + R = real(fftf(rn,m2)); + + % Check magnitude response to make sure that it is everywhere positive + % + if dbg, + freq = [-m2/2:m2/2-1]/m2*2; + Ro = real(fftf(r,m2)); % Linear-phase must have real autocorrelation + figure; + plot(freq(:),real(Ro(:))); + hold on; + plot(freq(:),real(R(:)),'r'); + plot_spec(f,a_sqr,d_sqr,'k'); + title('Squared Frequency Response of Autocorrelation Fcns'); + xlabel('Normalized Frequency'); + end; + + % Now use spectral factorization to get return filter + % --- first offset to make sure it's positive + if min(R) < 0, + min_stop = min(a_sqr + d2_sqr); + Rtol_perc = 0.1; % 10% stopband tolerance + Rtol = Rtol_perc * min_stop; % Rule of thumb + if min(R) < -Rtol, + fprintf(1, 'Autocorrelation has negative value\n'); + fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... + round(Rtol_perc*100), Rtol, -min(R)); + + % Test spectral factorization + % + rn = rn + Rtol; + hn = spectral_fact(rn); + hn = conj(hn(end:-1:1)); + + % Get squared frequency response and check against specs + % + Rtol + % + H = (fftf(hn, m2)); + freq = [-m2/2:m2/2-1]/m2*2; + H2 = abs(H).^2; % Squared-mag response (H is Min-Phase) + nband = length(f)/2; + atol = 0.05; + Rok = 1; + for band = 1:nband, + idx = find((freq >= f(band*2-1)) & (freq <= f(band*2))); + amax = (1+atol)*(a_sqr(band*2-1) + d_sqr(band) + Rtol); + amin = (1-atol)*(a_sqr(band*2-1) - d_sqr(band)); + fail = find((H2(idx) > amax) | ... + (H2(idx) < amin)); + if fail, + fprintf(1, ' Spectral factorization doesn''t meet specs\n'); + fprintf(1, ' Increase number of taps to: %d\n', ... + length(r)+2); + if dbg, + fprintf(1,''); + figure; + plot_spec(f,a_sqr,d_sqr,'k'); + hold on; + plot(freq(:),R(:),'r'); + plot(freq(:),H2(:)); + grid; + + title('Squared Frequency Response of Original and Factorized Filter'); + xlabel('Normalized Frequency'); + pause; + end + fprintf(1,'\r \r'); + [r, stat] = fir_pm_minpow(length(r)+2, f, a_sqr, d_sqr, ztol, ... + dbg); + Rok = 0; + break; + end; + end; + else + fprintf(1, 'Autocorrelation has negative value, but within tol\n'); + fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... + round(Rtol_perc*100), Rtol, -min(R)); + rn = rn - min(R); + Rok = 1; + end; + elseif strcmp(status, 'Failed') + fprintf(1,'\r \r'); + [r, stat] = fir_pm_minpow(length(r)+2, f, a_sqr, d_sqr, ztol, ... + dbg); + Rok = 0; + + else + if dbg, + fprintf(1,'Autocorrelation OK\n'); + end; + Rok = 1; + end; + end; + + % Spectral factorize and time reverse + % + h = spectral_fact(r); + h = conj(h(end:-1:1)); + + hn = spectral_fact(rn); + hn = conj(hn(end:-1:1)); + if dbg, + m = 512; + freq = [-m/2:m/2-1]/m*2; + H = abs(fftf(h,512)); + Hn = abs(fftf(hn,512)); + figure; + plot(freq,H); + hold on; + plot(freq,Hn,'r'); + plot_spec(f,a,d,'k'); + title('Frequency Response Factorized Filters'); + end; + diff --git a/RF_pulses/spectral_spatial/fir_pm.m b/RF_pulses/spectral_spatial/fir_pm.m new file mode 100644 index 0000000..0010047 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_pm.m @@ -0,0 +1,256 @@ + +function [h, status] = fir_pm(n, f, a, d, a_min, dbg) +% FIR_LINPROG - FIR filter design using Parks-McLellan algs +% +% Design n-tap linear-phase filter that meets multiband frequency +% specification. +% +% function [h, status] = fir_pm(n, f, a, d, dbg) +% +% Inputs: +% n: number of taps returned +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% a_min: if not present, chooses min(0, min(a-d)) +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_pm.m,v 1.7 2012/02/01 00:41:22 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + % Default value for a_min + % + d2 = [d(:).'; d(:).']; + d2 = d2(:).'; + if (nargin < 5) || isempty(a_min), + a_min = min(0,min(a-d2)); + end; + + % Default value for dbg + % + if nargin < 6, + dbg = 0; + end; + + % Determine if real or complex coefficients + % + f = f * pi; % Scale to +/- pi + if min(f) < 0, + real_filter = 0; + else + real_filter = 1; + end; + + % Determine if filter has odd or even number of + % taps + % + if (bitget(n,1) == 1) + odd_filter = 1; + else + odd_filter = 0; + end; + + % If the frequency specification has a non-zero point + % at +/- 1, then the order must be even. A warning is + % printed and a failure returned if this is the case. + % + if (~odd_filter) + idx = find(abs(f) ~= 0); + if find(a(idx) ~= 0) + warning('n odd and frequency spec non-zero at fs/2'); + + status = 'Failed'; + h = []; + return; + end; + end; + + % Oversampling on frequency to determine transition bands + % + oversamp = 8; + + % Get first pass on w + % + if real_filter, + m = oversamp * n; + w = linspace(0,pi,m); + else + m = 2 * oversamp * n; + w = linspace(-pi,pi,m); + end; + + % Find bounds on transition regions and convert to amp/ripple + % + ub_tran = max(a + d2); + lb_tran = a_min; % Set to min amplitude spec + amp_tran = (ub_tran + lb_tran)/2; + ripple_tran = (ub_tran - lb_tran)/2; + + % Find indices of transition bands, build up new frequency spec + % + nband = length(f)/2; + ntran = nband+1; + fn = []; + an = []; + dn = []; + for tran = 1:ntran, + if tran == 1, + f_l = min(w); % This avoids sample at -pi + rband = tran; + f_r = f(rband*2-1); + elseif tran == ntran, + lband = tran-1; + f_l = f(lband*2); + f_r = pi; % This avoids sample at pi + else + lband = tran-1; + f_l = f(lband*2); + rband = tran; + f_r = f(rband*2-1); + end; + idx_tran = find((w > f_l) & (w < f_r)); + % cfirpm seems to choke sometimes---I hypothesize + % this is because the transition edges are too + % close to the actual passbands, so don't take + % the immediately adjacent points + % + nskip = 1; + if length(idx_tran) <= 1+2*nskip, + f_tran = []; + a_tran = []; + d_tran = []; + else + idx_tran = idx_tran(1+nskip:end-nskip); + f_tran = [min(w(idx_tran)) max(w(idx_tran))]; + a_tran = [amp_tran amp_tran]; + d_tran = [ripple_tran]; + end; + fn = [fn f_tran]; + an = [an a_tran]; + dn = [dn d_tran]; + if tran < ntran, + fn = [fn f(tran*2-1) f(tran*2)]; + an = [an a(tran*2-1) a(tran*2)]; + dn = [dn d(tran)]; + end; + end; + + % Determine error weights, then call firpm + % + w = max(dn) ./ dn; + lgrid = 31; % Oversample, default 25 + if 0 + % firpm has some instability but cfirpm seems ok... + % + if real_filter, + try + [h,d_opt,opt] = firpm(n-1,fn/pi,an,w,{lgrid}); + catch + h = []; + end; + else + [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,w,{lgrid}); + end; + end; + +% [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,w,{lgrid},'skip_stage2'); + try + [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,w,{lgrid}); + catch + h = []; + lsterr = lasterror; + fprintf(1,'Error caught in cfirpm: \n'); + fprintf(1,'%s\n', lsterr.message); + end; + + % Check frequency response at extremal frequencies + % that are within specified bands + % + resp_ok = 0; + if ~isempty(h) + resp_ok = check_response(f/pi, a, d, opt.fgrid, abs(opt.H)); + end; + + if (~resp_ok) + status = 'Failed'; + if dbg>=2, + plot_response(opt.fgrid, opt.H, fn/pi, an, dn); + title('Filter Response'); + pause(1); + end; + h = []; + else + if dbg>=2, + plot_response(opt.fgrid, opt.H, fn/pi, an, dn); + title('Filter Response'); + pause(1); + end; + + h = h(:); + status = 'Solved'; + end; +return; + + +function status = check_response(f,a,d,ftest,htest) +% CHECK_RESPONSE - Check magnitude response to see if it meets specs +% + nband = length(f)/2; + status = 1; + for band = 1:nband, + idx = find((ftest >= f(band*2-1)) & (ftest <= f(band*2))); + if isempty(idx) + break; + end; + + f_off = ftest(idx) - f(band*2-1); + a_test = a(band*2-1) + ... + (a(band*2)-a(band*2-1)) * f_off/(f(band*2)-f(band*2-1)); + + a_hi = a_test + d(band); + a_lo = a_test - d(band); + + if (find((htest(idx) > a_hi) | (htest(idx) < a_lo))) + status = 0; % Fails in at least one sample + return; + end; + end; + + return; + +function plot_response (freq,h,f,a,d) +% plot_response - Plot frequency specification and actual response +% + figure; + hold on; + nband = length(f)/2; + for band = 1:nband, + idx = [band*2-1:band*2]; + plot(f(idx), a(idx)+d(band), 'k--'); + if max(a(idx)-d(band)) > 0, + plot(f(idx), max(0,a(idx)-d(band)), 'k--'); + end; + end; + plot(freq, real(h)); + plot(freq, imag(h),'b--'); + xlabel('Frequency'); + ylabel('Filter Response'); + + return; diff --git a/RF_pulses/spectral_spatial/fir_pm_minpow.m b/RF_pulses/spectral_spatial/fir_pm_minpow.m new file mode 100644 index 0000000..c1ce151 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_pm_minpow.m @@ -0,0 +1,384 @@ + +function [h, status] = fir_pm_minpow(n, f, a, d, a_min, dbg) +% FIR_PM_MINPOW - FIR filter design using Parks-McLellan algs, +% with attempt to minimize power +% +% Design n-tap linear-phase filter that meets multiband frequency +% specification. +% +% function [h, status] = fir_pm_minpow(n, f, a, d, a_min, dbg) +% +% Inputs: +% n: number of taps returned +% f: frequency bands +% a: amplitude at band edges +% d: ripple in bands +% a_min: if not present or [], chooses min(0, min(a-d)) +% dbg: flag to turn on debugging statements/plots +% +% First designs filter with PM algorithm, then uses result as +% a seed for the fir_linprog routine. fir_linprog() includes +% a minimimization of the sum transition band response---which +% is equal to power when operating on an autocorrelation filter +% since the frequency response is the power spectrum (real and all +% positive). When operating on the amplitude response, the +% transition frequency response can both be negative and is +% only proportional to the sqrt(power), so care should be taken +% when using it in this manner. +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_pm_minpow.m,v 1.6 2012/02/01 00:41:22 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + % Default value for a_min + % + d2 = [d(:).'; d(:).']; + d2 = d2(:).'; + if (nargin < 5) || isempty(a_min), + a_min = min(0,min(a-d2)); + end; + + % Default value for dbg + % + if nargin < 6, + dbg = 0; + end; + + % Determine if real or complex coefficients + % + f = f * pi; % Scale to +/- pi + if min(f) < 0, + real_filter = 0; + else + real_filter = 1; + end; + + % Determine if filter has odd or even number of + % taps + % + if (bitget(n,1) == 1) + odd_filter = 1; + else + odd_filter = 0; + end; + + % If the frequency specification has a non-zero point + % at +/- 1, then the order must be even. A warning is + % printed and a failure returned if this is the case. + % + if (~odd_filter) + idx = find(abs(f) ~= 0); + if find(a(idx) ~= 0) + warning('n odd and frequency spec non-zero at fs/2'); + + status = 'Failed'; + h = []; + return; + end; + end; + + % Oversampling on frequency to determine transition bands + % + oversamp = 16; + + % Get first pass on w + % + if real_filter, + m = oversamp * n; + w = linspace(0,pi,m); + else + m = 2 * oversamp * n; + w = linspace(-pi,pi,m); + end; + + % Find bounds on transition regions and convert to amp/ripple + % + ub_tran = max(a + d2); + lb_tran = a_min; % Set to min amplitude spec + amp_tran = (ub_tran + lb_tran)/2; + ripple_tran = (ub_tran - lb_tran)/2; + + % Find indices of transition bands, build up new frequency spec + % + nband = length(f)/2; + ntran = nband+1; + fn = []; + an = []; + dn = []; + for tran = 1:ntran, + if tran == 1, + f_l = min(w); % This avoids sample at -pi + rband = tran; + f_r = f(rband*2-1); + elseif tran == ntran, + lband = tran-1; + f_l = f(lband*2); + f_r = pi; % This avoids sample at pi + else + lband = tran-1; + f_l = f(lband*2); + rband = tran; + f_r = f(rband*2-1); + end; + idx_tran = find((w > f_l) & (w < f_r)); + % cfirpm seems to choke sometimes---I hypothesize + % this is because the transition edges are too + % close to the actual passbands, so don't take + % the immediately adjacent points + % + nskip = 1; + if length(idx_tran) <= 1+2*nskip, + f_tran = []; + a_tran = []; + d_tran = []; + else + idx_tran = idx_tran(1+nskip:end-nskip); + f_tran = [min(w(idx_tran)) max(w(idx_tran))]; + a_tran = [amp_tran amp_tran]; + d_tran = [ripple_tran]; + end; + fn = [fn f_tran]; + an = [an a_tran]; + dn = [dn d_tran]; + if tran < ntran, + fn = [fn f(tran*2-1) f(tran*2)]; + an = [an a(tran*2-1) a(tran*2)]; + dn = [dn d(tran)]; + end; + end; + + % Determine error weights, then call firpm + % + wt = max(dn) ./ dn; + lgrid = 31; % Oversample, default 25 + try + [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,wt,{lgrid}); + catch + h = []; + lsterr = lasterror; + fprintf(1,'Error caught in cfirpm: \n'); + fprintf(1,'%s\n', lsterr.message); + end; + + % Check frequency response at extremal frequencies + % that are within specified bands + % + resp_ok = 0; + if ~isempty(h) + resp_ok = check_response(fn/pi, an, dn, opt.fgrid, abs(opt.H)); + end; + + if (~resp_ok) + status = 'Failed'; + h = []; + return; + end; + + % Now call fir_linprog with designed filter as starting point. + % The frequency response of the returned filter will be used + % to refine our transition bands. + if (dbg) + fprintf(1,'Getting linear filter based on PM design\n'); + end; + hlin = fir_linprog(n, f/pi, a, d, h(:), dbg); + Hlin = freqz(hlin,1,w/pi,2); + + % Update transition bands + % + fn = []; + an = []; + dn = []; + for tran = 1:ntran, + if tran == 1, + f_l = min(w); % This avoids sample at -pi,0 + rband = tran; + f_r = f(rband*2-1); + elseif tran == ntran, + lband = tran-1; + f_l = f(lband*2); + f_r = pi; % This avoids sample at pi + else + lband = tran-1; + f_l = f(lband*2); + rband = tran; + f_r = f(rband*2-1); + end; + idx_tran = find((w > f_l) & (w < f_r)); + + % Break up this transition region into bands + % each with a max bound determined by the Hlin + % filter response + % + % cfirpm seems to choke sometimes---I hypothesize + % this is because bands are too close together, so + % keep at least "nskip" points between neighbours + % + nskip = 1; + ntran_pts = oversamp*2; + ntran_region = max(1,round((length(idx_tran)-nskip)/ntran_pts)); + ntran_pts = (length(idx_tran)-nskip)/ntran_region; + idx_region_st = nskip + 1 + round([0:ntran_region-1]*ntran_pts); + idx_region_end = [idx_region_st(2:end) (length(idx_tran)-nskip+1)]-1; + + for reg = 1:length(idx_region_st) + % Get frequency indices corresponding to this region + % + idx_tran_reg = idx_tran(idx_region_st(reg):idx_region_end(reg)); + if length(idx_tran_reg) == 0, + f_tran = []; + a_tran = []; + d_tran = []; + else + f_tran = [min(w(idx_tran_reg)) max(w(idx_tran_reg))]; + max_H = max(abs(Hlin(idx_tran_reg))); % Phase not removed + % from Hlin + tol_H = 0.01; + max_H = max_H + tol_H*max(a+d2); % Add some tolerance to bands + max_H = max(min(a+d2), max_H); % No tighter than stopband + min_H = a_min; + amp_tran = (max_H + min_H)/2; + ripple_tran = (max_H - min_H)/2; + a_tran = [amp_tran amp_tran]; + d_tran = [ripple_tran]; + end; + fn = [fn f_tran]; + an = [an a_tran]; + dn = [dn d_tran]; + end; + + if tran < ntran, + fn = [fn f(tran*2-1) f(tran*2)]; + an = [an a(tran*2-1) a(tran*2)]; + dn = [dn d(tran)]; + end; + end; + + % Plot new frequency specfication on top of linear filter response + % + if (dbg >= 2) + figure; + plot(w/pi, abs(Hlin)); + hold on; + plot(opt.fgrid, abs(opt.H),'r'); + nband = length(fn)/2; + for band = 1:nband, + idx = [band*2-1:band*2]; + plot(fn(idx)/pi, an(idx)+dn(band), 'g--'); + plot(fn(idx)/pi, an(idx)-dn(band), 'g--'); + end; + nband = length(f)/2; + for band = 1:nband, + idx = [band*2-1:band*2]; + plot(f(idx)/pi, a(idx)+d(band), 'k--'); + plot(f(idx)/pi, a(idx)-d(band), 'k--'); + end; + fprintf(1,'Pausing...\n'); + pause; + end; + + % Determine error weights, then call firpm + % + wt = max(dn) ./ dn; + lgrid = 31; % Oversample, default 25 + try + [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,wt,{lgrid}); + catch + h = []; + lsterr = lasterror; + fprintf(1,'Error caught in cfirpm: \n'); + fprintf(1,'%s\n', lsterr.message); + end; + + if (dbg >= 2) + plot(opt.fgrid, abs(opt.H),'m'); + fprintf(1,'Pausing...\n'); + pause; + end; + + % Check frequency response at extremal frequencies + % that they are within specified bands + % + resp_ok = 0; + if ~isempty(h) + resp_ok = check_response(fn/pi, an, dn, opt.fgrid, abs(opt.H)); + end; + + if (~resp_ok) + fprintf(1,'*** Failed to get min energy pulse ***\n'); + status = 'Failed'; + h = []; + return; + else + if dbg>=2, + plot_response(opt.fgrid, opt.H, fn/pi, an, dn); + title('Filter Response'); + pause(1); + end; + + h = h(:); + status = 'Solved'; + end; +return; + + +function status = check_response(f,a,d,ftest,htest) +% CHECK_RESPONSE - Check magnitude response to see if it meets specs +% + nband = length(f)/2; + status = 1; + for band = 1:nband, + idx = find((ftest >= f(band*2-1)) & (ftest <= f(band*2))); + if isempty(idx) + break; + end; + + f_off = ftest(idx) - f(band*2-1); + a_test = a(band*2-1) + ... + (a(band*2)-a(band*2-1)) * f_off/(f(band*2)-f(band*2-1)); + + a_hi = a_test + d(band); + a_lo = a_test - d(band); + + if (find((htest(idx) > a_hi) | (htest(idx) < a_lo))) + status = 0; % Fails in at least one sample + return; + end; + end; + + return; + +function plot_response (freq,h,f,a,d) +% plot_response - Plot frequency specification and actual response +% + figure; + hold on; + nband = length(f)/2; + for band = 1:nband, + idx = [band*2-1:band*2]; + plot(f(idx), a(idx)+d(band), 'k--'); + if max(a(idx)-d(band)) > 0, + plot(f(idx), max(0,a(idx)-d(band)), 'k--'); + end; + end; + plot(freq, real(h)); + plot(freq, imag(h),'b--'); + xlabel('Frequency'); + ylabel('Filter Response'); + + return; diff --git a/RF_pulses/spectral_spatial/fir_qprog.m b/RF_pulses/spectral_spatial/fir_qprog.m new file mode 100644 index 0000000..ca75ac3 --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_qprog.m @@ -0,0 +1,318 @@ + +function [h, status] = fir_qprog(n, f, a, d, dbg) +% FIR_QPROG - FIR filter design using quadratic programming +% +% Design n-tap linear-phase filter that meets multiband frequency +% specification. +% +% Also constrain H(f) > max(0, min(a(1:2:end)-d), min(a(2:2:end)-d)) +% Also minimizes sum(|H(f)|^2) in transition bands. +% +% function [h, status] = fir_qprog(n, f, a, d, dbg) +% +% Inputs: --- similar to cfirpm +% n: number of taps returned +% f: frequency bands (-1->1) +% a: amplitude at band edges +% d: ripple in bands +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_qprog.m,v 1.2 2013/08/15 17:10:31 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + % Default value for dbg + % + if nargin < 5, + dbg = 0; + end; + + % Determine if real or complex coefficients + % + f = f * pi; % Scale to +/- pi + if min(f) < 0, + real_filter = 0; + else + real_filter = 1; + end; + + % Determine if filter has odd or even number of + % taps + % + if (bitget(n,1) == 1) + odd_filter = 1; + else + odd_filter = 0; + end; + + % If the frequency specification has a non-zero point + % at +/- 1, then the order must be even. A warning is + % printed and a failure returned if this is the case. + % + if (~odd_filter) + idx = find(abs(f) == pi); + if find(a(idx) == 1) + warning('n odd and frequency spec 1 at fs/2'); + + status = 'Failed'; + h = []; + return; + end; + end; + + % Determine number of optimization parameters + % + nhalf = ceil(n/2); % number of taps in half-side of + % filter + nx = nhalf; + if ~real_filter, + if odd_filter, + nx = 2*nhalf-1; + else + nx = 2*nhalf; + end; + end; + + % Create optimization arrays + % + oversamp = 15; + undersamp_tran = 1; % Undersampling factor for transition + % regions + % Get first pass on w + % + if real_filter, + m = oversamp * n; + w = linspace(0,pi,m); + else + m = 2 * oversamp * n; + w = linspace(-pi,pi,m); + end; + + % Add explicit samples to w at the edge of each specified band + % + w = sort([w f]); + + % Find indices to passbands/stopbands, and fill in upper/lower bounds + % + idx_band = []; U_band = []; L_band = []; + nband = length(f)/2; + for band = 1:nband, + idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); + % Get amplitude from linear interpolation on band + % + idx_band = [idx_band idx]; + if (f(band*2-1) == f(band*2)) + amp = a(band*2-1); + else + amp = a(band*2-1) + (a(band*2)-a(band*2-1)) * ... + ((w(idx) - f(band*2-1))/(f(band*2)-f(band*2-1))); + end; + U_band = [U_band (amp + d(band))]; + L_band = [L_band (amp - d(band))]; + end; + + % Get transition indices + % + idx_tmp = ones(1,length(w)); + idx_tmp(idx_band) = 0; + idx_tran = find(idx_tmp == 1); + + % Get average representation of response + % + lb_resp = size(w); + lb_resp(idx_band) = (U_band + L_band)/2; + lb_resp(idx_tran) = (max(U_band) + min(L_band))/2; + if real_filter, + lb_resp = [lb_resp(end:-1:1) lb_resp(2:end-1)]; + end; + if dbg >= 3, + if real_filter, + wplot = [-w(end:-1:1) w(2:end-1)]; + else + wplot = w; + end; + figure; + plot(wplot,lb_resp); + end; + + % Decimate w in transition regions + % + idx_tran = idx_tran(1:undersamp_tran:end); + + % Add transition band limits to be between the + max + % specification on each band and min of (0,min(L_band)) + % + if ~isempty(idx_tran) + U_amp_tran = max(U_band); + U_tran = U_amp_tran*ones(1,length(idx_tran)); + L_amp_tran = min(0, min(L_band)); + L_tran = L_amp_tran*ones(1,length(idx_tran)); + else + U_tran = []; + L_tran = []; + end; + + % Update w, idx_band + % + wband = w(idx_band); + idx_band = [1:length(wband)]; + wtran = w(idx_tran); + idx_tran = [1:length(wtran)] + length(wband); + w = [wband(:).' wtran(:).']; + m = size(w,2); + + if dbg >= 3, + figure; + plot(w(idx_band),U_band,'*'); + hold on; + plot(w(idx_band),L_band,'o'); + plot(w(idx_tran),U_tran,'r*'); + plot(w(idx_tran),L_tran,'ro'); + pause; + end; + + if real_filter + % create optimization matrices + % A is the matrix used to compute the power spectrum + % A(w,:) = [1 2*cos(w) 2*cos(2*w) ... 2*cos(n*w)] + if (odd_filter) + Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; + else + Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; + end; + Asin = []; + else + if (odd_filter) + Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; + Asin = [2*sin(kron(w',[1:nhalf-1]))]; + else + Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; + Asin = [2*sin(kron(w',[0:nhalf-1]+0.5))]; + end; + end; + + % Get subset of A matrix for current order + % + A = [Acos Asin]; + + % Build matrix for upper bound constraints + % + A_U = [A(idx_band,:); A(idx_tran,:)]; + U_b = [U_band U_tran]; + + % Build matrices for lower bound constraints + % + A_L = [A(idx_band, :); A(idx_tran,:)]; + L_b = [L_band L_tran]; + + % Combine matrices + % + A_b = [A_U; -A_L]; + b = [U_b -L_b]; + + % Set H to minimize total energy in filter + % Set fmin to 0 + H = eye(nx); + fmin = zeros(1,nx); + + % Call minimization routine + % + x0 = []; + if real_filter, + [x,fval,exitflag,output] = ... + quadprog(H, fmin, A_b, b, [],[],[],[],x0,... + optimset('Algorithm', 'interior-point-convex', ... + 'Display','off')); + else + [x,fval,exitflag,output] = ... + quadprog(H, fmin, A_b, b, [],[],[],[],x0,... + optimset('LargeScale','off', 'Algorithm', 'active-set', 'Display','off')); + end; + + if dbg >= 2, + fprintf(1,'Exitflag: %d\n', exitflag); + switch(exitflag) + case 1 + fprintf(1,'First order optimality conditions satisfied\n'); + case 0 + fprintf(1,'Maximum number of iterations exceeded\n'); + case -2 + fprintf(1,'No feasible point found\n'); + case -3 + fprintf(1,'Problem is unbounded\n'); + case -6 + fprintf(1,'Non-convex problem detected\n'); + case 3 + fprintf(1,'Change in objective function too small\n'); + case -4 + fprintf(1,['Current search direction is not a descent direction; ' ... + 'no further progress can be made.\n']); + case 4 + fprintf(1,'Local minimizer found\n'); + case -7 + fprintf(1,['Magnitude of search direction became too small; no ' ... + 'further progress can be made. The problem is ill-posed ' ... + 'or badly conditioned.\n']); + otherwise + fprintf(1,'Exitflag not recognized\n'); + end + + H = A * x; + figure; + plot_spec(f,a,d); + [wsort, sidx] = sort(w); + plot(w(sidx), H(sidx)); + hold on; + plot(w(sidx), H(sidx),'rx'); + title('Frequency response calculated with A'); + end; + + if (exitflag == 1) % feasible + h = fill_h(x,nhalf,real_filter, odd_filter,dbg); + status = 'Solved'; + else + h = []; + status = 'Failed'; + end; + return; + +function h = fill_h(x,nhalf,real_filter,odd_filter,dbg) +% Function to fill in filter taps from optimization parameters +% + x = x(:); + if real_filter, + if odd_filter, + h = x(1:end); + h = [x(end:-1:2); h]; + else + h = x(1:end); + h = [x(end:-1:1); h]; + end; + else + if odd_filter, + h = x(1:nhalf) + i * [0; x(nhalf+1:end)]; + h = [conj(h(end:-1:2)); h]; + else + h = x(1:nhalf) + i * x(nhalf+1:end); + h = [conj(h(end:-1:1)); h]; + end; + end; + + return; + diff --git a/RF_pulses/spectral_spatial/fir_qprog_phs.m b/RF_pulses/spectral_spatial/fir_qprog_phs.m new file mode 100644 index 0000000..3fb496f --- /dev/null +++ b/RF_pulses/spectral_spatial/fir_qprog_phs.m @@ -0,0 +1,400 @@ +function [h, status] = fir_qprog_phs(n, f, ac, dc, x0, dbg) +% FIR_QPROG_PHS - FIR filter design using quadratic programming +% +% Design n-tap linear-phase filter that meets multiband frequency specification, +% including nominal phase in each band. +% +% function [h, status] = fir_qprog_phs(n, f, a, d, dbg) +% +% Inputs: --- similar to cfirpm +% n: number of taps returned +% f: frequency bands (-1->1) +% a: amplitude for each band - complex NOTE: does NOT support sloped +% bands +% - magnitude describes target magnitude for band +% - phase describes target phase for band +% d: ripple in bands - complex +% - magnitude describes +/- magnitude ripple for band +% - phase describes +/- phase ripple for band +% dbg: flag to turn on debugging statements/plots +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2013 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/fir_qprog_phs.m,v 1.6 2013/08/15 03:18:58 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% + % Default value for dbg + % + if nargin < 6, + dbg = 0; + end; + + % Find how many bands + % + nband = length(f)/2; + + % Make sure specification doesn't include sloped bands + % + for band = 1:nband, + if (ac(band*2-1) ~= ac(band*2)) + error('Does not support sloped bands'); + end + end + + % Decimate ac so it is just nband elements + % + a = ac(1:2:end); + + % Get magnitudes / phase + a = abs(a); + aphs = angle(a); + d = abs(dc); + dphs = angle(dc); + + + % Check input parameters, informing user that any stopband (e.g. a + % band where magnitude + ripple specs straddle 0 cannot have a + % phase target or ripple associated with it) + % + for band = 1:nband + if ((a(band) + d(band)) * (a(band) - d(band)) < 0) + if (a(band) ~= 0) || (dphs(band) ~= 0) + error('Bands straddling 0 must have a = 0, angle(d) = 0'); + end + end + end + + % Check phase spec / magnitudes to see if approximation of concave + % surface by linear segment is imposing too much error + % + err_tol = 0.05; + for band = 1:nband + bandwarn = 0; + if a(band) ~= 0 + magerr_inner = (a(band) - d(band)) * (sec(dphs(band)) - 1); + if (magerr_inner >= 2 * d(band)) + warning('Reducing phase ripple to that feasible'); + dphs(band) = 0.99*acos((a(band) - d(band)) / (a(band)+d(band))); + elseif ((magerr_inner > err_tol * 2 * d(band)) && (dbg > 0)) + warning(sprintf(['Band: %d, Linear approximation to magnitude spec ' ... + 'decreasing mag ripple by %3.1f%%'], band, 100*magerr_inner/(2*d(band)))); + end + end + end + + % Work out phases of endpoints to use for upper magnitude piecewise + % linear segments approximation + % + n_phs_tran = ceil(2 * pi / acos(1-err_tol)); + amax = max(a + d); % Max magnitude for filter + phs_tran = [0:n_phs_tran]/n_phs_tran * 2 * pi; + for band = 1:nband + if (a(band) == 0) + phs_band{band} = [0:n_phs_tran]/n_phs_tran * 2 * pi; + else + phs_tol = acos(1 - (err_tol * 2 * d(band))); + n_phs = ceil(2 * dphs(band) / phs_tol); + phs_band{band} = ([0:n_phs]/n_phs * 2 - 1) * dphs(band) + ... + aphs(band); + + % Add phase points from each band to transition band pwl segments + % if band is near max magnitude + % + if ( (a(band) + d(band)) >= amax * (1-err_tol) ) + phs_tran = [phs_tran (aphs(band)-dphs(band)) (aphs(band)+ ... + dphs(band))]; + end + end + end + + % Prune and sort phase points in phs_tran + % + phs_tran = mod(phs_tran, 2 * pi); + phs_tran = unique([phs_tran 0 2*pi]); % Between 0 and 2pi + + % Plot PWL segments for debug purposes + % + if (dbg > 0) + figure; + plot([0 (1+i)*1e-9]); + hold on; + + % Plot transition limits first + % + tran_pts = amax * exp(i*phs_tran); + plot(tran_pts,'k--'); + + % Now plot bands + % + band_cmap = jet(nband); + + for band = 1:nband + % Plot ideal magnitude specs + if a(band) ~= 0, + phs = aphs(band) + (([0:50]/50) * 2 - 1) * angle(dc(band)); + else + phs = aphs(band) + (([0:50]/50) * 2 - 1) * pi; + end + plot((a(band)+d(band)) * exp(i*phs), '--',... + 'Color', band_cmap(band,:)); + plot((a(band)-d(band)) * exp(i*phs), '--',... + 'Color', band_cmap(band,:)); + + % Upper magnitude is PWL approximation + % + plot((a(band)+d(band)) * exp(i*phs_band{band}), ... + 'Color', band_cmap(band,:)); + + % Lower magnitude is single line + % + if (a(band) ~= 0) + pts_real = (a(band) - d(band)) * ones(1,51); + phs = (([0:50]/50) * 2 - 1) * dphs(band); + pts_imag = (a(band) - d(band)) * tan(phs); + pts = (pts_real + i *pts_imag) * exp(i*aphs(band)); + plot(pts, 'Color', band_cmap(band,:)); + end + end + drawnow; + end + + % Scale f to -pi .. pi + % + f = f * pi; + + % Determine if filter has odd or even number of + % taps + % + if (bitget(n,1) == 1) + odd_filter = 1; + else + odd_filter = 0; + end; + + % If the frequency specification has a non-zero point + % at +/- pi, then the order must be even. A warning is + % printed and a failure returned if this is the case. + % + if (~odd_filter) + idx = find(abs(f) == pi); + if find(abs(ac(idx)) ~= 0) + warning('n odd and frequency spec non-zero at fs/2'); + + status = 'Failed'; + h = []; + return; + end; + end; + + % Determine number of optimization parameters + % + nhalf = ceil(n/2); % number of taps in half-side of + % filter + + nx = 2 * n; % Number of optimization parameters + + % Create optimization arrays + % + oversamp = 15; + undersamp_tran = 1; % Undersampling factor for transition + % regions + % Get first pass on w + % + m = 2 * oversamp * n; + w = linspace(-pi,pi,m); + + % Add explicit samples to w at the edge of each specified band + % + w = sort([w f]); + + % Create W matrix representing DFT + % + if (odd_filter) + W = exp (-i* kron(w', [-(nhalf-1):nhalf-1])); + else + W = exp (-i* kron(w', [-nhalf:nhalf-1]+0.5)); + end + + % Find indices to passbands/stopbands, and fill in upper/lower bounds + % + idx_band = []; + Au = []; Bu = []; + Al = []; Bl = []; + for band = 1:nband, + idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); + idx_band = [idx_band idx]; + + % Build up upper magnitude constraints + % + phs_diff = angle(exp(i*phs_band{band}(2)) * ... + exp(-i*phs_band{band}(1))); + a_mid = (a(band) + d(band)) * cos(phs_diff/2); + for phs_idx = 1:(length(phs_band{band})-1) + phs_mid = phs_band{band}(phs_idx) + phs_diff/2; + Wtmp = W(idx,:) * exp(-i*phs_mid); + + Au = [Au; real(Wtmp) -imag(Wtmp)]; % in-phase part of Wtmp * x + Bu = [Bu; a_mid * ones(length(idx),1)]; + end + + % Build lower magnitude constraint for non-stopbands + % + if (a(band) ~= 0) + Wtmp = W(idx,:) * exp(-i*aphs(band)); + Al = [Al; real(Wtmp) -imag(Wtmp)]; % in-phase part of Wtmp * x + Bl = [Bl; (a(band)-d(band)) * ones(length(idx),1)]; + + % Build upper phase constraint + % + Wtmp = W(idx,:) * exp(-i*phs_band{band}(end)); + Au = [Au; imag(Wtmp) real(Wtmp)]; % quadrature part of Wtmp * x + Bu = [Bu; zeros(length(idx),1)]; + + % Build lower phase constraint + % + Wtmp = W(idx,:) * exp(-i*phs_band{band}(1)); + Al = [Al; imag(Wtmp) real(Wtmp)]; % quadrature part of Wtmp * x + Bl = [Bl; zeros(length(idx),1)]; + end + end + + % Get transition indices + % + idx_tmp = ones(1,length(w)); + idx_tmp(idx_band) = 0; + idx_tran = find(idx_tmp == 1); + + % Decimate w in transition regions + % + idx_tran = idx_tran(1:undersamp_tran:end); + + % Find weighting + % + wband_mtx = w(idx_band)' * ones(1,length(idx_tran)); + w_mtx = ones(length(idx_band),1) * w(idx_tran); + dtmp = abs(angle(exp(i*(wband_mtx - w_mtx)))); + dtmp = min(dtmp); + wt_tran_energy = min(4*pi/n, dtmp) / (4*pi/n); + + if dbg >= 3, + figure; + hold on; + plot(w(idx_band),ones(length(idx_band),1),'*'); + plot(w(idx_tran), wt_tran_energy, 'g+'); + drawnow; + end; + + % Build up transition band magnitude constraints + % + limit_tran = 1; + if limit_tran + for idx = 1:(length(phs_tran)-1) + phs_diff = phs_tran(idx+1)-phs_tran(idx); + phs_mid = phs_tran(idx)+phs_diff/2; + Wtmp = W(idx_tran,:) * exp(-i*phs_mid); + + Au = [Au; real(Wtmp) -imag(Wtmp)]; % in-phase part of Wtmp * x + Bu = [Bu; amax * cos(phs_diff/2) * ones(length(idx_tran),1)]; + end + end + + % Combine matrices + % + A = [Au; -Al]; + B = [Bu; -Bl]; + + % Build matrix H to minimize energy of filter + % + minimize_total_energy = 1; + if minimize_total_energy + H = eye(nx); % Minimize total energy + H = sparse(H); + else + Ar_tran = [real(W(idx_tran,:)) -imag(W(idx_tran,:))]; + Ai_tran = [imag(W(idx_tran,:)) real(W(idx_tran,:))]; + Ari_tran = diag([sqrt(wt_tran_energy) sqrt(wt_tran_energy)]) * [Ar_tran; Ai_tran]; + H = Ari_tran' * Ari_tran; + end + + fmin = zeros(1,nx); + + % Call minimization routine + % + x0 = []; + [x,fval,exitflag,output] = ... + quadprog(H, fmin, A, B, [],[],[],[],x0,... + optimset('Algorithm', 'interior-point-convex', ... + 'Display','off')); + % optimset('Algorithm', 'active-set', 'Display','iter', ... + % 'MaxIter', 500)); + + + % exitflag + + if dbg >= 2, + fprintf(1,'Exitflag: %d\n', exitflag); + switch(exitflag) + case 1 + fprintf(1,'First order optimality conditions satisfied\n'); + case 0 + fprintf(1,'Maximum number of iterations exceeded\n'); + case -2 + fprintf(1,'No feasible point found\n'); + case -3 + fprintf(1,'Problem is unbounded\n'); + case -6 + fprintf(1,'Non-convex problem detected\n'); + case 3 + fprintf(1,'Change in objective function too small\n'); + case -4 + fprintf(1,['Current search direction is not a descent direction; ' ... + 'no further progress can be made.\n']); + case 4 + fprintf(1,'Local minimizer found\n'); + case -7 + fprintf(1,['Magnitude of search direction became too small; no ' ... + 'further progress can be made. The problem is ill-posed ' ... + 'or badly conditioned.\n']); + otherwise + fprintf(1,'Exitflag not recognized\n'); + end + h = x(1:n) + i * x(n+1:end); + H = W * h; + [wsort, sidx] = sort(w); + hsort = H(sidx); + figure; + plot_spec_phs(f,ac,dc,wsort,hsort); + title('Frequency response calculated with W'); + figure; + plot(abs(h)); + drawnow; + end; + + if (exitflag == 1) % feasible + h = x(1:n) + i * x(n+1:end); + status = 'Solved'; + else + h = []; + status = 'Failed'; + end; + + return; + + + + diff --git a/RF_pulses/spectral_spatial/grad_min_bridge.m b/RF_pulses/spectral_spatial/grad_min_bridge.m new file mode 100644 index 0000000..654e040 --- /dev/null +++ b/RF_pulses/spectral_spatial/grad_min_bridge.m @@ -0,0 +1,117 @@ +function [g, g1, g2, g3] = grad_min_bridge(m0, f, mxg, mxs, ts) +% GRAD_MIN_BRIDGE - Determine gradient trapezoid that gives required area from middle "bridge" section +% +% [g, g1, g2, g3] = grad_min_bridge (m0, f, mxg, mxs, ts) +% +% m0 - target zeroth moment (G/cm * s) +% f - fraction of ramp to include in bridge [0..1] +% mxg - maximum amplitude (G/cm) +% mxs - maximum slew rate (G/cm/ms) +% ts - sample time in s +% +% g - Gradient +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/grad_min_bridge.m,v 1.5 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if (m0 < 0) + s = -1; + m0 = -m0; +else + s = 1; +end; + +% Convert mxs to G/cm/s +% +mxs = mxs * 1e3; + +% Determine trapezoid parameters +% +% na - number of constant samples +% nb - number ramp samples +% nc - number samples of ramp in bridge +% A - trapezoid amplitude +% + +dg = mxs * ts; % Max delta in one sample + +% Assume triangle at first and see if max amp requirements met +% -- quadratic with aq, bq, cq coeffs +% +if (f ~= 0) + aq = (2-f)*f; + bq = f; + cq = -m0/(dg*ts); + nb = (-bq + sqrt(bq^2 - 4*aq*cq))/(2*aq); + + nb = ceil(nb); + nc = max(1,ceil(nb*f)); +else + A = m0 / (2*ts); + nb = ceil(A / dg); + nc = 1; +end; + +% Test result +% +dg_test = m0 / ((2*nb-nc+1)*nc*ts); +A = nb * dg_test; +if (A <= mxg) && (dg_test < dg), % This works! + g1 = s*[1:(nb-nc)] * dg_test; + g2 = s*[[(nb-nc+1):nb] [nb:-1:(nb-nc+1)]] * dg_test; + g3 = s*[(nb-nc):-1:0] * dg_test; + g = [g1 g2 g3]; + if abs((sum(g2)*ts) - s*m0) > 10*eps, + fprintf(1,'Area Spec: %f Actual: %f\n', m0, sum(g)*ts); + error('grad_min_bridge: Area not calculated correctly'); + end; +else %% Must be trapezoid + % Subtract area of ramps + % + nb = ceil(mxg/dg); + nc = max(1,ceil(nb*f)); + dg_test = mxg/nb; + a_ramps = (2*nb-nc+1)*nc * dg_test * ts; + + % get number of const samples + % + a_const = m0 - a_ramps; + na = ceil(a_const/ts/mxg); + + % Get correct amplitude now + % + dg_test = m0 / ( ((2*nb-nc+1)*nc + nb*na) *ts); + A = nb * dg_test; + if ((A > mxg) || (dg_test > dg)), + error('Amp/Slew being exceeded'); + end; + g1 = s* [1:(nb-nc)] * dg_test; + g2 = s* [[(nb-nc+1):nb] nb*ones(1,na) [nb:-1:(nb-nc+1)]] * dg_test; + g3 = s* [(nb-nc):-1:0] * dg_test; + g = [g1 g2 g3]; + if abs((sum(g2)*ts) - s*m0) > 10*eps, + error('grad_min_bridge: Area not calculated correctly'); + end; + +end; + +return; + + diff --git a/RF_pulses/spectral_spatial/grad_mintrap.m b/RF_pulses/spectral_spatial/grad_mintrap.m new file mode 100644 index 0000000..ed508bc --- /dev/null +++ b/RF_pulses/spectral_spatial/grad_mintrap.m @@ -0,0 +1,70 @@ +function [g] = grad_mintrap (m0, mxg, mxs, ts) +% +% [g] = grad_mintrap (m0, mxg, mxs, ts) +% +% m0 - target zeroth moment (G/cm * s) +% mxg - maximum amplitude (G/cm) +% mxs - maximum slew rate (G/cm/ms) +% ts - sample time in s +% +% g - Gradient +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/grad_mintrap.m,v 1.4 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if (m0 < 0) + s = -1; + m0 = -m0; +else + s = 1; +end; + +% Convert mxs to G/cm/s +% +mxs = mxs * 1e3; + +% Determine trapezoid parameters +% +% na - number of constant samples +% nb - number ramp samples +% A - trapezoid amplitude +% + +dg = mxs * ts; % Max delta in one sample +nb = ceil(sqrt (m0 / dg / ts)); +A = m0/(nb*ts); +if (A <= mxg), + na = 0; + dg_act = A/nb; +else + nb = ceil (mxg / dg); + dg_act = mxg / nb; + na = ceil((m0 - (nb^2 * dg_act * ts))/mxg/ts); + dg_act = m0 / (nb^2 + na*nb)/ts; + A = nb * dg_act; +end; + +% Construct discrete trapezoid --- always end with a zero value +% +g = s * [[1:nb]*dg_act ones(1,na)*A [nb-1:-1:0]*dg_act]; + +return; + + diff --git a/RF_pulses/spectral_spatial/grad_ss.m b/RF_pulses/spectral_spatial/grad_ss.m new file mode 100644 index 0000000..61a39bc --- /dev/null +++ b/RF_pulses/spectral_spatial/grad_ss.m @@ -0,0 +1,185 @@ +function [gpos,gneg,g1,g2,g3] = grad_ss(m0, n, f, mxg, mxs, ts, equal) +% GRAD_SS - Calculate spectral-spatial bipolar pulse +% +% [gpos, gneg, g1, g2, g3] = grad_ss (m0, n, f, mxg, mxs, ts, equal) +% +% m0 - target zeroth moment (G/cm * s) of one lobe +% n - total number of samples to use if not [] +% f - fraction of ramp to include in bridge [0..1] +% mxg - maximum amplitude (G/cm) +% mxs - maximum slew rate (G/cm/ms) +% ts - sample time in s +% equal - boolean if pos/neg lobes should be same +% +% gpos - Positive lobe gradient +% gneg - Negative lobe gradient +% g1, g2, g3 - Ramp up, bridge, ramp down gradients +% in positive lobe + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/grad_ss.m,v 1.9 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +m0 = abs(m0); % Must be positive + +% Check n is even if equal lobes called for +% +if equal, + if bitget(n,1) ~= 0, + error('equal lobes specified, but n not even'); + end; +end; + +% Convert mxs to G/cm/s +% +mxs_s = mxs * 1e3; +dg = mxs_s * ts; % Max delta in one sample + +% Determine trapezoid parameters +% +% na - number of constant samples +% nb - number ramp samples +% nc - number samples of ramp in bridge +% A - trapezoid amplitude +% + +% Do different things if number of samples is specified +% +[gp_tmp, g1_tmp, g2_tmp, g3_tmp] = grad_min_bridge(m0, f, mxg, mxs, ts); +if equal, + gn_tmp = -gp_tmp; +else + m0_pos = sum(gp_tmp) * ts; + gn_tmp = grad_mintrap(-m0_pos, mxg, mxs, ts); +end; + +if isempty(n), + gpos = gp_tmp; + g1 = g1_tmp; + g2 = g2_tmp; + g3 = g3_tmp; + gneg = gn_tmp; +else + if (length([gp_tmp gn_tmp]) > n) + error('grad_ss: Solution not obtained in spec num samples'); + end; + + % Save known solution + % + gp_save = gp_tmp; + g1_save = g1_tmp; + g2_save = g2_tmp; + g3_save = g3_tmp; + gn_save = -gp_save; + + nb_save = find(diff(gp_save) == 0, 1, 'first'); + + % Now keep decreasing number of ramp samples in + % positive lobe until "n" exceeded + % + spec_met = 1; + while (spec_met && (nb_save > 1)) + % Get area in ramps + % + nb = nb_save - 1; + nc = max(1,ceil(nb*f)); + a_ramps = (2*nb-nc+1)*nc * dg * ts; + + % Get number of constant samples + % + a_const = m0 - a_ramps; + na = max(0,ceil(a_const/(nb*dg*ts))); + + % Get correct amplitude, gradients now + % + dg_test = m0 / ( ((2*nb-nc+1)*nc + nb*na) *ts); + A = nb * dg_test; + if ((A > mxg) || (dg_test > dg)), + spec_met = 0; + continue; + end; + g1 = [1:(nb-nc)] * dg_test; + g2 = [[(nb-nc+1):nb] nb*ones(1,na) [nb:-1:(nb-nc+1)]] * dg_test; + g3 = [(nb-nc):-1:0] * dg_test; + gp = [g1 g2 g3]; + if abs((sum(g2)*ts) - m0) > 10*eps, + error('grad_ss: Area not calculated correctly'); + end; + + if (equal) + gn = -gp; + else + gn = grad_mintrap(-sum(gp)*ts, mxg, mxs, ts); + end; + + % See if spec still met + % + if length([gp gn]) < n, + spec_met = 1; + + gp_save = gp; + g1_save = g1; + g2_save = g2; + g3_save = g3; + gn_save = gn; + nb_save = nb; + else + spec_met = 0; + end; + end; + + % Fix up result to have "exactly" n samples in it! + % + if ~equal + na = n - length(gn_save) - (2 * nb_save + 1); + else + na = (n - 2*(2 * nb_save + 1))/2; + end; + nb = nb_save; + nc = max(1,ceil(nb*f)); + + % Get correct amplitude, gradients now + % + dg_test = m0 / ( ((2*nb-nc+1)*nc + nb*na) *ts); + A = nb * dg_test; + if ((A >= 1.001 * mxg) || (dg_test > 1.001 * dg)), + error('Amp/Slew being exceeded'); + end; + g1 = [1:(nb-nc)] * dg_test; + g2 = [[(nb-nc+1):nb] nb*ones(1,na) [nb:-1:(nb-nc+1)]] * dg_test; + g3 = [(nb-nc):-1:0] * dg_test; + gpos = [g1 g2 g3]; + if abs((sum(g2)*ts) - m0) > 10*eps, + error('grad_ss: Area not calculated correctly'); + end; + + if (~equal) + ratio = sum(-gn_save)/sum(gpos); + if (ratio < 1-10*eps) + % warning('grad_ss: Improbable ratio'); % fix problem here + end; + gneg = gn_save / ratio; + else + gneg = -gpos; + end; +end; + + +return; + + diff --git a/RF_pulses/spectral_spatial/plot_spec.m b/RF_pulses/spectral_spatial/plot_spec.m new file mode 100644 index 0000000..c1373f4 --- /dev/null +++ b/RF_pulses/spectral_spatial/plot_spec.m @@ -0,0 +1,35 @@ +function plot_spec(f, a, d, type) +% PLOT_SPEC - Utility to plot frequency specifications +% +% plot_spec(f, a, d, type) +% +% f - frequency band edges +% a - band amplitudes +% d - band ripple specs +% type - line/plotting type (see S in 'help plot') + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if nargin < 4, + type = 'k--'; +end; +nband = length(f)/2; +for band = 1:nband, + idx = [band*2-1:band*2]; + plot(f(idx), a(idx)+d(band)*ones(1,2), sprintf('%s',type)); + hold on; + plot(f(idx), a(idx)-d(band)*ones(1,2), sprintf('%s',type)); +end; diff --git a/RF_pulses/spectral_spatial/plot_spec_phs.m b/RF_pulses/spectral_spatial/plot_spec_phs.m new file mode 100644 index 0000000..ef1aba4 --- /dev/null +++ b/RF_pulses/spectral_spatial/plot_spec_phs.m @@ -0,0 +1,49 @@ +function plot_spec_phs(f, a, d, w, h, type) +% PLOT_SPEC - Utility to plot frequency specifications +% +% plot_spec(f, a, d, type) +% +% f - frequency band edges +% a - band amplitudes +% d - band ripple specs +% type - line/plotting type (see S in 'help plot') + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if nargin < 6, + type = 'k--'; +end; +nband = length(f)/2; +subplot(211) +for band = 1:nband, + idx = [band*2-1 band*2]; + plot(f(idx), abs(a(band))+abs(d(band))*ones(1,2), sprintf('%s',type)); + hold on; + plot(f(idx), abs(a(band))-abs(d(band))*ones(1,2), sprintf('%s',type)); +end; +plot(w,abs(h)); + +subplot(212) +for band = 1:nband, + idx = [band*2-1 band*2]; + if abs(a(band)) == 0 + continue; + end + plot(f(idx), angle(a(band))+angle(d(band))*ones(1,2), sprintf('%s',type)); + hold on; + plot(f(idx), angle(a(band))-angle(d(band))*ones(1,2), sprintf('%s',type)); +end; +plot(w,angle(h)); diff --git a/RF_pulses/spectral_spatial/rf_ripple.m b/RF_pulses/spectral_spatial/rf_ripple.m new file mode 100644 index 0000000..bea08ba --- /dev/null +++ b/RF_pulses/spectral_spatial/rf_ripple.m @@ -0,0 +1,119 @@ + function [d, a, ang] = rf_ripple(de, a, ang, type) +% RF_RIPPLE - Compute polynomial ripple required for various pulse types +% +% Input +% - de - vector of ripples required +% - a - vector of amplitudes in bands +% - ang - angle of excitation +% - excitation type: 'ex', 'se', 'sat', 'inv' +% +% Output +% - d: ripples for filter design +% - a: band amplitudes for filter design +% - ang: angle of excitation + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +nband = length(de); +for band = 1:nband, + db = de(band); + ab = a(band); + switch (type ) + case 'ex' + % Determine B ripple originating from mxy ripple, + % find which is most significant, then use this + % to set the ripple + % + mxy_mid = sin(2*asin(sin(ang/2)*ab)); + mxy_pos = max(-1,min(1,db + mxy_mid)); + mxy_neg = max(-1,min(1,-db + mxy_mid)); + + B_mid = sin(ang/2) * ab; + B_pos = sin(asin(mxy_pos)/2); + B_neg = sin(asin(mxy_neg)/2); + + d(band) = max(abs(B_pos-B_mid), abs(B_neg-B_mid))/sin(ang/2); + case 'se' + mxy_mid = (sin(ang/2)*ab)^2; + mxy_pos = max(0,min(1,db + mxy_mid)); + mxy_neg = max(0,min(1,-db + mxy_mid)); + + % check for ripples that will result in B > 1 and scale back + % a if necessary + if (mxy_pos >= 1) || (mxy_neg >= 1) + ab = sqrt(1 - abs(db)) / sin(ang/2); + mxy_mid = (sin(ang/2)*ab)^2; + mxy_pos = max(0,min(1,db + mxy_mid)); + mxy_neg = max(0,min(1,-db + mxy_mid)); + a(band) = ab; + end + + B_mid = sin(ang/2) * ab; + B_pos = sqrt(mxy_pos); + B_neg = sqrt(mxy_neg); + + d(band) = max(abs(B_pos-B_mid), abs(B_neg-B_mid))/sin(ang/2); +% if a(band) == 1, +% d(band) = de(band)/4; +% else +% d(band) = sqrt(de(band)); +% end; + case {'inv','sat'} + mz_mid = 1 - 2* (sin(ang/2)*ab)^2; + mz_pos = max(-1,min(1,db + mz_mid)); + mz_neg = max(-1,min(1,-db + mz_mid)); + + % check for ripples that will result in B > 1 and scale back + % a if necessary + if (mz_neg <= -1) || (mz_pos <= -1) + ab = sqrt(1 - abs(db)/2) / sin(ang/2); + mz_mid = 1 - 2* (sin(ang/2)*ab)^2; + mz_pos = max(-1,min(1,db + mz_mid)); + mz_neg = max(-1,min(1,-db + mz_mid)); + a(band) = ab; + end + + B_mid = sin(ang/2) * ab; + B_pos = sin(acos(mz_pos)/2); + B_neg = sin(acos(mz_neg)/2); +% B_pos = sqrt((1-mz_pos)/2); % same as above +% B_neg = sqrt((1-mz_neg)/2); + + d(band) = max(abs(B_pos-B_mid), abs(B_neg-B_mid))/sin(ang/2); +% if a(band) == 1, +% d(band) = de(band)/8; +% else +% d(band) = sqrt(de(band)/2); +% end; +% case 'sat' +% if a(band) == 1, +% d(band) = de(band)/2; +% else +% d(band) = sqrt(de(band)); +% end; + + end; +end; + + +% scale a if the peak angle has been reduced +if max(a) ~= 1 + max_a = max(a); + a = a / max_a; + ang = 2*asin(sin(ang/2)*max_a); + d = d / max_a; +end \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/signa.m b/RF_pulses/spectral_spatial/signa.m new file mode 100644 index 0000000..483eb52 --- /dev/null +++ b/RF_pulses/spectral_spatial/signa.m @@ -0,0 +1,63 @@ +function signa(wav,fn,s) + +% +% signa(waveform, filename [,scale]); +% +% writes the waveform out as short integers with the low +% bit masked off. +% +% Inputs: +% waveform -- vector, may be complex +% filename -- string, if wavefrom is complex '.r' and '.i' are appended, +% and two files are written. +% scale -- optional scale. If unspecified, the waveform is scaled to +% full scale integer 32766. If specified, the output is +% waveform*scale*32766 +% + +% +% Written by John Pauly, Dec. 5, 1994 +% (c) Leland Stanford Jr. University +% + +wmax = hex2dec('7ffe'); + +% if no scale is specified, use as much dynamic range as possible +if nargin == 2, + s = 1/max(max(abs(real(wav)),abs(imag(wav)))); +end; + +% scale up to fit in a short integer +wav = wav*s*wmax; + +% mask off low bit, since it would be an EOS otherwise +wav = 2*round(wav/2); + +% if the imaginary component is zero, supress it +if sum(abs(imag(wav))) == 0, + wav = real(wav); +end; + +if isreal(wav), + fip = fopen(fn,'wb','b'); + if fip == -1, + disp(sprintf('Error opening %s for write',fn)); + return; + end; + fwrite(fip,wav,'short'); +else + fip = fopen([fn,'.r'],'wb','b'); + if fip == -1, + disp(sprintf('Error opening %s for write',[fn,'.r'])); + return; + end; + fwrite(fip,real(wav),'short'); + fclose(fip); + fip = fopen([fn,'.i'],'wb','b'); + if fip == -1, + disp(sprintf('Error opening %s for write',[fn,'.i'])); + return; + end; + fwrite(fip,imag(wav),'short'); + fclose(fip); +end; diff --git a/RF_pulses/spectral_spatial/spec_interp.m b/RF_pulses/spectral_spatial/spec_interp.m new file mode 100644 index 0000000..07a3d88 --- /dev/null +++ b/RF_pulses/spectral_spatial/spec_interp.m @@ -0,0 +1,130 @@ +function hi = spec_interp(h, ni, off, f, dbg) +% SPEC_INTERP - Interpolate filter keeping spectral response consistent +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + N = length(h); + mult_factor = 15; + w = linspace(-pi, pi, 2*mult_factor*N); + + % Try weighting samples that are in frequency band + % more heavily + % + f = f * pi; + idx_band = []; + nband = length(f)/2; + for band = 1:nband, + idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); + idx_band = [idx_band idx]; + end; + wt_band = 10; + wt = ones(length(w),1); + wt(idx_band) = wt_band; + + % Get reference transform + % + t_ref = [0:N-1]; + Wref = exp(-i*kron(w', t_ref)); + Fref = Wref * h(:); + Fref_wt = wt .* Fref; + + if (dbg >= 2), + filt_fig = figure; + end; + + + ni_2 = floor(ni/2); + for idx = 1:ni + % Get actual sampling positions + % + t_act = t_ref + off + (idx-1)/ni; + + if (dbg >= 2) + figure(filt_fig); + subplot(411); + stem([t_ref.' t_act.'], ones(length(t_ref),2)); + legend('Reference', 'Actual'); + title('Sampling Locations'); + end; + + % Get actual, add weights + % + Wact = exp(-i*kron(w', t_act)); + Wact_wt = repmat(wt,1,length(t_act)) .* Wact; + + % Get new filter + % + hi(idx,:) = pinv(Wact_wt)*Fref_wt; + + if ( (dbg >= 2) && (rem(idx,4)==0) ), + plot_db = 0; + figure(filt_fig); + + Fact = Wact * h(:); + Fact_fix = Wact * hi(idx,:).'; + + subplot(4,1,2); + hold off; + plot(abs(h)); + hold on; + plot(abs(hi(idx)), 'r--'); + title('Beta Polynomials'); + + subplot(4,1,3); + if plot_db, + hold off; + plot(w/pi,20*log10(abs(Fref)),'b-'); + hold on; + plot(w/pi, 20*log10(abs(Fact)), 'g--'); + plot(w/pi, 20*log10(abs(Fact_fix)), 'r--'); + ylabel('DB Scale'); + else + hold off; + plot(w/pi,abs(Fref),'b-'); + hold on; + plot(w/pi, abs(Fact), 'g--'); + plot(w/pi, abs(Fact_fix), 'r--'); + ylabel('Linear Scale'); + end; + + title('Magnitude Response'); + + subplot(4,1,4); + hold off; + plot(w/pi,angle(Fref),'b-'); + hold on; + plot(w/pi,angle(Fact),'g--'); + plot(w/pi,angle(Fact_fix),'r--'); + title('Phase Response'); + + fprintf(1,'Offset: %f -- Hit any key to continue\n', off + (idx-1)/ni); + pause; + end; + + + end; + + hi = hi(:); + + return; + + + + + diff --git a/RF_pulses/spectral_spatial/spec_interp_nonuniform.m b/RF_pulses/spectral_spatial/spec_interp_nonuniform.m new file mode 100644 index 0000000..4410296 --- /dev/null +++ b/RF_pulses/spectral_spatial/spec_interp_nonuniform.m @@ -0,0 +1,137 @@ +function [hi, t_all] = spec_interp_nonuniform(h, ni, off, f, dbg) +% SPEC_INTERP_NONUNIFORM - Interpolate filter to nonuniform taps while +% keeping spectral response consistent +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +if isempty(off) + off = 0.5; +end + + N = length(h); + mult_factor = 15; + w = linspace(-pi, pi, 2*mult_factor*N); + + % Try weighting samples that are in frequency band + % more heavily + % + f = f * pi; + idx_band = []; + nband = length(f)/2; + for band = 1:nband, + idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); + idx_band = [idx_band idx]; + end; + wt_band = 10; + wt = ones(length(w),1); + wt(idx_band) = wt_band; + + % Get reference transform + % + t_ref = [0:N-1]; + Wref = exp(-i*kron(w', t_ref)); + Fref = Wref * h(:); + Fref_wt = wt .* Fref; + + if (dbg >= 2), + filt_fig = figure; + end; + + t_off = ([1:ni]-(ni+1)/2)/(ni-1)*2*off; + t_all = zeros(ni, N); + + for idx = [1:ni] + % Get actual sampling positions + % + t_all(idx,:) = t_ref + t_off(idx)* (-1).^[0:N-1]; + t_act = t_all(idx,:); + + if (dbg >= 2) + figure(filt_fig); + subplot(411); + stem([t_ref.' t_act.'], ones(length(t_ref),2)); + legend('Reference', 'Actual'); + title('Sampling Locations'); + end; + + % Get actual, add weights + % + Wact = exp(-i*kron(w', t_act)); + Wact_wt = repmat(wt,1,length(t_act)) .* Wact; + + % Get new filter + % + hi(idx,:) = pinv(Wact_wt)*Fref_wt; + + if ( (dbg >= 2) && (rem(idx,5)==0) ), + plot_db = 0; + figure(filt_fig); + + Fact = Wact * h(:); + Fact_fix = Wact * hi(idx,:).'; + + subplot(4,1,2); + hold off; + plot(abs(h)); + hold on; + plot(abs(hi(idx)), 'r--'); + title('Beta Polynomials'); + + subplot(4,1,3); + if plot_db, + hold off; + plot(w/pi,20*log10(abs(Fref)),'b-'); + hold on; + plot(w/pi, 20*log10(abs(Fact)), 'g--'); + plot(w/pi, 20*log10(abs(Fact_fix)), 'r--'); + ylabel('DB Scale'); + else + hold off; + plot(w/pi,abs(Fref),'b-'); + hold on; + plot(w/pi, abs(Fact), 'g--'); + plot(w/pi, abs(Fact_fix), 'r--'); + ylabel('Linear Scale'); + end; + + title('Magnitude Response'); + + subplot(4,1,4); + hold off; + plot(w/pi,angle(Fref),'b-'); + hold on; + plot(w/pi,angle(Fact),'g--'); + plot(w/pi,angle(Fact_fix),'r--'); + title('Phase Response'); + + fprintf(1,'Offset: %f -- Hit any key to continue\n', t_off(idx)); + pause; + end; + + + end; + + hi = hi(:); + t_all = t_all(:); + + return; + + + + + diff --git a/RF_pulses/spectral_spatial/spectral_fact.m b/RF_pulses/spectral_spatial/spectral_fact.m new file mode 100644 index 0000000..4282eb3 --- /dev/null +++ b/RF_pulses/spectral_spatial/spectral_fact.m @@ -0,0 +1,64 @@ +% h = spectral_fact(r) +% +% Spectral factorization using Kolmogorov 1939 approach +% (code follows pp. 232-233, Signal Analysis, by A. Papoulis) +% +% Computes the minimum-phase impulse response which satisfies +% given auto-correlation. +% +% Input: +% r: auto-correlation coefficients should be passed in +% as a column vector, odd length +% Output +% h: impulse response that gives the desired auto-correlation + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +function h = spectral_fact(r) + +% length of the impulse response sequence +nr = length(r); +n = (nr+1)/2; + +% over-sampling factor +mult_factor = 30; % should have mult_factor*(n) >> n +m = mult_factor*n; + +% computation method: +% H(exp(jTw)) = alpha(w) + j*phi(w) +% where alpha(w) = 1/2*ln(R(w)) and phi(w) = Hilbert_trans(alpha(w)) + +% compute 1/2*ln(R(w)) +w = 2*pi*[0:m-1]/m; +R = exp( -j*kron(w',[-(n-1):n-1]) )*r; +R = abs(real(R)); % remove numerical noise from the imaginary part +alpha = 1/2*log(R); + +% find the Hilbert transform +alphatmp = fft(alpha); +alphatmp(floor(m/2)+1:m) = -alphatmp(floor(m/2)+1:m); +alphatmp(1) = 0; +alphatmp(floor(m/2)+1) = 0; +phi = real(ifft(j*alphatmp)); + +% now retrieve the original sampling +index = find(rem([0:m-1],mult_factor)==0); +alpha1 = alpha(index); +phi1 = phi(index); + +% compute the impulse response (inverse Fourier transform) +h = ifft(exp(alpha1+j*phi1),n); diff --git a/RF_pulses/spectral_spatial/ss_alias.m b/RF_pulses/spectral_spatial/ss_alias.m new file mode 100644 index 0000000..0902174 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_alias.m @@ -0,0 +1,385 @@ +function [f_a, a_a, d_a, f_off] = ss_alias(f, a, d, f_off, fs, sym, fig, threshold_edge) +% SS_ALIAS - Alias filter specifications into effective bandwidth +% +% function [f_a, a_a, d_a, f_off] = ss_alias(f, a, d, f_off, fs, sym, fig, threshold_edge) +% +% Inputs: +% f - frequency band edges, in Hz, each band monotonically increasing, +% length(f) = 2 * number of bands +% a - amplitude for each band [0..1] +% d - ripple weighting for each band +% f_off - offset frequency in Hz (if [], then will be +% set to include as many passbands within one sampling +% interval as possible +% fs - sampling frequency (bandwidth), in Hz +% sym - flag indicating whether frequency response should be symmetric +% threshold_edge - [optional], threshold of the min distance to the +% normalized spectrum edge [-1,1], usually 0.15-0.2 +% fig - [optional], figure to plot +% +% Outputs: +% f_a - Aliased frequency band edges into normalized freq [-1..1] +% a_a - amplitude of aliased bands +% d_a - ripple weighting of aliased bands +% f_off - offset frequency in Hz +% +% Modification by Hong Shang, June 2013 +% 1 Display the aliased filter spec if with one more input, fig, plot +% normalized band before and after aliasing and compatible flag, to help +% visualize the choice of BW +% 2 the choice of f_off when sym=0, for both including as many bands in the +% main spectrum and getting rid of bands at spectrum edge. +% 3 ripple can be different if overlap +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_alias.m,v 1.12 2014/05/22 20:43:59 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % check input parameters + % + if nargin < 6, + error('Usage: [f_a, a_a, d_a, f_off] = ss_alias(f, a, d, f_off, fs, sym)\n'); + elseif nargin == 6 + threshold_edge = 0.15; + display_flag = 0; + elseif nargin == 7 + if ishandle(fig) + display_flag = 1; + threshold_edge = 0.15; + else + display_flag = 0; + threshold_edge = fig; + end; + elseif nargin == 8 + display_flag = 1; + end; + + if mod(length(f), 2) ~= 0, + error('Frequency vector (f) of band pairs must be even length'); + end; + + nf = length(f)/2; + if length(d) ~= nf, + error('Ripple vector incorrect length'); + end; + if length(a) ~= nf, + error('Amplitude vector incorrect length'); + end; + + df = diff(f); + if (min(df(1:2:end)) <= 0) + error('Frequency bands must be monotonic increasing'); + end; + + if (max(df(1:2:end)) >= fs) % there is one band longer than bandwidth, impossible to design such filter + f_a = []; a_a = []; d_a = []; f_off = 0; + return; + end; + + % If sym flag then either set or check f_off + if (sym), + if ~isempty(f_off), + % Check specified frequency offset to make sure it is < midpoint + % of first band or > than midpoint of top band + if ((f_off > (f(2)-f(1))/2) && (f_off < (f(end) - f(end-1))/2) ) + error('f_off not at band edges'); + end; + else + % Set f_off to left band edge + f_off = (f(2)+f(1))/2; + end; + else + % Set f_off to include as many bands as possible in one sampling interval + if isempty(f_off) + if (max(f) - min(f)) <= fs, % all band can exist in the center spectrum + f_off = (max(f) + min(f))/2; + else + % Find how many bands are in -fs/2..fs/2 +% f_l = f(1:2:end); +% f_u = f(2:2:end); +% f_off_test = linspace(min(f)+fs/2, max(f)-fs/2, 100); +% band_in = zeros(length(f_off_test),length(f_l)); +% nband = zeros(1,length(f_off_test)); +% for off_idx = 1:length(f_off_test), +% f_off = f_off_test(off_idx); +% band_in(off_idx,:) = ((f_l >= f_off-fs/2) & (f_l <= f_off+fs/2) & (f_u >= f_off-fs/2) & (f_u <= f_off+fs/2)); +% nband(off_idx) = sum(band_in(off_idx,:)); +% end; +% [~, off_idx] = max(nband); +% in_idx = find(band_in(off_idx,:)); +% f_off = (f(in_idx(1)*2-1) + f(in_idx(end)*2))/2; + + % modification of choosing f_off + f_l = f(1:2:end); + f_u = f(2:2:end); + f_off_test = linspace(min(f), max(f), 500); % Hz + band_in = zeros(length(f_off_test),length(f_l)); + nband = zeros(1,length(f_off_test)); + edge_distance = zeros(1,length(f_off_test)); + split_flag = zeros(1,length(f_off_test)); + for off_idx = 1:length(f_off_test), + f_off = f_off_test(off_idx); + band_in(off_idx,:) = ((f_l >= f_off-fs/2) & (f_l <= f_off+fs/2) & (f_u >= f_off-fs/2) & (f_u <= f_off+fs/2)); + nband(off_idx) = sum(band_in(off_idx,:)); + + % pre-calculation of Normalized and aliased frequency + fnorm_pre = zeros(size(f)); + for idx = 1:nf + % Normalized frequencies + fa1 = (f(idx*2-1) - f_off) / (fs/2); + fa2 = (f(idx*2) - f_off) / (fs/2); + % Get aliased frequencies + fa1 = mod(fa1+1,2)-1; + fa2 = mod(fa2+1,2)-1; + % get rid of confusing about whether at -1, or 1 + if (fa2 < fa1) && (fa2 == -1) + fa2 = 1; + end; + if (fa2 < fa1) && (fa1 == 1) + fa1 = -1; + end; + % check whether a band is split + if fa2 < fa1 + split_flag(off_idx) = 1; + end + fnorm_pre(idx*2-1) = fa1; + fnorm_pre(idx*2) = fa2; + end + edge_distance(off_idx) = min( [min(fnorm_pre(1:2:end)+1), min(1-fnorm_pre(2:2:end))] ); + if split_flag(off_idx) > 0.5; edge_distance(off_idx) = 0; end; + end; + % figure; + % subplot(3,1,1); plot(f_off_test,edge_distance,'b.'); xlabel('offset frequency, Hz'); title('min distance to the edge'); axis tight; set(gca,'ylim',[-0.1 0.7]); + % subplot(3,1,2); plot(f_off_test,split_flag,'b.'); xlabel('offset frequency, Hz'); title('whether some bands are split'); axis tight; set(gca,'ylim',[0 1.5]); + % subplot(3,1,3); plot(f_off_test,nband,'b.'); xlabel('offset frequency, Hz'); title('how many bands in the main spectrum'); axis tight; set(gca,'ylim',[0 nf]); + + % find the optimal f_off + idx_1 = find( split_flag < 0.5 ); + f_off_test = f_off_test(idx_1); edge_distance = edge_distance(idx_1); nband = nband(idx_1); + idx_2 = find( nband == max(nband) ); + [value_3,idx_3] = max(edge_distance(idx_2)); + if value_3 > threshold_edge + f_off = f_off_test(idx_2(idx_3)); + else + idx_4 = find( nband >= (max(nband)-1) ); + [~,idx_5] = max(edge_distance(idx_4)); + f_off = f_off_test(idx_4(idx_5)); + end; + end; + end; + end; + + % If symmetric frequency response, then construct mirrored response, update number of bands + if (sym) + f_h = f - f_off; + f = [-f_h(end:-1:1) f_h] + f_off; + a = [a(end:-1:1) a]; + d = [d(end:-1:1) d]; + nf = length(f)/2; + end; + + % Go through each band pair, determine aliased frequencies + % in normalized space, and split if necessary + new_idx = 1; + fnorm = zeros(size(f)); + for idx = 1:nf, + % Normalize frequencies + fnorm(idx*2-1) = (f(idx*2-1) - f_off) / (fs/2); + fnorm(idx*2) = (f(idx*2) - f_off) / (fs/2); + + % Get aliased frequencies + fa1 = mod(fnorm(idx*2-1)+1,2)-1; + fa2 = mod(fnorm(idx*2)+1,2)-1; + + % in case one band is interrupted into two ends of main spectrum + % Check to see if endpoints can be shifted to form one single band + if (fa2 < fa1) && (fa2 == -1) + fa2 = 1; + end; + if (fa2 < fa1) && (fa1 == 1) + fa1 = -1; + end; + + if (fa2 < fa1), % if still split, then create a new band + f_a(new_idx*2-1) = -1; + f_a(new_idx*2) = fa2; + a_a(new_idx) = a(idx); + d_a(new_idx) = d(idx); + new_idx = new_idx + 1; + + f_a(new_idx*2-1) = fa1; + f_a(new_idx*2) = 1; + a_a(new_idx) = a(idx); + d_a(new_idx) = d(idx); + new_idx = new_idx + 1; + else + f_a(new_idx*2-1) = fa1; + f_a(new_idx*2) = fa2; + a_a(new_idx) = a(idx); + d_a(new_idx) = d(idx); + new_idx = new_idx + 1; + end; + end; + + % additional display + if display_flag == 1 + clf(fig); figure(fig); + subplot(2,1,1); hold on; + for i = 1:length(a) + f_sub = [fnorm(2*i-1),fnorm(2*i)]; + bound_down = (a(i) - d(i))*ones(size(f_sub)) ; + bound_up = (a(i) + d(i))*ones(size(f_sub)); + plot(f_sub,bound_down,'r-',f_sub,bound_up,'r-'); + end; + hold off; xlabel('normalized frequency'); title(['filter spec before aliasing at fs = ',num2str(fs),'Hz']); set(gca,'xlim',[min(fnorm)-0.1,max(fnorm)+0.1]); set(gca,'ylim',[0,max(a)+max(d)+3e-2]); + + figure(fig); subplot(2,1,2); hold on; + for i = 1:length(a_a) + f_sub = [f_a(2*i-1),f_a(2*i)]; + bound_down = (a_a(i) - d_a(i))*ones(size(f_sub)) ; + bound_up = (a_a(i) + d_a(i))*ones(size(f_sub)); + plot(f_sub,bound_down,'r-',f_sub,bound_up,'r-'); + end; + hold off; xlabel('normalized frequency'); title(['filter spec after aliasing at fs = ',num2str(fs),'Hz']); set(gca,'xlim',[-1,1]); set(gca,'ylim',[0,max(a_a)+max(d_a)+3e-2]); + end + + % Check for overlaps + % -- a little complicated + overlap_found = 1; + incompatible_overlap = 0; + while (overlap_found && ~incompatible_overlap && length(f_a)/2 > 1) + % Check each frequency band for overlap + nf = length(f_a)/2; + f_tmp = []; + a_tmp = []; + d_tmp = []; + for chk_idx = 1:nf, + % Copy frequency, ripple, amplitude + f_tmp(chk_idx*2-1) = f_a(chk_idx*2-1); + f_tmp(chk_idx*2) = f_a(chk_idx*2); + d_tmp(chk_idx) = d_a(chk_idx); + a_tmp(chk_idx) = a_a(chk_idx); + + % Check current band edges with all remaining bands for overlap + fl_1 = f_a(chk_idx*2-1); + fu_1 = f_a(chk_idx*2); + for rem_idx = chk_idx+1:nf, + % Initialize flags + overlap_ok = 0; + overlap_found = 0; + + % Check to see if overlap would be compatible i.e. same ripple, same amplitude + % if ((d_a(chk_idx) == d_a(rem_idx)) && (a_a(chk_idx) == a_a(rem_idx))); overlap_ok = 1; end; + % only amplitude need to be consistent, ripple can be + % different, use the smaller ripple if overlap + if ( a_a(chk_idx) == a_a(rem_idx) ); overlap_ok = 1; end; + + % Check if band edges overlap + fl_2 = f_a(rem_idx*2-1); + fu_2 = f_a(rem_idx*2); + if (fl_1 <= fl_2) && (fu_1 >= fl_2) + % Fix overlapping band + f_tmp(chk_idx*2-1) = fl_1; + f_tmp(chk_idx*2) = max(fu_1, fu_2); + d_tmp(chk_idx) = min([d_a(chk_idx),d_a(rem_idx)]); + + % Copy other bands + for cp_idx = (chk_idx+1):nf, + if cp_idx ~= rem_idx, + f_tmp = [f_tmp f_a(cp_idx*2-1) f_a(cp_idx*2)]; + a_tmp = [a_tmp a_a(cp_idx)]; + d_tmp = [d_tmp d_a(cp_idx)]; + end; + end; + overlap_found = 1; + break; % Start over + elseif (fu_1 >= fu_2) && (fl_1 <= fu_2) + % Fix overlapping bands + f_tmp(chk_idx*2-1) = min(fl_1, fl_2); + f_tmp(chk_idx*2) = fu_1; + d_tmp(chk_idx) = min([d_a(chk_idx),d_a(rem_idx)]); + + % Copy other bands + for cp_idx = (chk_idx+1):nf, + if cp_idx ~= rem_idx, + f_tmp = [f_tmp f_a(cp_idx*2-1) f_a(cp_idx*2)]; + a_tmp = [a_tmp a_a(cp_idx)]; + d_tmp = [d_tmp d_a(cp_idx)]; + end; + end; + overlap_found = 1; + break; % Start over + elseif (fl_1 >= fl_2) && (fu_1 <= fu_2) + % Fix overlapping bands + f_tmp(chk_idx*2-1) = fl_2; + f_tmp(chk_idx*2) = fu_2; + d_tmp(chk_idx) = min([d_a(chk_idx),d_a(rem_idx)]); + + % Copy other bands + for cp_idx = (chk_idx+1):nf, + if cp_idx ~= rem_idx, + f_tmp = [f_tmp f_a(cp_idx*2-1) f_a(cp_idx*2)]; + a_tmp = [a_tmp a_a(cp_idx)]; + d_tmp = [d_tmp d_a(cp_idx)]; + end; + end; + overlap_found = 1; + break; % Start over + end; + end; + if overlap_found, + incompatible_overlap = ~overlap_ok; + f_a = f_tmp; + d_a = d_tmp; + a_a = a_tmp; + break; % Start over from beginning + end; + end; + end; + + % If incompatible overlap, then return empty matrices + if incompatible_overlap, + f_a = []; d_a = []; a_a = []; + if display_flag == 1 %modification with additional display + figure(fig); subplot(2,1,2); legend('incompatible overlap'); + end + return; + end; + + % Sort frequencies into ascending order + [f_a, idx_sort] = sort(f_a); + a_a = a_a(idx_sort(2:2:end)/2); + d_a = d_a(idx_sort(2:2:end)/2); + + % If symmetric response then return only positive bands + if (sym) + % Find right band edges that are positive, and fix return variables + idx_pos = find(f_a(2:2:end) > 0); + f_tmp = []; + for idx = 1:length(idx_pos), + f_tmp(idx*2-1) = f_a(idx_pos(idx)*2-1); + f_tmp(idx*2) = f_a(idx_pos(idx)*2); + end; + f_a = max(0,f_tmp); + a_a = a_a(idx_pos); + d_a = d_a(idx_pos); + end; + + return; + + diff --git a/RF_pulses/spectral_spatial/ss_b1verse.m b/RF_pulses/spectral_spatial/ss_b1verse.m new file mode 100644 index 0000000..3ad99bf --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_b1verse.m @@ -0,0 +1,238 @@ +function [rfv, gv] = ss_b1verse(g, rf, b1max, gmax, smax, ts, gamma, slew_penalty, dbg); +% [rfv, gv] = ss_b1verse(g, rf, b1max, gmax, smax, ts, gamma, slew_penalty, dbg) +% +% Use VERSE to reduce maximum RF amplitude while retaining an +% identical pulse duration. +% Input RF and gradient must correspond (ie RF should be once VERSE'd if +% gradient is varying). +% A slew rate penalty that reduces the allowable slew rate for larger RF +% amplitudes is also implemented with the slew_penalty variable that +% determines the degree of this penalty. +% +% INPUTS: +% g - gradient in G/cm +% rf - scaled as per rftools (sum(rf) = flip) +% b1max - max RF +% gmax - max gradient, in G/cm +% smax - max slew rate, in G/cm/ms +% ts - sampling interval, in sec +% gamma - gyromagnetic ratio, in Hz/G +% slew_penalty (optional) - degree of slew rate reduction +% default is 0 (no penalty) +% dbg (optional) - indicates debug level +% +% OUTPUTS: +% rfv - versed RF +% gv - new gradient + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% TODO: +% - allow negative gradients + +if nargin < 8 + slew_penalty = 0; +end + +if nargin < 9 + dbg = 0; +end + +if length(g) == 1 + g = g*ones(size(rf)); +end + +if length(b1max) == 1 + b1max = b1max*ones(size(rf)); +end + +dt = ts*ones(size(rf)); +t_unif = ([0:length(rf)-1] + 0.5) * ts; +dt_unif = dt; + +S_rfg = 1 / (2*pi*gamma*ts); + +% convert to Gauss +if dbg >= 2 + rfg = rf *S_rfg; + fprintf('Initial Max RF fraction: %f\n', max(abs(rfg) ./ b1max)); +end + +T = sum(dt); + +notdone = 1; + +% maxiter may not be necessary because +% the routine should either fail or succeed at some point +niter = 0; +maxiter = 100; + +%area = sum(g); + +while (niter < maxiter) + niter = niter + 1; + + Imaxed = zeros(size(rf)); + Islewed = zeros(size(rf)); + % fix points with zero gradient + Islewed(find(g==0)) = 1; + % fix endpoints + Islewed([1,end]) = 1; + + if dbg >= 2 + figure(99) + subplot(311) + plot(cumsum(dt),g) + subplot(312) + plot(cumsum(dt),abs(rf) / (2*pi*gamma*ts)) + subplot(313) + plot(cumsum(dt),diff(g) ./ ((dt(1:end-1) + dt(2:end))/2)) + pause + end + + b = ones(1,5)/5; + b =firls(8, [0 .03 .06 1], [1 1 0 0]); + rffilt = filtfilt(b, 1, abs(rf)) / (sum(b)^2); + rffilt = max(abs(rf), rffilt); +% rffilt = abs(rf); + filtmax = max( max(abs(rffilt)), max(b1max)/S_rfg); + s_mod = (1 - 0.999*rffilt/filtmax) .^slew_penalty; +% s_mod = (1 - 0.999*abs(rf)/max(abs(rf))) .^slew_penalty; + +% s_mod = (tanh((slew_penalty(1) - rffilt/filtmax) * slew_penalty(2)) + 1 ) / 2; + smax_mod = smax*1e3 * s_mod; + + % Go through gradient forward looking for slew-rate violations + for k = 2:length(rf) + slew = (g(k) - g(k-1)) / (dt(k) + dt(k-1)) / 0.5; + + if 1 + smaxk = smax*1e3 * ... + (1 - (abs(rffilt(k)) + abs(rffilt(k-1)))*S_rfg / (b1max(k)+b1max(k-1)) )^slew_penalty; + else + smaxk = smax_mod(k); + end + if (slew > smaxk ) + gh = g(k); gl = g(k-1); + dth = dt(k); dtl = dt(k-1); + + a = smax_mod(k) * dth; + b = smax_mod(k) * dtl + 2*gl; + c = -2*gh; + + scale = (-b + sqrt(b^2-4*a*c))/(2*a); + + rf(k) = rf(k) / scale; + g(k) = g(k) / scale; + dt(k) = dt(k) * scale; + Islewed(k) = 1; + end + + end + + % Go through gradient in reverse looking for slew-rate violations + for k = length(rf)-1:-1:1 + slew = (g(k) - g(k+1)) / (dt(k) + dt(k+1)) / 0.5; + + if 1 + smaxk = smax*1e3 * ... + (1 - (abs(rffilt(k)) + abs(rffilt(k+1)))*S_rfg / (b1max(k) + b1max(k+1)) )^slew_penalty; + else + smaxk = smax_mod(k); + end + if (slew > smaxk) + gh = g(k); gl = g(k+1); + dth = dt(k); dtl = dt(k+1); + + a = smax_mod(k) * dth; + b = smax_mod(k) * dtl + 2*gl; + c = -2*gh; + + scale = (-b + sqrt(b^2-4*a*c))/(2*a); + + rf(k) = rf(k) / scale; + g(k) = g(k) / scale; + dt(k) = dt(k) * scale; + Islewed(k) = 1; + end + + end + + + % Check for violoations of max RF + for k = 1:length(rf) + rfscale = abs(rf(k)) * S_rfg / (b1max(k)*.999); + + if (rfscale > 1) + rf(k) = rf(k) / rfscale; + g(k) = g(k) / rfscale; + dt(k) = dt(k) * rfscale; + + Imaxed(k) = 1; + end + end + + + % compensate for time expansion in removing max RF and slew + % rate violations by shrinking other time samples and increasing + % RF and gradient correspondingly + Ifixed = find(Imaxed | Islewed); + Ishrink = find(~(Imaxed | Islewed)); + shrink_scale = (T - sum(dt(Ifixed))) / sum(dt(Ishrink)); + + % Check if pulse exceeds length requirement + if shrink_scale < 0 + % error('ss_verse: RF pulse unrealizeable'); + rfv = []; + gv = []; + return; + elseif (abs(shrink_scale-1) < 1e-14) || (isempty(Imaxed) && isempty(Islewed)) + % DONE! + notdone = 0; + else + rf(Ishrink) = rf(Ishrink) / shrink_scale; + g(Ishrink) = g(Ishrink) / shrink_scale ; + dt(Ishrink) = dt(Ishrink) * shrink_scale; + + % timepoints at center of little hard pulses + t = cumsum([0, dt(1:end-1)]) + dt/2; + + rf = interp1(t, rf, t_unif, 'spline', 'extrap'); + g = interp1(t, g, t_unif, 'spline', 'extrap'); +% g = g/sum(g) * area; + dt = dt_unif; + end + + niter = niter + 1; + +end + +% check if gradient limits exceeded +gscale = abs(g) / gmax; +if max(gscale) > 1 + %error('ss_verse: RF pulse unrealizeable'); + rfv = []; + gv = []; + return; +end + +rfv = rf; +gv = g; + +if dbg >= 2 + rfvg = rfv*S_rfg; + fprintf('Final Max RF fraction: %f\n', max(abs(rfvg) ./ b1max)); +end diff --git a/RF_pulses/spectral_spatial/ss_band_plot.m b/RF_pulses/spectral_spatial/ss_band_plot.m new file mode 100644 index 0000000..cc46d4f --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_band_plot.m @@ -0,0 +1,99 @@ +function ss_band_plot(f, a, d, fo, fs, f1, f2, sym) +% SS_BAND_PLOT - Plot filter specification +% +% Inputs: +% f - frequency band edges in normalized frequency [-1..1] +% a - amplitude of bands +% d - ripple weighting +% fo - offset absolute frequency +% fs - sampling frequency +% f1, f2 - upper lower absolute frequencies to plot +% sym - flag whether response is symmetric +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_band_plot.m,v 1.6 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Exit if frequency vector is empty + % + if isempty(f), + fprintf(1,'No frequency bands to plot\n'); + return; + end; + + if sym, + fmod = f; + f = [-fmod(end:-1:1) fmod]; + a = [a(end:-1:1) a]; + d = [d(end:-1:1) d]; + end; + + % Plot unaliased frequency bands + % + nf = length(f)/2; + figure; + subplot(211); + hold on; + for idx = 1:nf, + plot(f((idx*2-1):(idx*2))*fs/2+fo, [a(idx) a(idx)]); + plot(f((idx*2-1):(idx*2))*fs/2+fo, [a(idx) a(idx)] + d(idx), '--'); + plot(f((idx*2-1):(idx*2))*fs/2+fo, [a(idx) a(idx)] - d(idx), ... + '--'); + end; + grid; + title('Unaliased Filter Specification'); + xlabel('Frequency'); + ylabel('Amplitude Response'); + + % Plot absolute frequency response + % + subplot(212); + hold on; + + % Find what repeating responses need to be considered + % + low_mult = ceil(((fo-f1)-fs/2) / fs); + hi_mult = ceil(((f2-fo)-fs/2) / fs); + for mult = -low_mult:hi_mult, + foff = fo + fs*mult; + for idx = 1:nf, + % Get repeating band edge + % + f_l = (f(idx*2-1) * fs/2) + foff; + f_u = (f(idx*2) * fs/2) + foff; + + % Plot if in bounds + % + f_l = min(max(f_l, f1), f2); + f_u = min(max(f_u, f1), f2); + if (f_l ~= f_u), + plot([f_l f_u], [a(idx) a(idx)]); + plot([f_l f_u], [a(idx) a(idx)] + d(idx), '--'); + plot([f_l f_u], [a(idx) a(idx)] - d(idx), '--'); + end; + end; + end; + grid; + title(sprintf('Filter Specification - Fs: %6.1f Hz', fs)); + xlabel('Frequency'); + ylabel('Amplitude Response'); + + + + diff --git a/RF_pulses/spectral_spatial/ss_band_plot_phs.m b/RF_pulses/spectral_spatial/ss_band_plot_phs.m new file mode 100644 index 0000000..c3412b7 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_band_plot_phs.m @@ -0,0 +1,99 @@ +function ss_band_plot_phs(f, a, d, fo, fs, f1, f2, sym) +% SS_BAND_PLOT - Plot filter specification +% +% Inputs: +% f - frequency band edges in normalized frequency [-1..1] +% a - amplitude of bands +% d - ripple weighting +% fo - offset absolute frequency +% fs - sampling frequency +% f1, f2 - upper lower absolute frequencies to plot +% sym - flag whether response is symmetric +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_band_plot_phs.m,v 1.2 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Exit if frequency vector is empty + % + if isempty(f), + fprintf(1,'No frequency bands to plot\n'); + return; + end; + + if sym, + fmod = f; + f = [-fmod(end:-1:1) fmod]; + a = [a(end:-1:1) a]; + d = [d(end:-1:1) d]; + end; + + % Plot unaliased frequency bands + % + nf = length(f)/2; + figure; + subplot(211); + hold on; + for idx = 1:nf, + plot(f((idx*2-1):(idx*2))*fs/2+fo, abs([a(idx) a(idx)])); + plot(f((idx*2-1):(idx*2))*fs/2+fo, abs([a(idx) a(idx)]) + abs(d(idx)), '--'); + plot(f((idx*2-1):(idx*2))*fs/2+fo, abs([a(idx) a(idx)]) - abs(d(idx)), ... + '--'); + end; + grid; + title('Unaliased Filter Specification'); + xlabel('Frequency'); + ylabel('Amplitude Response'); + + % Plot absolute frequency response + % + subplot(212); + hold on; + + % Find what repeating responses need to be considered + % + low_mult = ceil(((fo-f1)-fs/2) / fs); + hi_mult = ceil(((f2-fo)-fs/2) / fs); + for mult = -low_mult:hi_mult, + foff = fo + fs*mult; + for idx = 1:nf, + % Get repeating band edge + % + f_l = (f(idx*2-1) * fs/2) + foff; + f_u = (f(idx*2) * fs/2) + foff; + + % Plot if in bounds + % + f_l = min(max(f_l, f1), f2); + f_u = min(max(f_u, f1), f2); + if (f_l ~= f_u), + plot([f_l f_u], abs([a(idx) a(idx)])); + plot([f_l f_u], abs([a(idx) a(idx)]) + abs(d(idx)), '--'); + plot([f_l f_u], abs([a(idx) a(idx)]) - abs(d(idx)), '--'); + end; + end; + end; + grid; + title(sprintf('Filter Specification - Fs: %6.1f Hz', fs)); + xlabel('Frequency'); + ylabel('Amplitude Response'); + + + + diff --git a/RF_pulses/spectral_spatial/ss_design.m b/RF_pulses/spectral_spatial/ss_design.m new file mode 100644 index 0000000..b8bc6e6 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_design.m @@ -0,0 +1,492 @@ +function [g, rf, fs_best, z_plot, f_plot, m_plot] = ... + ss_design(z_thk, z_tb, z_de, f, a_angs, de,... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg, no_plot); + + +% SS_DESIGN - Design spectral-spatial pulse +% +% [g, rf, fs_best, z_plot, f_plot, m_plot] = ... +% ss_design(z_thk, z_tb, z_de, f, a_angs, de,... +% ptype, z_ftype, s_ftype, ss_type, ... +% f_off, dbg, no_plot) +% +% INPUTS +% z_thk - slice thickness (cm) +% z_tb - spatial time-bandwidth +% z_de - spatial ripples, [pass_ripple, stop_ripple] +% f - spectral band edge specification (Hz) +% a_ang - spectral band flip angle specification (radians) +% de - spectral band ripples +% ptype - spatial pulse type: 'ex' (default), 'se', 'sat', 'inv' +% z_ftype - spatial filter type: 'ms', 'ls', 'pm' (default), 'min', 'max' +% s_ftype - spectral filter type: 'min' (default), 'max', 'lin' +% ss_type - spectral-spatial type: 'Flyback Whole' (default), +% 'Flyback Half', 'EP Whole', 'EP Half', +% 'EP Whole Opp-Null', 'EP Half Opp-Null' +% f_off - center frequency (empty to let ss_design choose) +% dbg - print debug messages: 0-none (default), 1-some, 2-more +% no_plot - set to 1 to turn off plotting +% +% OUTPUTS +% g - gradient (G/cm) +% rf - RF (G) +% fs_best - spectral sampling frequency (Hz) +% z_plot, f_plot, m_plot - ss_plot() outputs, ranges and values in figure +% +% See scripts in examples/ folder demonstrations of how to use this +% function. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% +% $Header: /home/adam/cvsroot/src/ss/ss_design.m,v 1.33 2014/05/22 22:44:36 peder Exp $ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Check all inputs + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + if (nargin < 6), + error(['Usage: ss_design(z_thk, z_tb, z_d, f, a_angs, d,' ... + 'ptype, z_fttype, s_ftype, ss_type, foff)']); + end; + + % Check ptype + % + if (nargin < 7) || isempty(ptype), + ptype = 'ex'; + else + switch ptype, + case {'ex', 'se', 'sat', 'inv'} + otherwise + error(sprintf(['Spatial pulse type (ptype) of: %s not' ... + ' recognized'], ptype)); + end; + end; + + % Check z_ftype + % + if (nargin < 8) || isempty(z_ftype), + z_ftype = 'pm'; + else + switch z_ftype, + case {'ms', 'ls', 'pm', 'min', 'max'} + otherwise + error(sprintf(['Spatial filter type (z_ftype) of: %s not' ... + ' recognized'], z_ftype)); + end; + end; + + % Check s_ftype + % + if (nargin < 9) || isempty(s_ftype), + s_ftype = 'min'; + else + switch s_ftype, + case {'min', 'max', 'lin'} + otherwise + error(sprintf(['Spectral filter type (s_ftype) of: %s not' ... + ' recognized'], s_ftype)); + end; + end; + + % Check ss_type + % + if (nargin < 10) || isempty(ss_type), + ss_type = 'Flyback Whole'; + else + switch ss_type, + case {'Flyback Whole', 'Flyback Half', ... + 'EP Whole', 'EP Half', 'EP Whole Opp-Null', ... + 'EP Half Opp-Null'} + otherwise + error(sprintf(['Spectral-spatial type (ss_type) of: %s not' ... + ' recognized'], ss_type)); + end; + end; + + % Check f_off + % + if (nargin < 11) || isempty(f_off), + f_off = []; + end; + + % Check dbg + % + if (nargin < 12) || isempty(dbg), + dbg = 0; + end; + + if (nargin < 13) || isempty(no_plot), + no_plot = 0; + end; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Initialize globals + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Convert "a_angs" to Beta polynomial "a" + % Convert effective ripples to polynomial ripples + % depending on pulse type + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ang = max(a_angs); + + if SS_SLR_FLAG, + a = sin(a_angs/2)/sin(ang/2); + %a = asin(sin(ang)*a)/ang; + else + a = a_angs/ang; + end + + [d,a,ang] = rf_ripple(de, a, ang, ptype); + z_d = rf_ripple(z_de, [1 0], ang, ptype); + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Calculate gradient lobe required to achieve spatial + % prescription + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Calculate cycles/cm required + % + kz_max = z_tb / z_thk; % cycles/cm + kz_area = kz_max / SS_GAMMA; % G/cm * s + + % Note: If ss_type is EP, then SS_EQUAL_LOBES must be 1 + % + if strfind(ss_type, 'EP') + SS_EQUAL_LOBES = 1; + else; + SS_EQUAL_LOBES = 0; + end; + + % Get SS gradient lobes that gives this area with + % the desired fraction of sloped gradient included + % (this is to limit amount of versing required) + % + [gpos, gneg, g1, g2, g3] = ... + grad_ss(kz_area, [], SS_VERSE_FRAC, SS_MXG, SS_MXS, ... + SS_TS, SS_EQUAL_LOBES); + + % Calculate maximum spectral sampling frequency + % + lobe = [gpos gneg]; + t_poslobe = length(gpos) * SS_TS; + t_lobe = length(lobe) * SS_TS; + fs_scale = 1; + if strfind(ss_type, 'EP') + fs_max = 2/t_lobe; + if ~strfind(ss_type, 'Opp-Null') + fs_scale = 1/2; % If true null, make sure + end; % aliasing check is for half-frequency + else + fs_max = 1/t_lobe; + end; + + % Estimate sampling frequencies that won't cause + % incompatible aliasing of stopbands/passbands + % + switch ss_type, + case {'Flyback Half', 'EP Half', 'EP Half Opp-Null'}, + sym_flag = 1; + otherwise + sym_flag = 0; + end; + + fdiff = diff(f); + fwidths = sort(fdiff(1:2:end), 2, 'descend'); + fs_min = sum(fwidths(1:2))/2; % Loose estimate on lower bound + df = (fs_max-fs_min)/(SS_NUM_FS_TEST-1); + for idx = 1:SS_NUM_FS_TEST, + fs_test(idx) = fs_min + (idx-1)*df; + % Make sure fs_cur is integer number of samples + % + nsamp = ceil(1/(fs_test(idx)*SS_TS)); + fs_test(idx) = 1/(nsamp*SS_TS); + + % Test aliasing of frequencies into operating BW + % + [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_test(idx)*fs_scale,sym_flag); + if (isempty(f_a)), + fs_ok(idx) = 0; + else + fs_ok(idx) = 1; + end; + end; + if (dbg >= 2) + figure; + plot(fs_test, fs_ok, '*'); + title('Feasible Spectral Sampling Frequencies'); + xlabel('Frequency [Hz]'); + ylabel('Flag (1=OK, 0=No Good)'); + drawnow; + pause(1); + end; + + if (~any(fs_ok == 1)), + fs_over = fs_test(end); + while isempty(f_a) + fs_over = fs_over + df; + [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_over*fs_scale,sym_flag); + end; + + fprintf(1,'ss_design: Incompatible aliasing of frequency spec\n'); + fprintf(1,'at all tested frequencies. \n'); + fprintf(1,'Current max sampling is: %6.1f\n', fs_max); + fprintf(1,'Estimated required sampling is: %6.1f\n', fs_over); + fprintf(1, 'Try any of the following to incr:\n'); + fprintf(1,' - Decrease spatial TBW\n'); + fprintf(1,' - Increase slice thickness\n'); + fprintf(1,' - Increase VERSE fraction\n'); + fprintf(1,' - Decrease frequency band widths\n'); + switch (ss_type), + case {'Flyback Whole', 'Flyback Half'} + fprintf(1,' - Try EPI type SS\n'); + end; + error('No good fs'); + end; + fs_bands_left = find(diff([0 fs_ok]) == 1); + fs_bands_right = find(diff([fs_ok 0]) == -1); + fs_bands = [fs_bands_left; fs_bands_right]; + fs_bands = fs_bands(:)'; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Iterate on lobe width trying to meet B1 requirements + % with minimum-time pulse + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + nsolutions = 0; + + if (SS_NUM_LOBE_ITERS == 1), + fs_top = fs_bands(end); + fs_best = fs_test(fs_top); + + % Call design script for SS that calculates rf, g that meets + % sampling requirements + % + + if strfind(ss_type, 'Flyback') + [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + + if ~isempty(rf), + b1_best = max(abs(rf)); + dur_best = length(rf) * SS_TS; + pow_best = sum(abs(rf).^2) * SS_TS; + nsolutions = 1; + fprintf(1,'Solution(s) exists!\n'); + fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); + else + fprintf(1, 'Fs: %6.1f *** No Soln ***\n', fs_best); + + end; + else + fprintf(1, 'Iterating on spectral sampling frequency to reduce B1\n'); + + % Keep iterating on pulse design until B1 requirement is + % met with highest sampling rate possible + % + dur_best = inf; + b1_best = inf; + nbands = length(fs_bands)/2; + for band = nbands:-1:1, + % Try each band + % + fs_bot = fs_bands(band*2-1); + fs_top = fs_bands(band*2); + d_idx = floor((fs_top - fs_bot + 1)/(SS_NUM_LOBE_ITERS-1)); + d_idx = max(1,d_idx); + niter = ceil((fs_top-fs_bot+1)/d_idx); + for iter = niter:-1:1, + idx = fs_bot + (iter-1)*d_idx; + if iter == niter, + idx = fs_top; + end; + fs = fs_test(idx); + + % Call design script for SS that calculates rf, g that meets + % sampling requirements + % + if strfind(ss_type, 'Flyback') + [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d, fs, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d, fs, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + if isempty(rf), + fprintf(1, 'Band: %d/%d Iter: %d/%d Fs: %6.1f *** No Soln ***\n', ... + nbands-band+1, nbands, niter-iter+1, niter, fs); + continue; + end; + + nsolutions = nsolutions+1; + + rfall{nsolutions} = rf; + gall{nsolutions} = g; + fsall(nsolutions) = fs; + + b1 = max(abs(rf)); + dur = length(rf) * SS_TS; + pow = sum(abs(rf).^2) * SS_TS; + + infoall{nsolutions} = sprintf('Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms', ... + fs, b1, pow, dur*1e3); + fprintf(1, 'Band: %d/%d Iter: %d/%d %s\n', nbands-band+1, nbands, niter-iter+1, niter, infoall{nsolutions}); + + + if ((b1 <= SS_MAX_B1) && (dur < dur_best)) + b1_best = b1; + dur_best = dur; + + Ibest = nsolutions; + elseif ((b1_best > SS_MAX_B1) && (b1 < b1_best)) + b1_best = b1; + dur_best = dur; + + Ibest = nsolutions; + end + end; + end; + + % Choose desired solution + % + if nsolutions > 0 + fprintf(1, '\n'); + fprintf(1,'Solution(s) exists!\n'); + for n=1:nsolutions + fprintf(1, '%d) %s\n', n, infoall{n}); + end + if nsolutions > 1 + Isolution = input('Which pulse would you like to use? (leave empty for shortest pulse) '); + if isempty(Isolution) || Isolution < 1 || Isolution > nsolutions + Isolution = Ibest; + end + fprintf(1, 'Returning %s\n', infoall{Isolution}); + else + Isolution = 1; + end + rf = rfall{Isolution}; + g = gall{Isolution}; + fs_best = fsall(Isolution); + end + + end; + + + + if isempty(rf) + fprintf(1,'No solution found! Trying to increase band ripples to determine limiting\n frequency specifications...\n') + + orig_min_order = SS_MIN_ORDER; + SS_MIN_ORDER = 0; + fs_top = fs_bands(end); + fs_best = fs_test(fs_top); + + d_max = 1*ones(size(d)); + d_min = d; + tol_factor = 4; + + for Id = 1:length(d) + % trying bisection search with increased ripple in each band to + % determine which portion of frequency spec is limiting + d_test = d; + + while (d_max(Id) - d_min(Id)) > d(Id)/tol_factor + d_test(Id) = (d_max(Id) + d_min(Id))/2; + + if strfind(ss_type, 'Flyback') + [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + % update min/max ripple values + if ~isempty(rf), + d_max(Id) = d_test(Id); + else + d_min(Id) = d_test(Id); + end; + end + end + + % find ripple values that create solutions + Ifix = find(d_max < 1); + if ~isempty(Ifix) + [tempmin Imin] = min(d_max - d); + d_fix = d; d_fix(Imin) = d_max(Imin); + fprintf(1,'Solution found by increasing ripples in bands %s\n', int2str(Ifix)); + fprintf(1,'Returning pulse with increased ripple in band %d (%.1f to %.1f Hz):\n', Imin, f(2*Imin-1), f(2*Imin)); + + if strfind(ss_type, 'Flyback') + [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + b1_best = max(abs(rf)); + dur_best = length(rf) * SS_TS; + pow_best = sum(abs(rf).^2) * SS_TS; + fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); + + fprintf(1,'\nPulse specs should be modified by reducing bandwidths or increasing ripple in bands %s\n', int2str(Ifix)); + fprintf(1,'Increasing the max pulse duration or slice thickness may also help\n'); + + + else + error('No solution found! Try reducing bandwidths, increasing ripple, increasing max duration, increasing slice thickness...') + end + + + SS_MIN_ORDER = orig_min_order; + end; + + if (no_plot==0) + % Test RF + % + fmid = (f(1:2:end) + f(2:2:end))/2; + bw = [min([f,-fs_best/2]) max([f,fs_best/2])]; + [f_plot,z_plot,m_plot] = ss_plot(g,rf,SS_TS, ptype,z_thk*2,bw,... + SS_GAMMA, fmid); + end + + + \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_design_phs.m b/RF_pulses/spectral_spatial/ss_design_phs.m new file mode 100644 index 0000000..9c20363 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_design_phs.m @@ -0,0 +1,495 @@ +function [g, rf, fs_best, z_plot, f_plot, m_plot, isodelay] = ... + ss_design_phs(z_thk, z_tb, z_de, f, a_angs, de, a_phs, d_phs, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + + +% SS_DESIGN - Design spectral-spatial pulse +% +% [g, rf, fs_best, z_plot, f_plot, m_plot] = ... +% ss_design(z_thk, z_tb, z_de, f, a_angs, de,... +% ptype, z_ftype, s_ftype, ss_type, ... +% f_off, dbg) +% +% INPUTS +% z_thk - slice thickness (cm) +% z_tb - spatial time-bandswidth +% z_de - spatial ripples, [pass_ripple, stop_ripple] +% f - spectral band edge specification (Hz) +% a_ang - spectral band flip angle specification (radians) +% de - spectral band ripples - inphase +% a_phs - spectral band phase specification (radians) +% d_phs - spectral band ripples - phase - (radians) +% ptype - spatial pulse type: 'ex' (default), 'se', 'sat', 'inv' +% z_ftype - spatial filter type: 'ms', 'ls', 'pm' (default), 'min', 'max' +% s_ftype - spectral filter type: 'min' (default), 'max', 'lin' +% ss_type - spectral-spatial type: 'Flyback Whole' (default), +% 'Flyback Half', 'EP Whole', 'EP Half', +% 'EP Whole Opp-Null', 'EP Half Opp-Null' +% f_off - center frequency (empty to let ss_design choose) +% dbg - print debug messages: 0-none (default), 1-some, 2-more +% +% OUTPUTS +% g - gradient (G/cm) +% rf - RF (G) +% fs_best - spectral sampling frequency (Hz) +% z_plot, f_plot, m_plot - ss_plot() outputs, ranges and values in figure +% isodelay - time from effective tipdown to end of pulse +% +% See scripts in examples/ folder demonstrations of how to use this +% function. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% +% $Header: /home/adam/cvsroot/src/ss/ss_design_phs.m,v 1.5 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Check all inputs + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + if (nargin < 8), + error(['Usage: ss_design(z_thk, z_tb, z_d, f, a_angs, d, a_phs, d_quad' ... + 'ptype, z_fttype, s_ftype, ss_type, foff)']); + end; + + % Check ptype + % + if (nargin < 9) || isempty(ptype), + ptype = 'ex'; + else + switch ptype, + case {'ex', 'se', 'sat', 'inv'} + otherwise + error(sprintf(['Spatial pulse type (ptype) of: %s not' ... + ' recognized'], ptype)); + end; + end; + + % Check z_ftype + % + if (nargin < 10) || isempty(z_ftype), + z_ftype = 'pm'; + else + switch z_ftype, + case {'ms', 'ls', 'pm', 'min', 'max'} + otherwise + error(sprintf(['Spatial filter type (z_ftype) of: %s not' ... + ' recognized'], z_ftype)); + end; + end; + + % Check s_ftype + % + if (nargin < 11) || isempty(s_ftype), + s_ftype = 'min'; + else + switch s_ftype, + case {'min', 'max', 'lin', 'min_power'} + otherwise + error(sprintf(['Spectral filter type (s_ftype) of: %s not' ... + ' recognized'], s_ftype)); + end; + end; + + % Check ss_type + % + if (nargin < 12) || isempty(ss_type), + ss_type = 'Flyback Whole'; + else + switch ss_type, + case {'Flyback Whole', 'Flyback Half', ... + 'EP Whole', 'EP Half', 'EP Whole Opp-Null', ... + 'EP Half Opp-Null'} + otherwise + error(sprintf(['Spectral-spatial type (ss_type) of: %s not' ... + ' recognized'], ss_type)); + end; + end; + + % Check f_off + % + if (nargin < 13) || isempty(f_off), + f_off = []; + end; + + % Check dbg + % + if (nargin < 14) || isempty(dbg), + dbg = 0; + end; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Initialize globals + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Convert "a_angs" to Beta polynomial "a" + % Convert effective ripples to polynomial ripples + % depending on pulse type + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ang = max(a_angs); + + if SS_SLR_FLAG, + a = sin(a_angs/2)/sin(ang/2); + %a = asin(sin(ang)*a)/ang; + else + a = a_angs/ang; + end + + z_d = rf_ripple(z_de, [1 0], ang, ptype); + [d,a,ang] = rf_ripple(de, a, ang, ptype); + + % Update d, a to be complex to include phase specification + % + d = d .* exp(i*d_phs); + a = a .* exp(i*a_phs); + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Calculate gradient lobe required to achieve spatial + % prescription + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Calculate cycles/cm required + % + kz_max = z_tb / z_thk; % cycles/cm + kz_area = kz_max / SS_GAMMA; % G/cm * s + + % Note: If ss_type is EP, then SS_EQUAL_LOBES must be 1 + % + if strfind(ss_type, 'EP') + SS_EQUAL_LOBES = 1; + else; + SS_EQUAL_LOBES = 0; + end; + + % Get SS gradient lobes that gives this area with + % the desired fraction of sloped gradient included + % (this is to limit amount of versing required) + % + [gpos, gneg, g1, g2, g3] = ... + grad_ss(kz_area, [], SS_VERSE_FRAC, SS_MXG, SS_MXS, ... + SS_TS, SS_EQUAL_LOBES); + + % Calculate maximum spectral sampling frequency + % + lobe = [gpos gneg]; + t_poslobe = length(gpos) * SS_TS; + t_lobe = length(lobe) * SS_TS; + fs_scale = 1; + if strfind(ss_type, 'EP') + fs_max = 2/t_lobe; + if ~strfind(ss_type, 'Opp-Null') + fs_scale = 1/2; % If true null, make sure + end; % aliasing check is for half-frequency + else + fs_max = 1/t_lobe; + end; + + % Estimate sampling frequencies that won't cause + % incompatible aliasing of stopbands/passbands + % + switch ss_type, + case {'Flyback Half', 'EP Half', 'EP Half Opp-Null'}, + sym_flag = 1; + otherwise + sym_flag = 0; + end; + + fdiff = diff(f); + fwidths = sort(fdiff(1:2:end), 2, 'descend'); + fs_min = sum(fwidths(1:2))/2; % Loose estimate on lower bound + df = (fs_max-fs_min)/(SS_NUM_FS_TEST-1); + for idx = 1:SS_NUM_FS_TEST, + fs_test(idx) = fs_min + (idx-1)*df; + % Make sure fs_cur is integer number of samples + % + nsamp = ceil(1/(fs_test(idx)*SS_TS)); + fs_test(idx) = 1/(nsamp*SS_TS); + + % Test aliasing of frequencies into operating BW + % + [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_test(idx)*fs_scale,sym_flag); + if (isempty(f_a)), + fs_ok(idx) = 0; + else + fs_ok(idx) = 1; + end; + end; + if (dbg >= 2) + figure; + plot(fs_test, fs_ok, '*'); + title('Feasible Spectral Sampling Frequencies'); + xlabel('Frequency [Hz]'); + ylabel('Flag (1=OK, 0=No Good)'); + drawnow; + pause(1); + end; + + if (~any(fs_ok == 1)), + fs_over = fs_test(end); + while isempty(f_a) + fs_over = fs_over + df; + [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_over*fs_scale,sym_flag); + end; + + fprintf(1,'ss_design: Incompatible aliasing of frequency spec\n'); + fprintf(1,'at all tested frequencies. \n'); + fprintf(1,'Current max sampling is: %6.1f\n', fs_max); + fprintf(1,'Estimated required sampling is: %6.1f\n', fs_over); + fprintf(1, 'Try any of the following to incr:\n'); + fprintf(1,' - Decrease spatial TBW\n'); + fprintf(1,' - Increase slice thickness\n'); + fprintf(1,' - Increase VERSE fraction\n'); + fprintf(1,' - Decrease frequency band widths\n'); + switch (ss_type), + case {'Flyback Whole', 'Flyback Half'} + fprintf(1,' - Try EPI type SS\n'); + end; + error('No good fs'); + end; + fs_bands_left = find(diff([0 fs_ok]) == 1); + fs_bands_right = find(diff([fs_ok 0]) == -1); + fs_bands = [fs_bands_left; fs_bands_right]; + fs_bands = fs_bands(:)'; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Iterate on lobe width trying to meet B1 requirements + % with minimum-time pulse + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + nsolutions = 0; + + if (SS_NUM_LOBE_ITERS == 1), + fs_top = fs_bands(end); + fs_best = fs_test(fs_top); + + % Call design script for SS that calculates rf, g that meets + % sampling requirements + % + + if strfind(ss_type, 'Flyback') + [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + + if ~isempty(rf), + b1_best = max(abs(rf)); + dur_best = length(rf) * SS_TS; + pow_best = sum(abs(rf).^2) * SS_TS; + nsolutions = 1; + fprintf(1,'Solution(s) exists!\n'); + fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); + else + fprintf(1, 'Fs: %6.1f *** No Soln ***\n', fs_best); + + end; + else + fprintf(1, 'Iterating on spectral sampling frequency to reduce B1\n'); + + % Keep iterating on pulse design until B1 requirement is + % met with highest sampling rate possible + % + dur_best = inf; + b1_best = inf; + nbands = length(fs_bands)/2; + for band = nbands:-1:1, + % Try each band + % + fs_bot = fs_bands(band*2-1); + fs_top = fs_bands(band*2); + d_idx = floor((fs_top - fs_bot + 1)/(SS_NUM_LOBE_ITERS-1)); + d_idx = max(1,d_idx); + niter = ceil((fs_top-fs_bot+1)/d_idx); + for iter = niter:-1:1, + idx = fs_bot + (iter-1)*d_idx; + if iter == niter, + idx = fs_top; + end; + fs = fs_test(idx); + + % Call design script for SS that calculates rf, g that meets + % sampling requirements + % + if strfind(ss_type, 'Flyback') + [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + if isempty(rf), + fprintf(1, 'Band: %d/%d Iter: %d/%d Fs: %6.1f *** No Soln ***\n', ... + nbands-band+1, nbands, niter-iter+1, niter, fs); + continue; + end; + + nsolutions = nsolutions+1; + + rfall{nsolutions} = rf; + gall{nsolutions} = g; + fsall(nsolutions) = fs; + isodelayall(nsolutions) = isodelay; + + b1 = max(abs(rf)); + dur = length(rf) * SS_TS; + pow = sum(abs(rf).^2) * SS_TS; + + infoall{nsolutions} = sprintf('Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms', ... + fs, b1, pow, dur*1e3); + fprintf(1, 'Band: %d/%d Iter: %d/%d %s\n', nbands-band+1, nbands, niter-iter+1, niter, infoall{nsolutions}); + + + if ((b1 <= SS_MAX_B1) && (dur < dur_best)) + b1_best = b1; + dur_best = dur; + + Ibest = nsolutions; + elseif ((b1_best > SS_MAX_B1) && (b1 < b1_best)) + b1_best = b1; + dur_best = dur; + + Ibest = nsolutions; + end + end; + end; + + % Choose desired solution + % + if nsolutions > 0 + fprintf(1, '\n'); + fprintf(1,'Solution(s) exists!\n'); + for n=1:nsolutions + fprintf(1, '%d) %s\n', n, infoall{n}); + end + if nsolutions > 1 + Isolution = input('Which pulse would you like to use? (leave empty for shortest pulse) '); + if isempty(Isolution) || Isolution < 1 || Isolution > nsolutions + Isolution = Ibest; + end + fprintf(1, 'Returning %s\n', infoall{Isolution}); + else + Isolution = 1; + end + rf = rfall{Isolution}; + g = gall{Isolution}; + isodelay = isodelayall(Isolution); + fs_best = fsall(Isolution); + end + + end; + + + + if isempty(rf) + fprintf(1,'No solution found! Trying to increase band ripples to determine limiting\n frequency specifications...\n') + + orig_min_order = SS_MIN_ORDER; + SS_MIN_ORDER = 0; + fs_top = fs_bands(end); + fs_best = fs_test(fs_top); + + d_max = 1*ones(size(d)); + d_min = abs(d); + tol_factor = 4; + + for Id = 1:length(d) + % trying bisection search with increased ripple in each band to + % determine which portion of frequency spec is limiting + d_test = d; + + while (d_max(Id) - d_min(Id)) > abs(d(Id))/tol_factor + d_test(Id) = (d_max(Id) + d_min(Id))/2 * exp(i*angle(d(Id))); + + if strfind(ss_type, 'Flyback') + [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + % update min/max ripple values + if ~isempty(rf), + d_max(Id) = abs(d_test(Id)); + else + d_min(Id) = abs(d_test(Id)); + end; + end + end + + % find ripple values that create solutions + Ifix = find(d_max < 1); + if ~isempty(Ifix) + [tempmin Imin] = min(d_max - abs(d)); + d_fix = d; d_fix(Imin) = d_max(Imin)*exp(i*angle(d(Imin))); + fprintf(1,'Solution found by increasing ripples in bands %s\n', int2str(Ifix)); + fprintf(1,'Returning pulse with increased ripple in band %d (%.1f to %.1f Hz):\n', Imin, f(2*Imin-1), f(2*Imin)); + + if strfind(ss_type, 'Flyback') + [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + else + [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... + ptype, z_ftype, s_ftype, ss_type, ... + f_off, dbg); + end; + + b1_best = max(abs(rf)); + dur_best = length(rf) * SS_TS; + pow_best = sum(abs(rf).^2) * SS_TS; + fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); + + fprintf(1,'\nPulse specs should be modified by reducing bandwidths or increasing ripple in bands %s\n', int2str(Ifix)); + fprintf(1,'Increasing the max pulse duration or slice thickness may also help\n'); + + + else + error('No solution found! Try reducing bandwidths, increasing ripple, increasing max duration, increasing slice thickness...') + end + + + SS_MIN_ORDER = orig_min_order; + end; + + % Test RF + % + fmid = (f(1:2:end) + f(2:2:end))/2; + bw = [-fs_best/2 fs_best/2]; + [f_plot,z_plot,m_plot] = ss_plot(g,rf,SS_TS, ptype,z_thk*2,bw,... + SS_GAMMA, fmid, isodelay); + + + + \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_ep.m b/RF_pulses/spectral_spatial/ss_ep.m new file mode 100644 index 0000000..b52bc49 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_ep.m @@ -0,0 +1,524 @@ +function [rf,g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... + s_ftype, ss_type, f_off, dbg) +% SS_EP - Calculate echo-planar-type SS pulse +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_ep.m,v 1.16 2013/08/15 16:02:33 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + if strfind(ss_type,'Half') + sym_flag = 1; + else + sym_flag = 0; + end; + + [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); + if (isempty(f_a)) + error('Strange: this frequency should be ok'); + end; + if (dbg >= 3) + ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + end; + + % Calculate cycles/cm required + % + kz_max = z_tb / z_thk; % cycles/cm + kz_area = kz_max / SS_GAMMA; % G/cm * s + + % Calculate SS bipolars + % + nsamp = round(2/(fs*SS_TS)); + [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... + SS_MXS, SS_TS, 1); + ng1 = length(g1); + ng2 = length(g2); + ng3 = length(g3); + + % Determine max order that can be supported + % + t_lobe = length(gpos) * SS_TS; + max_lobe = floor(SS_MAX_DURATION / t_lobe); + + % Prepare amplitude description that is consistent + % with other fir design calls + a_dup = zeros(size(f_a)); + a_dup(1:2:end) = a_a; + a_dup(2:2:end) = a_a; + + % Call fir filter design based on spectral factorization + % and convex optimization + % + if SS_MIN_ORDER, + use_max = 0; + else + use_max = 1; + end; + switch (s_ftype) + case 'min' + [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, dbg); + case 'max' + [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, ... + dbg); + s_b = conj(s_b(end:-1:1)); + case 'lin' + if use_max, + % Make sure to use n_odd + % + if bitget(max_lobe,1) == 0, + max_lobe = max_lobe+1; + end; + [s_b,status] = fir_qprog(max_lobe, f_a, a_dup, d_a, dbg); + else + odd_or_even = 0; + [s_b,status] = fir_min_order_qprog(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); + end; + end; + if strcmp(status, 'Solved'); + nlobe = length(s_b); + if dbg >= 2, + ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + + figure; + cplot(s_b); + title(sprintf('Filter Taps - Fs: %6.1f', fs)); + xlabel('Tap'); + ylabel('Amplitude'); + drawnow; + pause(1); + + figure; + nf = 512; + h = fftshift(fft(s_b, nf)); + freqs = fs * [-nf/2:nf/2-1]/nf; + plot(freqs,abs(h)); + title(sprintf('Spectral response - Fs: %6.1f', fs)); + xlabel('Frequency'); + ylabel('Magnitude'); + grid; + drawnow; + pause(1); + end; + + % Get Z RF pulse + % + if (dbg) + fprintf(1,'Getting Z RF pulse\n'); + end; + z_np = length(g2); + z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... + z_d(1), z_d(2)); + + % Correct for non-linear effects with SLR if desired + % + if (SS_SLR_FLAG == 1), + % Calculate excitation profile assuming in small-tip regime + % + oversamp = 4; + nZ = oversamp * z_np; + nZ2 = 2^ceil(log2(nZ)); + Z_b = fftf(z_b, nZ2); % column transform, unit magnitude + + if SS_SPECT_CORRECT_FLAG, + fprintf(1,'Spectral Correction not supported for EP pulses with SLR\n'); + end + if 0 %SS_SPECT_CORRECT_FLAG + % Currently not working + % Interpolate spectral filter on a grid that's equal to + % the number of time samples of the gradient --- do this + % partly before calling b2rf and partly afterwards + % + Nper = length(gpos); + oversamp_slr = 16; % Increasing this helps... + Ntotal = Nper * (length(s_b)); + off = (z_np/2)/Nper; + + % For each Z position: + % - calculate nominal scaling of s_b + % - determine spectral taps through SLR + % + bsf = sin(ang/2) * Z_b; + + + % non-uniform spectral interpolation + % The sampling of the output is different than spec_interp + [s_bi_nu, t_nu] = spec_interp_nonuniform(s_b, oversamp_slr, off,f_a, dbg); + + s_rfm_nu = zeros(length(bsf),length(s_bi_nu)); + % Non-uniform SLR would be good here... + for zidx = 1:nZ2 + if 0 + % small-tip in spectral direction + s_rfm_nu(zidx,:) = ang*Z_b(zidx) * conj(s_bi_nu); % conj? + %s_rfm_nu(zidx,:) = 2*asin(abs(bsf(zidx))) * conj(s_bi_nu); % conj? + % s_rfm_nu(zidx,:) = ang*abs(Z_b(zidx)) * conj(s_bi_nu); + else + % SLR on uniformly spaced samples + [t_nu_sort, I_nu_sort] = sort(t_nu); + t_nu = t_nu_sort; + s_bi_nu = s_bi_nu(I_nu_sort); + for idx = 1:oversamp_slr + s_rfm_nu(zidx,idx:oversamp_slr:end) = ... + b2rf(bsf(zidx) * s_bi_nu(idx:oversamp_slr:end)); + end + + end + end + + % Now calculate new z beta polynomial by inverse FFT + z_bm_nu = fftr(sin(s_rfm_nu/2), z_np, 1); % Each row now scaled by + % tip-angle + + % SLR in Z to get RF + z_rf_nu = zeros(size(z_bm_nu)); + for idx = 1:size(z_bm_nu,2), + z_rf_nu(:,idx) = conj(b2rf(z_bm_nu(:,idx))); + end; + + % Now raster scan for actual sampling positions + z_rfm = []; + + for idx = 1:length(s_b) + for zidx = 1:z_np, + zi_off = (2*zidx - z_np-1) / (z_np-1) * off; + if (rem(idx,2) == 1) + idx_intrp = (idx-1) + zi_off; + else + idx_intrp = (idx-1) - zi_off; + end + tmp_z_rf(zidx) = interp1(t_nu, ... + z_rf_nu(zidx,:), idx_intrp, 'spline'); + end; + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + + + + else % no spectral correction + if (dbg) + fprintf(1,'Doing SLR in F...\n'); + end; + s_rfm = []; + bsf = sin(ang/2) * Z_b; + for idx = 1:nZ2, + tmp_s_rf = b2rf(bsf(idx) * s_b); + s_rfm = [s_rfm tmp_s_rf(:)]; + end; + + % Now calculate new z beta polynomial by inverse FFT, then use + % SLR to get RF + % + z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by + % tip-angle + z_rfm = []; + if (dbg) + fprintf(1,'Doing SLR in Z... \n'); + end; + for idx = 1:size(z_bm,1), + tmp_z_rf = conj(b2rf(z_bm(idx,:))); + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + end; %SS_SPECT_CORRECT_FLAG + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used + % + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + + nlobe = length(s_b); + rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + + % Additional VERSE with B1 restriction, maintaining duration + % + if 1 + % Verse based on largest RF amplitudes at each kz, then use same + % gradient lobe for each + % + z_rfmax = max(abs(z_rfm)); + else + % verse based on largest RF subpulse + [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); + z_rfmax = z_rfm(b1max_idx,:); + end + + z_rfvmax1 = ss_verse(g2, z_rfmax); + [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + + if (isempty(z_rfvmax)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + for idx = 1:nlobe, + if (rem(idx,2) == 1) + z_rfmod = z_rfm(idx,:) .* rfmod; + z_rfvmod = ss_verse(g2v, z_rfmod); + else + z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; + z_rfvmod = ss_verse(g2v(end:-1:1), z_rfmod); + end + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + + % update gradient + gpos = [g1, g2v, g3]; + gneg = [-g1, -g2v(end:-1:1), -g3]; + else + if (dbg) + fprintf(1,'Versing RF... \n'); + end; + for idx = 1:nlobe, + if (rem(idx,2) == 1) + z_rfmod = z_rfm(idx,:) .* rfmod; + else + z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; + end + if SS_VERSE_FRAC == 0, + z_rfvmod = z_rfmod; + else + z_rfvmod = ss_verse(g2, z_rfmod); + end; + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + end; + else % no SLR + % Correct spectral filter for non-uniform sampling + % in spectral dimension + % + Nper = length([gpos]); + Noff = -(ng2-1)/2:((ng2-1)/2); + bsf = sin(ang/2) * ones(size(Noff)); + if SS_SPECT_CORRECT_FLAG, + % s_b = [0; s_b]; % Can pad to keep from blowing up + + s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... + ptype, 'EP', SS_SLR_FLAG, dbg); + s_rfm = conj(s_rfm); + else + s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation + % here -- needed because of + % possible asymmetric frequency + % response + end; + + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used. + % + % NOTE: With an EP trajectory, we have to play the RF + % out in reverse. As as result, we should make sure to + % verse the RF pulse in both directions separately in case + % it is not symmetric. + % + % VERSE'ing in both forward and reverse directions has the effect of + % introducing significant distortions into the other bands, which is + % particularly bad in the stop bands. Not sure if there is a way around + % this, but only VERSEing in one direction and then using a reversed + % pulse seems to reduce this problem. + + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + fpass_mid = 0; + z_bmod_for = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + z_b_rev = z_b(end:-1:1); + z_bmod_rev = z_b_rev(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + % Additional VERSE with B1 restriction, maintaining duration + % account for scaling by the largest possible spectral weightings at + % each spatial sample + b1max_sc = max(abs(s_rfm), [], 1); + + z_bvmod1 = ss_verse(g2, z_bmod_for); + [z_bvmod_for, g2v_for] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + % not sure this is necessary, adds nice symmetry though + z_bvmod1 = ss_verse(g2, z_bmod_rev); + [z_bvmod_rev, g2v_rev] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc(end:-1:1), SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + if (isempty(z_bvmod_for) || isempty(z_bvmod_rev)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + g2v = min(g2v_for, g2v_rev(end:-1:1)); + + z_bvmod_for = ss_verse(g2v, z_bmod_for); + z_bvmod_rev = ss_verse(g2v(end:-1:1), z_bmod_rev); + + z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... + fpass_mid); + z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... + fpass_mid); + z_bv_rev = z_bv_for(end:-1:1); + + + % update gradient + gpos = [g1, g2v, g3]; + gneg = [-g1, -g2v(end:-1:1), -g3]; + else + + + % Do forward RF pulse + % + z_bvmod_for = ss_verse(g2, z_bmod_for); + + % Modulate back to 0 + % + z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + % Do reverse RF pulse + % + z_bvmod_rev = ss_verse(g2, z_bmod_rev); + z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + % More accurate to just reverse RF pulse + % reverse VERSE'ing doesn't work well with asymmetric RF pulses for + % some reason + z_bv_rev = z_bv_for(end:-1:1); + end + + % Build RF matrix + % + nlobe = length(s_b); + z_rfmv = zeros(nlobe, z_np); + for idx = 1:nlobe + if rem(idx,2) == 1 + z_rfmv(idx,:) = s_rfm(idx,:) .* z_bv_for; + else + z_rfmv(idx,:) = s_rfm(idx,end:-1:1) .* z_bv_rev; + end; + end + + end; % SLR + + + % Compile g, RF + % + rf = []; g = []; + for idx = 1:nlobe, + rf_lobe = z_rfmv(idx,:); + rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; + if rem(idx,2) == 1 + g = [g gpos]; + else + g = [g gneg]; + end; + end; + + % Offset RF + % + nrf = length(rf); + rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); + + % Convert amplitude to Gauss + % + rf = rf / (2 * pi * SS_GAMMA * SS_TS); + + % Calculate refocussing lobe + % + switch (ptype) + case{'ex', 'se'} + ; + otherwise + return; + end; + + % Step 1 - get passbands + % + fmid = (f(1:2:end) + f(2:2:end))/2; + idx_pass = find(a > 0); + fpass = fmid(idx_pass); + npass = length(fpass); + + % Step 2 - get spatial sample points + % + nz = 101; + dz = z_thk / (nz-1); + z = [-z_thk/2:dz:z_thk/2]; + + % Step 3 - get spatial profile + % + gzrot = 2 * pi * SS_GAMMA * SS_TS * g; + gfrot = 2 * pi * SS_TS * ones(size(g)); + rrot = 2 * pi * SS_GAMMA * SS_TS * rf; + switch (ptype) + case {'ex'} + mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); + case {'se'} + mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); + otherwise + end; + + % Step 4 - find best fit to phase ramp + % + zpass = z(:) * ones(1,npass); + zpass = zpass(:); + mxy_phs = unwrap(angle(mxy)); + mxy_phs_mid = mxy_phs((nz+1)/2,:); + mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); + mxy_phs = mxy_phs(:); + + p = polyfit(zpass,mxy_phs,1); + slope = p(1); + + % Step 5 - get area of gradient required + % + cyc_per_cm = slope/(2*pi); + m0 = cyc_per_cm / SS_GAMMA; + gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); + + rf = [rf zeros(size(gref))]; + g = [g gref]; + else + % No solution for this frequency + % + rf = []; + g = []; + end; + diff --git a/RF_pulses/spectral_spatial/ss_ep_phs.m b/RF_pulses/spectral_spatial/ss_ep_phs.m new file mode 100644 index 0000000..41bdbf0 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_ep_phs.m @@ -0,0 +1,535 @@ +function [rf,g,isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... + s_ftype, ss_type, f_off, dbg) +% SS_EP - Calculate echo-planar-type SS pulse +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_ep_phs.m,v 1.2 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + if strfind(ss_type,'Half') + sym_flag = 1; + else + sym_flag = 0; + end; + + [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); + if (isempty(f_a)) + error('Strange: this frequency should be ok'); + end; + if (dbg >= 3) + ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + end; + + % Calculate cycles/cm required + % + kz_max = z_tb / z_thk; % cycles/cm + kz_area = kz_max / SS_GAMMA; % G/cm * s + + % Calculate SS bipolars + % + nsamp = round(2/(fs*SS_TS)); + [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... + SS_MXS, SS_TS, 1); + ng1 = length(g1); + ng2 = length(g2); + ng3 = length(g3); + + % Determine max order that can be supported + % + t_lobe = length(gpos) * SS_TS; + max_lobe = floor(SS_MAX_DURATION / t_lobe); + + % Prepare amplitude description that is consistent + % with other fir design calls + a_dup = zeros(size(f_a)); + a_dup(1:2:end) = a_a; + a_dup(2:2:end) = a_a; + + % Call fir filter design based on spectral factorization + % and convex optimization + % + if SS_MIN_ORDER, + use_max = 0; + else + use_max = 1; + end; + switch (s_ftype) + case 'min' + error('Min phase spectral filter not supported for complex band specification'); + case 'max' + error('Max phase spectral filter not supported for complex band specification'); + case 'lin' + if use_max, + % Make sure to use n_odd + % + if bitget(max_lobe,1) == 0, + max_lobe = max_lobe+1; + end; + [s_b,status] = fir_qprog_phs(max_lobe, f_a, a_dup, d_a, [], dbg); + else + odd_or_even = 0; + [s_b,status] = fir_min_order_qprog_phs(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); + end; + end; + if strcmp(status, 'Solved'); + nlobe = length(s_b); + if dbg >= 2, + ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + + figure; + cplot(s_b); + title(sprintf('Filter Taps - Fs: %6.1f', fs)); + xlabel('Tap'); + ylabel('Amplitude'); + drawnow; + pause(1); + + figure; + nf = 512; + h = fftshift(fft(s_b, nf)); + freqs = fs * [-nf/2:nf/2-1]/nf; + plot(freqs,abs(h)); + title(sprintf('Spectral response - Fs: %6.1f', fs)); + xlabel('Frequency'); + ylabel('Magnitude'); + grid; + drawnow; + pause(1); + end; + + % Get Z RF pulse + % + if (dbg) + fprintf(1,'Getting Z RF pulse\n'); + end; + z_np = length(g2); + z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... + z_d(1), z_d(2)); + + % Correct for non-linear effects with SLR if desired + % + if (SS_SLR_FLAG == 1), + % Calculate excitation profile assuming in small-tip regime + % + oversamp = 4; + nZ = oversamp * z_np; + nZ2 = 2^ceil(log2(nZ)); + Z_b = fftf(z_b, nZ2); % column transform, unit magnitude + + if SS_SPECT_CORRECT_FLAG, + fprintf(1,'Spectral Correction not supported for EP pulses with SLR\n'); + end + if 0 %SS_SPECT_CORRECT_FLAG + % Currently not working + % Interpolate spectral filter on a grid that's equal to + % the number of time samples of the gradient --- do this + % partly before calling b2rf and partly afterwards + % + Nper = length(gpos); + oversamp_slr = 16; % Increasing this helps... + Ntotal = Nper * (length(s_b)); + off = (z_np/2)/Nper; + + % For each Z position: + % - calculate nominal scaling of s_b + % - determine spectral taps through SLR + % + bsf = sin(ang/2) * Z_b; + + + % non-uniform spectral interpolation + % The sampling of the output is different than spec_interp + [s_bi_nu, t_nu] = spec_interp_nonuniform(s_b, oversamp_slr, off,f_a, dbg); + + s_rfm_nu = zeros(length(bsf),length(s_bi_nu)); + % Non-uniform SLR would be good here... + for zidx = 1:nZ2 + if 0 + % small-tip in spectral direction + s_rfm_nu(zidx,:) = ang*Z_b(zidx) * conj(s_bi_nu); % conj? + %s_rfm_nu(zidx,:) = 2*asin(abs(bsf(zidx))) * conj(s_bi_nu); % conj? + % s_rfm_nu(zidx,:) = ang*abs(Z_b(zidx)) * conj(s_bi_nu); + else + % SLR on uniformly spaced samples + [t_nu_sort, I_nu_sort] = sort(t_nu); + t_nu = t_nu_sort; + s_bi_nu = s_bi_nu(I_nu_sort); + for idx = 1:oversamp_slr + s_rfm_nu(zidx,idx:oversamp_slr:end) = ... + b2rf(bsf(zidx) * s_bi_nu(idx:oversamp_slr:end)); + end + + end + end + + % Now calculate new z beta polynomial by inverse FFT + z_bm_nu = fftr(sin(s_rfm_nu/2), z_np, 1); % Each row now scaled by + % tip-angle + + % SLR in Z to get RF + z_rf_nu = zeros(size(z_bm_nu)); + for idx = 1:size(z_bm_nu,2), + z_rf_nu(:,idx) = conj(b2rf(z_bm_nu(:,idx))); + end; + + % Now raster scan for actual sampling positions + z_rfm = []; + + for idx = 1:length(s_b) + for zidx = 1:z_np, + zi_off = (2*zidx - z_np-1) / (z_np-1) * off; + if (rem(idx,2) == 1) + idx_intrp = (idx-1) + zi_off; + else + idx_intrp = (idx-1) - zi_off; + end + tmp_z_rf(zidx) = interp1(t_nu, ... + z_rf_nu(zidx,:), idx_intrp, 'spline'); + end; + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + + + + else % no spectral correction + if (dbg) + fprintf(1,'Doing SLR in F...\n'); + end; + s_rfm = []; + bsf = sin(ang/2) * Z_b; + for idx = 1:nZ2, + tmp_s_rf = b2rf(bsf(idx) * s_b); + s_rfm = [s_rfm tmp_s_rf(:)]; + end; + + % Now calculate new z beta polynomial by inverse FFT, then use + % SLR to get RF + % + z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by + % tip-angle + z_rfm = []; + if (dbg) + fprintf(1,'Doing SLR in Z... \n'); + end; + for idx = 1:size(z_bm,1), + tmp_z_rf = conj(b2rf(z_bm(idx,:))); + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + end; %SS_SPECT_CORRECT_FLAG + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used + % + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + + nlobe = length(s_b); + rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + + % Additional VERSE with B1 restriction, maintaining duration + % + if 1 + % Verse based on largest RF amplitudes at each kz, then use same + % gradient lobe for each + % + z_rfmax = max(abs(z_rfm)); + else + % verse based on largest RF subpulse + [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); + z_rfmax = z_rfm(b1max_idx,:); + end + + z_rfvmax1 = ss_verse(g2, z_rfmax); + [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + + if (isempty(z_rfvmax)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + for idx = 1:nlobe, + if (rem(idx,2) == 1) + z_rfmod = z_rfm(idx,:) .* rfmod; + z_rfvmod = ss_verse(g2v, z_rfmod); + else + z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; + z_rfvmod = ss_verse(g2v(end:-1:1), z_rfmod); + end + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + + % update gradient + gpos = [g1, g2v, g3]; + gneg = [-g1, -g2v(end:-1:1), -g3]; + else + if (dbg) + fprintf(1,'Versing RF... \n'); + end; + for idx = 1:nlobe, + if (rem(idx,2) == 1) + z_rfmod = z_rfm(idx,:) .* rfmod; + else + z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; + end + if SS_VERSE_FRAC == 0, + z_rfvmod = z_rfmod; + else + z_rfvmod = ss_verse(g2, z_rfmod); + end; + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + end; + else % no SLR + % Correct spectral filter for non-uniform sampling + % in spectral dimension + % + Nper = length([gpos]); + Noff = -(ng2-1)/2:((ng2-1)/2); + bsf = sin(ang/2) * ones(size(Noff)); + if SS_SPECT_CORRECT_FLAG, + % s_b = [0; s_b]; % Can pad to keep from blowing up + + s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... + ptype, 'EP', SS_SLR_FLAG, dbg); + s_rfm = conj(s_rfm); + else + s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation + % here -- needed because of + % possible asymmetric frequency + % response + end; + + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used. + % + % NOTE: With an EP trajectory, we have to play the RF + % out in reverse. As as result, we should make sure to + % verse the RF pulse in both directions separately in case + % it is not symmetric. + % + % VERSE'ing in both forward and reverse directions has the effect of + % introducing significant distortions into the other bands, which is + % particularly bad in the stop bands. Not sure if there is a way around + % this, but only VERSEing in one direction and then using a reversed + % pulse seems to reduce this problem. + + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + fpass_mid = 0; + z_bmod_for = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + z_b_rev = z_b(end:-1:1); + z_bmod_rev = z_b_rev(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + % Additional VERSE with B1 restriction, maintaining duration + % account for scaling by the largest possible spectral weightings at + % each spatial sample + b1max_sc = max(abs(s_rfm), [], 1); + + z_bvmod1 = ss_verse(g2, z_bmod_for); + [z_bvmod_for, g2v_for] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + % not sure this is necessary, adds nice symmetry though + z_bvmod1 = ss_verse(g2, z_bmod_rev); + [z_bvmod_rev, g2v_rev] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc(end:-1:1), SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + if (isempty(z_bvmod_for) || isempty(z_bvmod_rev)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + g2v = min(g2v_for, g2v_rev(end:-1:1)); + + z_bvmod_for = ss_verse(g2v, z_bmod_for); + z_bvmod_rev = ss_verse(g2v(end:-1:1), z_bmod_rev); + + z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... + fpass_mid); + z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... + fpass_mid); + z_bv_rev = z_bv_for(end:-1:1); + + + % update gradient + gpos = [g1, g2v, g3]; + gneg = [-g1, -g2v(end:-1:1), -g3]; + else + + + % Do forward RF pulse + % + z_bvmod_for = ss_verse(g2, z_bmod_for); + + % Modulate back to 0 + % + z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + % Do reverse RF pulse + % + z_bvmod_rev = ss_verse(g2, z_bmod_rev); + z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + % More accurate to do just reveres RF pulse + % reverse VERSE'ing doesn't work well with asymmetric RF pulses for + % some reason + z_bv_rev = z_bv_for(end:-1:1); + end + + % Build RF matrix + % + nlobe = length(s_b); + z_rfmv = zeros(nlobe, z_np); + for idx = 1:nlobe + if rem(idx,2) == 1 + z_rfmv(idx,:) = s_rfm(idx,:) .* z_bv_for; + else + z_rfmv(idx,:) = s_rfm(idx,end:-1:1) .* z_bv_rev; + end; + end + + end; % SLR + + + % Calculate isodelay --- since we only have linear phase pulses for + % this routine, it's easy... + % + if bitget(nlobe,1) == 1, + isodelay = ((nlobe+1)/2 * length(gpos) + (nlobe-1)/2 * length(gneg)) ... + * SS_TS; + else + isodelay = (nlobe/2 * length(gpos) + nlobe/2 * length(gneg)) ... + * SS_TS; + end + + % Compile g, RF + % + rf = []; g = []; + for idx = 1:nlobe, + rf_lobe = z_rfmv(idx,:); + rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; + if rem(idx,2) == 1 + g = [g gpos]; + else + g = [g gneg]; + end; + end; + + % Offset RF + % + nrf = length(rf); + rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); + + % Convert amplitude to Gauss + % + rf = rf / (2 * pi * SS_GAMMA * SS_TS); + + % Calculate refocussing lobe + % + switch (ptype) + case{'ex', 'se'} + ; + otherwise + return; + end; + + % Step 1 - get passbands + % + fmid = (f(1:2:end) + f(2:2:end))/2; + idx_pass = find(a > 0); + fpass = fmid(idx_pass); + npass = length(fpass); + + % Step 2 - get spatial sample points + % + nz = 101; + dz = z_thk / (nz-1); + z = [-z_thk/2:dz:z_thk/2]; + + % Step 3 - get spatial profile + % + gzrot = 2 * pi * SS_GAMMA * SS_TS * g; + gfrot = 2 * pi * SS_TS * ones(size(g)); + rrot = 2 * pi * SS_GAMMA * SS_TS * rf; + switch (ptype) + case {'ex'} + mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); + case {'se'} + mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); + otherwise + end; + + % Step 4 - find best fit to phase ramp + % + zpass = z(:) * ones(1,npass); + zpass = zpass(:); + mxy_phs = unwrap(angle(mxy)); + mxy_phs_mid = mxy_phs((nz+1)/2,:); + mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); + mxy_phs = mxy_phs(:); + + p = polyfit(zpass,mxy_phs,1); + slope = p(1); + + % Step 5 - get area of gradient required + % + cyc_per_cm = slope/(2*pi); + m0 = cyc_per_cm / SS_GAMMA; + gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); + + rf = [rf zeros(size(gref))]; + g = [g gref]; + isodelay = isodelay + length(gref) * SS_TS; + else + % No solution for this frequency + % + rf = []; + g = []; + isodelay = []; + end; + diff --git a/RF_pulses/spectral_spatial/ss_flyback.m b/RF_pulses/spectral_spatial/ss_flyback.m new file mode 100644 index 0000000..84366e0 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_flyback.m @@ -0,0 +1,507 @@ +function [rf,g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... + s_ftype, ss_type, f_off, dbg) +% SS_FLYBACK - Calculate flyback-type SS pulse +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_flyback.m,v 1.30 2013/08/15 16:02:33 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + if strfind(ss_type,'Half') + sym_flag = 1; + else + sym_flag = 0; + end; + + [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); + if (isempty(f_a)) + error('Strange: this frequency should be ok'); + end; + if (dbg >= 2) + ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + end; + + % Calculate cycles/cm required + % + kz_max = z_tb / z_thk; % cycles/cm + kz_area = kz_max / SS_GAMMA; % G/cm * s + + nsamp = round(1/(fs*SS_TS)); + [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... + SS_MXS, SS_TS, SS_EQUAL_LOBES); + ng1 = length(g1); + ng2 = length(g2); + ng3 = length(g3); + + % Determine max order that can be supported + % + t_poslobe = length(gpos) * SS_TS; + t_lobe = length([gpos gneg]) * SS_TS; + max_lobe = floor((SS_MAX_DURATION - t_poslobe) / t_lobe) + 1; + + % Prepare amplitude description that is consistent + % with other fir design calls + a_dup = zeros(size(f_a)); + a_dup(1:2:end) = a_a; + a_dup(2:2:end) = a_a; + + % Call fir filter design based on spectral factorization + % and convex optimization + % + if SS_MIN_ORDER, + use_max = 0; + else + use_max = 1; + end; + + switch (s_ftype) + case 'min' + [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, dbg); + case 'max' + [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, ... + dbg); + s_b = conj(s_b(end:-1:1)); + case 'lin' + if use_max, + % Make sure to use n_odd + % + if bitget(max_lobe,1) == 0, + max_lobe = max_lobe+1; + end; + [s_b,status] = fir_qprog(max_lobe, f_a, a_dup, d_a, dbg); + else + odd_or_even = 0; + [s_b,status] = fir_min_order_qprog(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); + end; + end; + if strcmp(status, 'Solved'); + nlobe = length(s_b); + if dbg >= 2, + ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + + figure; + cplot(s_b); + title(sprintf('Filter Taps - Fs: %6.1f', fs)); + xlabel('Tap'); + ylabel('Amplitude'); + drawnow; + pause(1); + end; + if dbg >= 1, + figure; + nf = 512; + h = fftf(s_b, nf); + freqs = fs * [-nf/2:nf/2-1]/nf; + plot(freqs,abs(h)); + title(sprintf('Spectral response - Fs: %6.1f', fs)); + xlabel('Frequency'); + ylabel('Magnitude'); + grid; + drawnow; + pause(1); + end; + + % Get Z RF pulse + % + if (dbg) + fprintf(1,'Getting Z RF pulse\n'); + end; + z_np = length(g2); + z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... + z_d(1), z_d(2)); + + % Correct for non-linear effects with SLR if desired + % + if (SS_SLR_FLAG == 1), + % Calculate excitation profile assuming in small-tip regime + % + oversamp = 4; + nZ = oversamp * z_np; + nZ2 = 2^ceil(log2(nZ)); + Z_b = fftf(z_b, nZ2); % column transform, unit magnitude + + if SS_SPECT_CORRECT_FLAG, + % Interpolate spectral filter on a grid that's equal to + % the number of time samples of the gradient --- do this + % partly before calling b2rf and partly afterwards + % + Nper = length([gpos gneg]); + oversamp_slr = 16; + Ntotal = Nper * (length(s_b)); +% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * ... +% (length(s_b))); + off = floor(z_np/2)/Nper; +% Ntotal = Nper * (length(s_b)); +% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * (length(s_b))); + % s_bi = length(s_b)/Ntotal * interpft(s_b,Ntotal); % Scale to keep + % tranform consistent + + % For each Z position: + % - calculate nominal scaling of s_b + % - determine spectral taps through SLR + % + bsf = sin(ang/2) * Z_b; + s_rfm = zeros(length(bsf),length(s_b)*oversamp_slr); + if 1 + s_bi = spec_interp(s_b, oversamp_slr,-off,f_a, dbg); + for idx = 1:nZ2, + for bidx = 1:oversamp_slr, + s_rfm(idx,bidx:oversamp_slr:end) = ... + b2rf(bsf(idx) * s_bi(bidx:oversamp_slr:end)); + end; + end; + else + s_bi = spec_interp2(s_b, oversamp_slr,-off); + for idx = 1:nZ2, + s_rfm(idx,:) = oversamp_slr * b2rf(bsf(idx) * s_bi); + end; + end; + + % Now calculate new z beta polynomial by inverse FFT, then use + % SLR to get RF + % + z_bm = fftr(sin(s_rfm/2), z_np, 1); % Each row now scaled by + % tip-angle + % Now do SLR in Z direction + % + if (dbg) + fprintf(1,'Doing SLR in Z... \n'); + end; + if 1 + z_rf = zeros(size(z_bm)); + for idx = 1:size(z_bm,2), + z_rf(:,idx) = conj(b2rf(z_bm(:,idx))); + end; + + % Now raster scan for actual sampling positions + % + z_rfm = []; + for idx = 1:length(s_b) + for zidx = 1:z_np, + % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); + idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); + tmp_z_rf(zidx) = interp1([1:size(z_rf,2)], z_rf(zidx,:), ... + idx_intrp, 'spline'); + end; + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + else + % Choose time samples corresponding to trajectory + % + z_rfm = []; + for idx = 1:length(s_b), + for zidx = 1:z_np, + % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); + idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); + tmp_z_bm(zidx) = ... + interp1([1:size(z_bm,2)], z_bm(zidx,:), ... + idx_intrp, 'spline'); + end; + tmp_z_rf = conj(b2rf(tmp_z_bm)); + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + end; + else % no spectral correction + if (dbg) + fprintf(1,'Doing SLR in F...\n'); + end; + s_rfm = []; + bsf = sin(ang/2) * Z_b; + for idx = 1:nZ2, + tmp_s_rf = b2rf(bsf(idx) * s_b); + s_rfm = [s_rfm tmp_s_rf(:)]; + end; + + % Now calculate new z beta polynomial by inverse FFT, then use + % SLR to get RF + % + z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by + % tip-angle + z_rfm = []; + if (dbg) + fprintf(1,'Doing SLR in Z... \n'); + end; + for idx = 1:size(z_bm,1), + tmp_z_rf = conj(b2rf(z_bm(idx,:))); + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + end; + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used + % + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + + nlobe = length(s_b); + rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + + % Additional VERSE with B1 restriction, maintaining duration + if 1 + % Verse based on largest RF amplitudes at each kz, then use same + % gradient lobe for each + % + z_rfmax = max(abs(z_rfm)); + else + % Verse largest RF pulse, then use same gradient lobe for + % each + [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); + z_rfmax = z_rfm(b1max_idx,:); + end + + z_rfvmax1 = ss_verse(g2, z_rfmax); + + % z_rfmod = z_rfm(b1max_idx,:) .* rfmod; + %z_rfvmod1 = ss_verse(g2, z_rfmod); + [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + if (isempty(z_rfvmax)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + if 0 + % experimental filtering: + % cutoff at x*125 kHz + b = firls(10, [0 .1 .2 1], [1 1 0 0]); + g2vs = sum(g2v); + g2v = filtfilt(b, 1, g2v); + g2v = g2v * g2vs / sum(g2v); + end + + for idx = 1:nlobe, + z_rfmod = z_rfm(idx,:) .* rfmod; + z_rfvmod = ss_verse(g2v, z_rfmod); + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + + % update gradient + gpos = [g1, g2v, g3]; + if SS_EQUAL_LOBES + gneg = -gpos; + end + else + if (dbg) + fprintf(1,'Versing RF... \n'); + end; + for idx = 1:nlobe, + z_rfmod = z_rfm(idx,:) .* rfmod; + if SS_VERSE_FRAC == 0, + z_rfvmod = z_rfmod; + else + z_rfvmod = ss_verse(g2, z_rfmod); + end; + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + end; + else % no SLR + if SS_SPECT_CORRECT_FLAG, + % Spectral correction needs to be applied to unaliased bands, + % therefore the raw frequency spec needs to be passed through. + % +% s_b = [0; s_b; 0]; % play with adding extra taps to make + % spectral correction easier + Nper = length([gpos gneg]); + st_off = -floor(ng2/2); + Noff = [st_off:st_off+ng2-1]; + bsf = sin(ang/2) * ones(size(Noff)); % This needs to be + % updated + if (dbg) + fprintf(1,'No SLR.. spectral correction...\n'); + end; +% s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... +% ptype, 'Flyback', SS_SLR_FLAG, dbg); + s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, f, ... + ptype, 'Flyback', SS_SLR_FLAG, dbg); + else + s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation + % here -- needed because of + % possible asymmetric frequency + % response + end + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used + % + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + z_bmod = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + % Additional VERSE with B1 restriction, maintaining duration + % account for scaling by the largest possible spectral weightings at + % each spatial sample + b1max_sc = max(abs(s_rfm)); + + z_bvmod1 = ss_verse(g2, z_bmod); + [z_bvmod, g2v] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + if (isempty(z_bvmod)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + if 0 + % experimental filtering: + % cutoff at x*125 kHz + b = firls(10, [0 .1 .2 1], [1 1 0 0]); + g2vs = sum(g2v); + g2v = filtfilt(b, 1, g2v); + g2v = g2v * g2vs / sum(g2v); + + z_bvmod = ss_verse(g2v, z_bmod); + end + + % update gradient + gpos = [g1, g2v, g3]; + if SS_EQUAL_LOBES + gneg = -gpos; + end + else + if (dbg) + fprintf(1,'Versing RF... \n'); + end; + if SS_VERSE_FRAC == 0, + z_bvmod = z_bmod; + else + z_bvmod = ss_verse(g2, z_bmod); + end; + end; + + % Modulate back + % + z_bv = z_bvmod(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... + fpass_mid); + + % Build RF matrix + % + nlobe = length(s_b); + z_rfmv = s_rfm .* (ones(nlobe,1) * z_bv); + end; + + % Compile g, RF + % + rf = []; g = []; + nneg = length(gneg); + for idx = 1:nlobe, + rf_lobe = z_rfmv(idx,:); + rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; + if idx < nlobe, + rf = [rf zeros(1,nneg)]; + g = [g gpos gneg]; + else + g = [g gpos]; + end; + end; + + % Offset RF + % + nrf = length(rf); + rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); + + % Convert amplitude to Gauss + % + rf = rf / (2 * pi * SS_GAMMA * SS_TS); + + % Calculate refocussing lobe + % + switch (ptype) + case{'ex', 'se'} + ; + otherwise + return; + end; + + % Step 1 - get passbands + % + fmid = (f(1:2:end) + f(2:2:end))/2; + idx_pass = find(a > 0); + fpass = fmid(idx_pass); + npass = length(fpass); + + % Step 2 - get spatial sample points + % + nz = 101; + dz = z_thk / (nz-1); + z = [-z_thk/2:dz:z_thk/2]; + + % Step 3 - get spatial profile + % + gzrot = 2 * pi * SS_GAMMA * SS_TS * g; + gfrot = 2 * pi * SS_TS * ones(size(g)); + rrot = 2 * pi * SS_GAMMA * SS_TS * rf; + switch (ptype) + case {'ex'} + mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); + case {'se'} + mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); + otherwise + end; + + % Step 4 - find best fit to phase ramp + % + zpass = z(:) * ones(1,npass); + zpass = zpass(:); + mxy_phs = unwrap(angle(mxy)); + mxy_phs_mid = mxy_phs((nz+1)/2,:); + mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); + mxy_phs = mxy_phs(:); + + p = polyfit(zpass,mxy_phs,1); + slope = p(1); + + % Step 5 - get area of gradient required + % + cyc_per_cm = slope/(2*pi); + m0 = cyc_per_cm / SS_GAMMA; + gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); + + rf = [rf zeros(size(gref))]; + g = [g gref]; + else + % No solution for this frequency + % + rf = []; + g = []; + end; + diff --git a/RF_pulses/spectral_spatial/ss_flyback_phs.m b/RF_pulses/spectral_spatial/ss_flyback_phs.m new file mode 100644 index 0000000..b78b972 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_flyback_phs.m @@ -0,0 +1,536 @@ +function [rf,g,isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... + s_ftype, ss_type, f_off, dbg) +% SS_FLYBACK - Calculate flyback-type SS pulse +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_flyback_phs.m,v 1.4 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + if strfind(ss_type,'Half') + sym_flag = 1; + else + sym_flag = 0; + end; + + % Check specification + % + [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); + if (isempty(f_a)) + error('Strange: this frequency should be ok'); + end; + if (dbg >= 2) + ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + end; + + % Calculate cycles/cm required + % + kz_max = z_tb / z_thk; % cycles/cm + kz_area = kz_max / SS_GAMMA; % G/cm * s + + nsamp = round(1/(fs*SS_TS)); + [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... + SS_MXS, SS_TS, SS_EQUAL_LOBES); + ng1 = length(g1); + ng2 = length(g2); + ng3 = length(g3); + + % Determine max order that can be supported + % + t_poslobe = length(gpos) * SS_TS; + t_lobe = length([gpos gneg]) * SS_TS; + max_lobe = floor((SS_MAX_DURATION - t_poslobe) / t_lobe) + 1; + + % Prepare amplitude description that is consistent + % with other fir design calls + a_dup = zeros(size(f_a)); + a_dup(1:2:end) = a_a; + a_dup(2:2:end) = a_a; + + % Call fir filter design based on spectral factorization + % and convex optimization + % + if SS_MIN_ORDER, + use_max = 0; + else + use_max = 1; + end; + + switch (s_ftype) + case 'min' + % [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, + % use_max, dbg); + error('min phase spectral filter not supported for complex band specification'); + case 'max' + % [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, ... + % dbg); + % s_b = conj(s_b(end:-1:1)); + error('max phase spectral filter not supported for complex band specification'); + case 'lin' + if use_max, + % Make sure to use n_odd - WHY? + % + %if bitget(max_lobe,1) == 0, + % max_lobe = max_lobe+1; + % end; + [s_b,status] = fir_qprog_phs(max_lobe, f_a, a_dup, d_a, [], dbg); + else + odd_or_even = 0; + [s_b,status] = fir_min_order_qprog_phs(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); + end + case 'min_power' + if use_max, + % Make sure to use n_odd -- WHY? + % + % if bitget(max_lobe,1) == 0, + % max_lobe = max_lobe+1; + % end; + + % Iterate over attempting different phase profiles for spectral + % filter, choosing the one that minimizes the peak power + % + [s_b, a_dup_best, status] = fir_min_power_phs(max_lobe, f_a, a_dup, d_a, [], dbg); + else + error('Don''t handle case of minimum order, minimum peak power'); + end + a_a = a_dup_best(1:2:end); + end + if strcmp(status, 'Solved'); + nlobe = length(s_b); + if dbg >= 2, + ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); + + figure; + cplot(s_b); + title(sprintf('Filter Taps - Fs: %6.1f', fs)); + xlabel('Tap'); + ylabel('Amplitude'); + drawnow; + pause(1); + end; + if dbg >= 1, + figure; + nf = 512; + h = fftf(s_b, nf); + freqs = fs * [-nf/2:nf/2-1]/nf; + plot(freqs,abs(h)); + title(sprintf('Spectral response - Fs: %6.1f', fs)); + xlabel('Frequency'); + ylabel('Magnitude'); + grid; + drawnow; + pause(1); + end; + + % Get Z RF pulse + % + if (dbg) + fprintf(1,'Getting Z RF pulse\n'); + end; + z_np = length(g2); + z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... + z_d(1), z_d(2)); + + % Correct for non-linear effects with SLR if desired + % + if (SS_SLR_FLAG == 1), + % Calculate excitation profile assuming in small-tip regime + % + oversamp = 4; + nZ = oversamp * z_np; + nZ2 = 2^ceil(log2(nZ)); + Z_b = fftf(z_b, nZ2); % column transform, unit magnitude + + if SS_SPECT_CORRECT_FLAG, + % Interpolate spectral filter on a grid that's equal to + % the number of time samples of the gradient --- do this + % partly before calling b2rf and partly afterwards + % + Nper = length([gpos gneg]); + oversamp_slr = 16; + Ntotal = Nper * (length(s_b)); +% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * ... +% (length(s_b))); + off = floor(z_np/2)/Nper; +% Ntotal = Nper * (length(s_b)); +% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * (length(s_b))); + % s_bi = length(s_b)/Ntotal * interpft(s_b,Ntotal); % Scale to keep + % tranform consistent + + % For each Z position: + % - calculate nominal scaling of s_b + % - determine spectral taps through SLR + % + bsf = sin(ang/2) * Z_b; + s_rfm = zeros(length(bsf),length(s_b)*oversamp_slr); + if 1 + s_bi = spec_interp(s_b, oversamp_slr,-off,f_a, dbg); + for idx = 1:nZ2, + for bidx = 1:oversamp_slr, + s_rfm(idx,bidx:oversamp_slr:end) = ... + b2rf(bsf(idx) * s_bi(bidx:oversamp_slr:end)); + end; + end; + else + s_bi = spec_interp2(s_b, oversamp_slr,-off); + for idx = 1:nZ2, + s_rfm(idx,:) = oversamp_slr * b2rf(bsf(idx) * s_bi); + end; + end; + + % Now calculate new z beta polynomial by inverse FFT, then use + % SLR to get RF + % + z_bm = fftr(sin(s_rfm/2), z_np, 1); % Each row now scaled by + % tip-angle + % Now do SLR in Z direction + % + if (dbg) + fprintf(1,'Doing SLR in Z... \n'); + end; + if 1 + z_rf = zeros(size(z_bm)); + for idx = 1:size(z_bm,2), + z_rf(:,idx) = conj(b2rf(z_bm(:,idx))); + end; + + % Now raster scan for actual sampling positions + % + z_rfm = []; + for idx = 1:length(s_b) + for zidx = 1:z_np, + % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); + idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); + tmp_z_rf(zidx) = interp1([1:size(z_rf,2)], z_rf(zidx,:), ... + idx_intrp, 'spline'); + end; + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + else + % Choose time samples corresponding to trajectory + % + z_rfm = []; + for idx = 1:length(s_b), + for zidx = 1:z_np, + % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); + idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); + tmp_z_bm(zidx) = ... + interp1([1:size(z_bm,2)], z_bm(zidx,:), ... + idx_intrp, 'spline'); + end; + tmp_z_rf = conj(b2rf(tmp_z_bm)); + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + end; + else % no spectral correction + if (dbg) + fprintf(1,'Doing SLR in F...\n'); + end; + s_rfm = []; + bsf = sin(ang/2) * Z_b; + for idx = 1:nZ2, + tmp_s_rf = b2rf(bsf(idx) * s_b); + s_rfm = [s_rfm tmp_s_rf(:)]; + end; + + % Now calculate new z beta polynomial by inverse FFT, then use + % SLR to get RF + % + z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by + % tip-angle + z_rfm = []; + if (dbg) + fprintf(1,'Doing SLR in Z... \n'); + end; + for idx = 1:size(z_bm,1), + tmp_z_rf = conj(b2rf(z_bm(idx,:))); + z_rfm = [z_rfm; tmp_z_rf(:).']; + end; + end; + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used + % + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + + nlobe = length(s_b); + rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + + % Additional VERSE with B1 restriction, maintaining duration + if 1 + % Verse based on largest RF amplitudes at each kz, then use same + % gradient lobe for each + % + z_rfmax = max(abs(z_rfm)); + else + % Verse largest RF pulse, then use same gradient lobe for + % each + [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); + z_rfmax = z_rfm(b1max_idx,:); + end + + z_rfvmax1 = ss_verse(g2, z_rfmax); + + % z_rfmod = z_rfm(b1max_idx,:) .* rfmod; + %z_rfvmod1 = ss_verse(g2, z_rfmod); + [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + if (isempty(z_rfvmax)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + if 0 + % experimental filtering: + % cutoff at x*125 kHz + b = firls(10, [0 .1 .2 1], [1 1 0 0]); + g2vs = sum(g2v); + g2v = filtfilt(b, 1, g2v); + g2v = g2v * g2vs / sum(g2v); + end + + for idx = 1:nlobe, + z_rfmod = z_rfm(idx,:) .* rfmod; + z_rfvmod = ss_verse(g2v, z_rfmod); + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + + % update gradient + gpos = [g1, g2v, g3]; + if SS_EQUAL_LOBES + gneg = -gpos; + end + else + if (dbg) + fprintf(1,'Versing RF... \n'); + end; + for idx = 1:nlobe, + z_rfmod = z_rfm(idx,:) .* rfmod; + if SS_VERSE_FRAC == 0, + z_rfvmod = z_rfmod; + else + z_rfvmod = ss_verse(g2, z_rfmod); + end; + z_rfv = z_rfvmod(:).' .* conj(rfmod); + z_rfmv(idx,:) = z_rfv; + end; + end; + else % no SLR + if SS_SPECT_CORRECT_FLAG, + % Spectral correction needs to be applied to unaliased bands, + % therefore the raw frequency spec needs to be passed through. + % +% s_b = [0; s_b; 0]; % play with adding extra taps to make + % spectral correction easier + Nper = length([gpos gneg]); + st_off = -floor(ng2/2); + Noff = [st_off:st_off+ng2-1]; + bsf = sin(ang/2) * ones(size(Noff)); % This needs to be + % updated + if (dbg) + fprintf(1,'No SLR.. spectral correction...\n'); + end; +% s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... +% ptype, 'Flyback', SS_SLR_FLAG, dbg); + s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, f, ... + ptype, 'Flyback', SS_SLR_FLAG, dbg); + else + s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation + % here -- needed because of + % possible asymmetric frequency + % response + end + + % Modulate rf to passband frequency BEFORE versing, then + % modulate back. This will make sure that the slice profile + % shows no blurring at the passband. In the case that + % multiple passbands are defined, then the midpoint of + % the first passband is used + % + pass_idx = find(a > 0, 1, 'first'); + fpass = [f(pass_idx*2-1) f(pass_idx*2)]; + fpass_mid = mean(fpass) - f_off; + z_bmod = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); + + if SS_VERSE_B1 + if (dbg) + fprintf(1,'Versing RF with B1 minimization... \n'); + end; + % Additional VERSE with B1 restriction, maintaining duration + % account for scaling by the largest possible spectral weightings at + % each spatial sample + b1max_sc = max(abs(s_rfm)); + + z_bvmod1 = ss_verse(g2, z_bmod); + [z_bvmod, g2v] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... + SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); + + if (isempty(z_bvmod)) + % B1 condition cannot be met + rf = []; + g = []; + return; + end + + if 0 + % experimental filtering: + % cutoff at x*125 kHz + b = firls(10, [0 .1 .2 1], [1 1 0 0]); + g2vs = sum(g2v); + g2v = filtfilt(b, 1, g2v); + g2v = g2v * g2vs / sum(g2v); + + z_bvmod = ss_verse(g2v, z_bmod); + end + + % update gradient + gpos = [g1, g2v, g3]; + if SS_EQUAL_LOBES + gneg = -gpos; + end + else + if (dbg) + fprintf(1,'Versing RF... \n'); + end; + if SS_VERSE_FRAC == 0, + z_bvmod = z_bmod; + else + z_bvmod = ss_verse(g2, z_bmod); + end; + end; + + % Modulate back + % + z_bv = z_bvmod(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... + fpass_mid); + + % Build RF matrix + % + nlobe = length(s_b); + z_rfmv = s_rfm .* (ones(nlobe,1) * z_bv); + end; + + % Calculate isodelay --- since we only have linear phase pulses for + % this routine, it's easy... + % + isodelay = ((nlobe/2) * length(gpos) + (nlobe-1)/2*length(gneg)) ... + * SS_TS; + + % Compile g, RF + % + rf = []; g = []; + nneg = length(gneg); + for idx = 1:nlobe, + rf_lobe = z_rfmv(idx,:); + rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; + if idx < nlobe, + rf = [rf zeros(1,nneg)]; + g = [g gpos gneg]; + else + g = [g gpos]; + end; + end; + + % Offset RF + % + nrf = length(rf); + rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); + + % Convert amplitude to Gauss + % + rf = rf / (2 * pi * SS_GAMMA * SS_TS); + + % Calculate refocussing lobe + % + switch (ptype) + case{'ex', 'se'} + ; + otherwise + return; + end; + + % Step 1 - get passbands + % + fmid = (f(1:2:end) + f(2:2:end))/2; + idx_pass = find(a > 0); + fpass = fmid(idx_pass); + npass = length(fpass); + + % Step 2 - get spatial sample points + % + nz = 101; + dz = z_thk / (nz-1); + z = [-z_thk/2:dz:z_thk/2]; + + % Step 3 - get spatial profile + % + gzrot = 2 * pi * SS_GAMMA * SS_TS * g; + gfrot = 2 * pi * SS_TS * ones(size(g)); + rrot = 2 * pi * SS_GAMMA * SS_TS * rf; + switch (ptype) + case {'ex'} + mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); + case {'se'} + mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); + otherwise + end; + + % Step 4 - find best fit to phase ramp + % + zpass = z(:) * ones(1,npass); + zpass = zpass(:); + mxy_phs = unwrap(angle(mxy)); + mxy_phs_mid = mxy_phs((nz+1)/2,:); + mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); + mxy_phs = mxy_phs(:); + + p = polyfit(zpass,mxy_phs,1); + slope = p(1); + + % Step 5 - get area of gradient required + % + cyc_per_cm = slope/(2*pi); + m0 = cyc_per_cm / SS_GAMMA; + gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); + + rf = [rf zeros(size(gref))]; + g = [g gref]; + isodelay = isodelay + length(gref) * SS_TS; + else + % No solution for this frequency + % + rf = []; + g = []; + isodelay = []; + end; + diff --git a/RF_pulses/spectral_spatial/ss_globals.m b/RF_pulses/spectral_spatial/ss_globals.m new file mode 100644 index 0000000..af4f309 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_globals.m @@ -0,0 +1,114 @@ +% +% +% SS_GLOBALS +% +% Common global definitions for SS package +% +% Parameters +% NAME DESCRIPTION DEFAULT +% ---------- ------------------------------------------------------- --------- +% 'Nucleus' Nuclei of interest, possible values include 'Hydrogen' +% 'Hydrogen', 'Lithium', 'Carbon', 'Sodium', 'Phosphorous' +% 'Max Grad' Maximum Gradient Strength (G/cm) 5 +% 'Max Slew' Maximum Slew Rate (G/cm/ms) 20 +% 'Sample Time' Sampling Time (s) 4e-6 +% 'Max B1' Maximum B1 amplitude (G) 0.2 +% 'Max Duration' Maximum Pulse Duration (s) 20e-3 +% 'Num Lobe Iters' Spectral Sampling Frequency Iterations 10 +% 'Equal Lobes' Force Equal positive and negative gradient lobes 0 +% 'Verse Fraction' Fraction of ramps to use with VERSE 0.8 +% 'Num Fs Test' Spectral aliasing frequencys to test 100 +% 'Spect Correct' Spectral Correction with actual sampling 0 +% 'SLR' Shinnar-Le Roux Correction for large tip pulses 0 +% 'Min Order' Find minimum order FIR filter 1 +% 'B1 Verse' Apply B1-VERSE'ing for reduced peak power 0 +% 'Slew Penalty' In B1-VERSE, use slew-rate penalty to reduce delay sensitivity 0 +% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_globals.m,v 1.14 2014/05/22 20:43:59 peder Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% Gamma definitions -- all in Hz/G +% +SS_GAMMA_HYDROGEN = 4257.6; +SS_GAMMA_LITHIUM = 1654.6; +SS_GAMMA_CARBON = 1070.5; +SS_GAMMA_SODIUM = 1126.2; +SS_GAMMA_PHOSPHOROUS = 1723.5; + +% Declare globals +% +global SS_INIT_DONE; + +% Nucleus info +% +global SS_NUCLEUS SS_GAMMA; + +% Gradient/timing parameters +% +global SS_MXG SS_MXS SS_TS; + +% RF parameters +% +global SS_MAX_B1 SS_MAX_DURATION; + +% Design tolerances, parameters +% +global SS_NUM_LOBE_ITERS SS_EQUAL_LOBES SS_VERSE_FRAC SS_NUM_FS_TEST; +global SS_SPECT_CORRECT_FLAG SS_SLR_FLAG; +global SS_VERSE_B1 SS_SLEW_PENALTY SS_MIN_ORDER; + +% Define globals if not already defined +% +if isempty(SS_INIT_DONE), + % Indicate init has been done + % + SS_INIT_DONE = 1; + + % Nucleus info + % + SS_NUCLEUS = 'Hydrogen'; + SS_GAMMA = SS_GAMMA_HYDROGEN; + + % Gradient/timing parameters + % + SS_MXG = 5.0; % G/cm + SS_MXS = 20; % G/cm/ms + SS_TS = 4e-6; % Sampling time (s) + + % RF parameters + % + SS_MAX_B1 = 0.2; % Gauss + SS_MAX_DURATION = 20e-3; % Max allowed duration + + + % Design tolerances, parameters + % + SS_NUM_LOBE_ITERS = 10; + SS_EQUAL_LOBES = 0; + SS_VERSE_FRAC = 0.8; + SS_NUM_FS_TEST = 100; + SS_SPECT_CORRECT_FLAG = 0; + SS_SLR_FLAG = 0; + SS_MIN_ORDER = 1; + SS_VERSE_B1 = 0; + SS_SLEW_PENALTY = 0; +end; diff --git a/RF_pulses/spectral_spatial/ss_opt.m b/RF_pulses/spectral_spatial/ss_opt.m new file mode 100644 index 0000000..3c8a07b --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_opt.m @@ -0,0 +1,186 @@ +function options = ss_opt(new_options) +% SS_OPT - Set options for spectral-spatial design +% +% function options = ss_opt(new_options) +% +% options - cell array of current options +% new_options - cell array of new options to set +% +% Pass new_options as [] to reset options +% +% See help ss_globals for options + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_opt.m,v 1.14 2013/08/15 14:41:09 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ss_globals; + + if (nargin < 1) + error('Usage: options = ss_opt(new_options)'); + end; + + if isempty(new_options) + SS_INIT_DONE = []; + ss_globals; + end; + + new_options = new_options.'; + new_options = new_options(:); + if (mod(length(new_options), 2) == 1), + error('Input parameter (new_options) must be of even length'); + end; + + nopt = length(new_options)/2; + for idx = 1:nopt, + opt = new_options{idx*2-1}; + optparm = new_options{idx*2}; + switch opt, + + case 'Nucleus' % Set nucleus and gamma + switch optparm, + case 'Hydrogen' + SS_NUCLEUS = optparm; + SS_GAMMA = SS_GAMMA_HYDROGEN; + case 'Lithium' + SS_NUCLEUS = optparm;; + SS_GAMMA = SS_GAMMA_LITHIUM; + case 'Carbon' + SS_NUCLEUS = optparm; + SS_GAMMA = SS_GAMMA_CARBON; + case 'Sodium' + SS_NUCLEUS = optparm; + SS_GAMMA = SS_GAMMA_SODIUM; + case 'Phosphorous' + SS_NUCLEUS = optparm; + SS_GAMMA = SS_GAMMA_PHOSPHOROUS; + otherwise + error(sprintf('Nucleus: %s not recognized', optparm)); + end; + + case 'Max Grad', + SS_MXG = optparm; + + case 'Max Slew', + SS_MXS = optparm; + + case 'Max B1', + SS_MAX_B1 = optparm; + + case 'Max Duration', + SS_MAX_DURATION = optparm; + + case 'Num Lobe Iters', + SS_NUM_LOBE_ITERS = optparm; + + case 'Equal Lobes', + SS_EQUAL_LOBES = optparm; + + case 'Verse Fraction', + SS_VERSE_FRAC = optparm; + + case 'Num Fs Test', + SS_NUM_FS_TEST = optparm; + + case 'Spect Correct', + SS_SPECT_CORRECT_FLAG = optparm; + + case 'SLR', + SS_SLR_FLAG = optparm; + + case 'Min Order', + SS_MIN_ORDER = optparm; + + case 'B1 Verse', + SS_VERSE_B1 = optparm; + + case 'Slew Penalty', + SS_SLEW_PENALTY = optparm; + + otherwise + SS_INIT_DONE = []; + ss_globals; + error(sprintf('Option: %s not recognized',opt)); + end; + end; + + % Fill in options to pass back + % + idx = 1; + + options{idx, 1} = 'Nucleus'; + options{idx, 2} = SS_NUCLEUS; + idx = idx+1; + + options{idx, 1} = 'Max Grad'; + options{idx, 2} = SS_MXG; + idx = idx+1; + + options{idx, 1} = 'Max Slew'; + options{idx, 2} = SS_MXS; + idx = idx+1; + + options{idx, 1} = 'Sample Time'; + options{idx, 2} = SS_TS; + idx = idx+1; + + options{idx, 1} = 'Max B1'; + options{idx, 2} = SS_MAX_B1; + idx = idx+1; + + options{idx, 1} = 'Max Duration'; + options{idx, 2} = SS_MAX_DURATION; + idx = idx+1; + + options{idx, 1} = 'Num Lobe Iters'; + options{idx, 2} = SS_NUM_LOBE_ITERS; + idx = idx+1; + + options{idx, 1} = 'Equal Lobes'; + options{idx, 2} = SS_EQUAL_LOBES; + idx = idx+1; + + options{idx, 1} = 'Verse Fraction'; + options{idx, 2} = SS_VERSE_FRAC; + idx = idx+1; + + options{idx, 1} = 'Num Fs Test'; + options{idx, 2} = SS_NUM_FS_TEST; + idx = idx+1; + + options{idx, 1} = 'Spect Correct'; + options{idx, 2} = SS_SPECT_CORRECT_FLAG; + idx = idx+1; + + options{idx, 1} = 'SLR'; + options{idx, 2} = SS_SLR_FLAG; + idx = idx+1; + + options{idx, 1} = 'Min Order'; + options{idx, 2} = SS_MIN_ORDER; + idx = idx+1; + + options{idx, 1} = 'B1 Verse'; + options{idx, 2} = SS_VERSE_B1; + idx = idx+1; + + options{idx, 1} = 'Slew Penalty'; + options{idx, 2} = SS_SLEW_PENALTY; + idx = idx+1; + + diff --git a/RF_pulses/spectral_spatial/ss_plot.m b/RF_pulses/spectral_spatial/ss_plot.m new file mode 100644 index 0000000..29a0e65 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_plot.m @@ -0,0 +1,267 @@ +function [f,z,m] = ss_plot(g, rf, samp, ptype, fov, bw, gamma, fplot, isodelay) +% SS_PLOT - Plot performance of spectral-spatial +% +% function [f,z,m] = ss_plot(g, rf, samp, [ptype], [fov], [bw], [gamma], +% [fplot], [isodelay]) +% +% INPUTS +% g - gradient in G/cm +% rf - RF in G +% samp - sample period in s +% [ptype] - pulse type: 'ex', 'se', 'sat', 'inv' +% [fov] - Spatial fov in cm to plot +% [bw] - Spectral bw in Hz to plot +% [gamma] - Gamma to be used, Default:4257 +% [fplot] - frequencies to plot spatial profiles +% [isodelay] - Unwind spectral phase shift for given isodelay - default: 0 +% +% OUTPUTS +% f - frequency points plotted (Hz) +% z - spatial points plotted (cm) +% m - simulated magnetization +% +% If optional parameters [] are set to empty matrices, +% it attempts to estimate reasonable values +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + % Some defines + % + NPLOT = 100; % Number plot points + + if nargin < 3, + error(['Usage: ss_plot(g, rf, samp, [ptype], [fov], [bw], [gamma],' ... + ' [fp], [fs])']); + end; + + if ~isreal(g), + error('Only works with 1-D gradient'); + end; + + if length(g) ~= length(rf), + error('RF and gradient must be same length'); + end; + g = g(:); + rf = rf(:); + + % Check ptype + if ( (nargin < 4) || isempty(ptype) ), + ptype = 'ex'; + else + switch ptype, + case {'ex', 'se', 'sat', 'inv'} + otherwise + error(sprintf(['SS_PLOT: pulse type (ptype) of: %s not' ... + ' recognized'], ptype)); + end; + end + + if ( (nargin < 5) || isempty(fov)) + fov = 4.0; + end + + if ( (nargin < 6) || isempty(bw) ), + % Take Fourier transform of gradient and find peak + % component + g_fft = fft(g); + res = length(g); + res_d2 = fix(res/2); + [mxval, idx] = max(abs(g_fft(1:res_d2))); + freq_peak = 1/samp * idx/length(g); + + % Plot will be from -bw/2:bw/2 + % + bwidth = round(4 * freq_peak / 100) * 100; + bw = [-bwidth/2 bwidth/2]; + elseif length(bw) == 1 + bw = [-bw/2 bw/2]; + end + + if ( (nargin < 5) || isempty(fov) ), + % Estimate FOV to plot from k-space swing + % + kz = cumsum(gamma * g * samp); + kz_peak = (max(kz) - min(kz))/2; + fov = ceil(16 / kz_peak); + end; + + if ( (nargin < 7) || isempty(gamma) ), + gamma = 4257; + end; + + if ( (nargin < 9) || isempty(isodelay) ), + isodelay = 0; + end; + + + + + % Get x and y vectors for abr + % + dbw = diff(bw) / (NPLOT-1); + f = [bw(1):dbw:bw(2)]; + + dfov = fov / (NPLOT-1); + z = [-fov/2:dfov:fov/2]; + + % Convert RF to a rotation in radians + % + rf_rot = 2 * pi * gamma * rf(:) * samp; + + % Build gradient that gives rotation + % in radians when scaled by "f" (off-resonance in Hz) + % + gf_rot = 2 * pi * samp * ones(size(g(:))); + + % Convert gradient to a rotation in radians + % when scaled by "z" + % + gz_rot = 2 * pi * gamma * g(:) * samp; + + % Add single samples at end of all waveforms to account for isodelay correction + % + rf_rot = [rf_rot;0]; + gf_rot = [gf_rot;(-2 * pi * isodelay)]; + gz_rot = [gz_rot;0]; + + % Get Mxy now + % + m = calc_mag(rf_rot, gz_rot+i*gf_rot, z, f, ptype); + + % Make plots now + % + figure; + + % RF + % + t = [0:length(g)-1] * samp * 1e3; + subplot(411); + plot(t,abs(rf), 'r-'); + hold on; + plot(t,real(rf),'b--'); + hold on; + plot(t,imag(rf), 'g--'); + title('RF Envelope - I/Q'); + ylabel('(Gauss)'); + xlabel('Time [ms]'); + + % Gradient + % + subplot(412); + plot(t,g,'b-'); + title('Excitation Gradient'); + ylabel('[G/cm]'); + xlabel('Time [ms]'); + + switch ptype + case {'ex', 'se'} + % abs(Mxy) + % + subplot(4,3,7); + imagesc(f,z,abs(m)); + colormap(gray) + xlabel('Frequency [Hz]'); + ylabel('Position [cm]'); + title('Magnitude M_{xy}') + + % Angle(Mxy) + % + subplot(4,3,8); + imagesc(f,z,angle(m)); + xlabel('Frequency [Hz]'); + ylabel('Position [cm]'); + title('Phase M_{xy}'); + case {'inv', 'sat'} + % Mz + subplot(4,3,[7,8]); + imagesc(f,z,m); + colormap(gray) + xlabel('Frequency [Hz]'); + ylabel('Position [cm]'); + title('M_{z}') + end + + % Spectral plot at z = 0 + % + subplot(4,3,9); + dbw_fine = diff(bw)/499; + f_fine = [bw(1):dbw_fine:bw(2)]; + m_center = calc_mag(rf_rot,gz_rot+i*gf_rot, 0, f_fine,ptype); + plot_mag(f_fine, m_center, ptype); + xlabel('Frequency [Hz]'); + title(sprintf('Spectral Profile - Z = 0')); + + + % Passband/Stopband plots + % + if (nargin < 8) || isempty(f), + % Sort frequency from 0 out + [tmp idx] = sort(abs(f)); + fsort = f(idx); + + % Get spectral profile + m_z0 = calc_mag(rf_rot,gz_rot+i*gf_rot, 0, fsort,ptype); + + % Find maximum closest to 0 frequency + [mval idx] = max(abs(m_z0)); + fplot = fsort(idx); + end; + + nplot = length(fplot); + for idx = 1:nplot, + subplot(4,nplot,3*nplot + idx); + m_f = calc_mag(rf_rot,gz_rot+i*gf_rot, z, fplot(idx),ptype); + plot_mag(z,m_f,ptype); + title(sprintf('Spatial Profile - Freq = %5.1f', fplot(idx))); + xlabel('Position [cm]'); + end; + +end + +% Helper functions to avoid lots of "switch" statements + +function M = calc_mag(rfs, gs, z, f, ptype) + +[a,b] = abr(rfs,gs, z, f); +switch ptype + case 'ex' + M = ab2ex(a,b); + case 'inv' + M = ab2inv(a,b); + case 'sat' + M = ab2sat(a,b); + case 'se' + M = ab2se(a, b); +end + +end + +function plot_mag(x, M, ptype) + +switch ptype + case {'ex', 'se'} + plot(x,abs(M), 'r-',x,real(M),'b--', x,imag(M), 'g--'); + grid; + ylabel('M_{xy}'); + case {'inv', 'sat'} + plot(x,M, 'b-'); + grid; + ylabel('M_{z}'); +end + +end \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_response_mxy.m b/RF_pulses/spectral_spatial/ss_response_mxy.m new file mode 100644 index 0000000..db2ed0d --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_response_mxy.m @@ -0,0 +1,67 @@ +function mxy = ss_response_mxy(g,rf,z,f,ts,gamma, isodelay) +% SS_RESPONSE_MXY - Get Mxy response at given z, f position/frequency +% +% mxy = ss_response_mxy(g,rf,z,f,ts,gamma) +% +% Input +% g - gradient, G/cm +% rf - rf G +% z - cm +% f - frequency +% ts - sampling time (s) +% gamma - gyromagnetic ratio +% [isodelay] - Unwind spectral phase shift for given isodelay - default: 0 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% $Header: /home/adam/cvsroot/src/ss/ss_response_mxy.m,v 1.6 2013/08/15 03:34:50 adam Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if ( (nargin < 7) || isempty(isodelay) ), + isodelay = 0; + end; + + % Convert RF to a rotation in radians + % + rf_rot = 2 * pi * gamma * rf(:) * ts; + + % Build gradient that gives rotation + % in radians when scaled by "f" (off-resonance in Hz) + % + gf_rot = 2 * pi * ts * ones(size(g(:))); + + % Convert gradient to a rotation in radians + % when scaled by "z" + % + gz_rot = 2 * pi * gamma * g(:) * ts; + + % Add single samples at end of all waveforms to account for isodelay correction + % + rf_rot = [rf_rot;0]; + gf_rot = [gf_rot;(-2 * pi * isodelay)]; + gz_rot = [gz_rot;0]; + + + % Get Mxy now + % + [a b] = abr(rf_rot, gz_rot+i*gf_rot, z, f); + mxy = ab2ex(a, b); + + + + + diff --git a/RF_pulses/spectral_spatial/ss_save.m b/RF_pulses/spectral_spatial/ss_save.m new file mode 100644 index 0000000..96fb404 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_save.m @@ -0,0 +1,236 @@ +function ss_save(g,rf,ang,thk, isodelay, format, fspec, a_angs) +% SS_SAVE - Save spectral-spatial pulse +% Uses Chuck Cunningham's format for GE systems, and creates associated +% .dat-file +% Pulse parameters saved in header for Varian fules +% +% ss_save(g,rf,ang,thk, isodelay, format, fspec, a_angs) +% +% g - in G/cm +% rf - in G +% ang - flip angle in radians +% thk - thickness in cm +% isodelay (optional) - delay from in-phase point to end of pulse (GE +% definition) +% format (optional) - 'GE' (default), 'Varian' +% fspec (optional) - frequency bands (Hz) to write in file +% a_angs (optional) - band amplidutes (radians) to write in file + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +ss_globals; + +if (nargin < 5) || isempty(isodelay) + isodelay = length(rf)*SS_TS/ 2; +end + +if (nargin < 6) || isempty(format) + format = 'GE'; +else + switch format, + case {'GE', 'Varian'} + otherwise + error(sprintf(['Format save type of: %s not' ... + ' recognized'], format)); + end; +end + + maxg = max(abs(g)); + if maxg ~= 0, + gn = g/maxg; + else + gn = g; + end; + + maxrf = max(abs(rf)); + rfn = rf / maxrf; + + root_fname = input('Root file name: (leave empty to not save) ', 's'); + if isempty(root_fname) + fprintf(1,'Not saving files \n'); + return; + end; + + % calculate pulse parameters + nrf = length(rf); + abswidth = sum(abs(rfn))/nrf; + effwidth = sum(abs(rfn).^2)/nrf; + area = sum(abs(rfn))/nrf; + pon = (rfn >= 0.00001); + temp_pw = 0; + max_pw = 0; + for n=1:nrf + temp_pw = temp_pw + pon(n); + if (and(pon(n) == 0, temp_pw ~= 0)) + max_pw = max(max_pw, temp_pw); + temp_pw = 0; + end; + end; + max_pw = max_pw / n; + + dty_cyc = sum(abs(rfn) > 0.2236)/nrf; + if dty_cyc < max_pw, + dty_cyc = max_pw; + end; + + max_b1 = max(abs(rf)); + int_b1_sqr = sum(abs(rf).^2 * SS_TS * 1e3); + rms_b1 = sqrt(sum(abs(rf).^2))/nrf; + thk_scale = thk * SS_GAMMA / SS_GAMMA_HYDROGEN * 10; + + + % Allow magnitude of RF to go negative, this will + % help reduce sensitivity to theta modulation since + % there is a possible delay on the system for this case + % + + % Find pi jumps in phase and remove + % Do this by doubling phase and unwrapping 2*pi jumps + % + dang_rf = 2*angle(rfn); + dang_rf = dang_rf - dang_rf(1); + dang_rf = unwrap(dang_rf, 0.98*pi); + ang_rf = mod(dang_rf/2+pi,2*pi)-pi; + + mag_rf = real(rfn .* exp(-i*ang_rf)); + + if 1, + figure; + subplot(211) + t = 1:length(rf); + plot(abs(rf)); + hold on; + plot(maxrf*mag_rf,'r--') + + subplot(212); + plot(real(rf)); + hold on; + plot(imag(rf), 'b--'); + plot(real(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); + plot(imag(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); + end; + + + + switch (format) + case 'GE' + + dat_name = sprintf('%s.dat', root_fname); + fid = fopen(dat_name, 'w'); + if fid == -1, + fprintf(1, 'Error opening %s \n', dat_name); + return; + end; + + fprintf(fid,'%10d \t\t #Spectral-Spatial\n', 1); + fprintf(fid,'%10d \t\t #res\n', length(rf)); + fprintf(fid,'%10d \t\t #pw\n',round(length(rf)*SS_TS*1e6)); + fprintf(fid,'%10.7f \t\t #nom_flip \n',ang*180/pi); + fprintf(fid,'%10.7f \t\t #abswidth \n',abswidth); + fprintf(fid,'%10.7f \t\t #effwidth \n',effwidth); + fprintf(fid,'%10.7f \t\t #area \n',area); + fprintf(fid,'%10.7f \t\t #dtycyc \n',dty_cyc); + fprintf(fid,'%10.7f \t\t #maxpw \n',max_pw); + gamscale = SS_GAMMA/SS_GAMMA_HYDROGEN; % GE assumes max B1 is for application at 1H + fprintf(fid,'%10.7f \t\t #max_b1 \n',max_b1 * gamscale); + fprintf(fid,'%10.7f \t\t #max_int_b1_sqr \n',int_b1_sqr* gamscale^2); + fprintf(fid,'%10.7f \t\t #max_rms_b1 \n',rms_b1* gamscale^2); + fprintf(fid,'%10.3f \t\t #a_gzs \n',maxg); + fprintf(fid,'%10.3f \t\t #nom_thk(mm) \n',thk * gamscale * 10); + fprintf(fid,'%10d \t\t #isodelay\n',round(isodelay*1e6)); + fprintf(fid,'%10d \t\t #g_pow \n',0); + fprintf(fid,'%10d \t\t #g_pos_pow \n',0); + fprintf(fid,'%10d \t\t #g_neg_pow \n',0); + fprintf(fid,'%10d \t\t #g_abs \n',0); + fprintf(fid,'%10d \t\t #g_dgdt \n',0); + fprintf(fid,'%10d \t\t #g_pwm \n',0); + fprintf(fid,'%10d \t\t #g_pwm_abs \n',0); + fprintf(fid,'# *************************************\n'); + if (nargin == 7) + for b = 1:length(a_angs) + fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... + b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); + end + end + + fclose(fid); + + % Now write out RF and Gradient + % + rho_fname = sprintf('%s.rho', root_fname); + signa(mag_rf,rho_fname,1); + + theta_fname = sprintf('%s.pha', root_fname); + signa(-ang_rf,theta_fname,1/pi); + + g_fname = sprintf('%s.grd', root_fname); + signa(gn,g_fname,1); + + case 'Varian' + + fid = fopen(sprintf('%s.RF', root_fname),'wt'); + fprintf(fid,'# %s\n', sprintf('%s.RF', root_fname)); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'# Spectral-spatial Matlab Package\n'); + fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); + fprintf(fid,'# Duration = %d us\n',round(length(rf)*SS_TS*1e6)); + fprintf(fid,'# Isodelay = %d us\n',round(isodelay*1e6)); + fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); + fprintf(fid,'# Flip = %.2f degrees\n',ang*180/pi); + fprintf(fid,'# Max B1 = %.4f Gauss\n',max_b1); + if (nargin == 7) + for b = 1:length(a_angs) + fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... + b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); + end + end + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'# VERSION Matlab\n'); + fprintf(fid,'# TYPE selective\n'); + fprintf(fid,'# MODULATION amplitude\n'); + fprintf(fid,'# EXCITEWIDTH -1.0000\n'); + fprintf(fid,'# INVERTWIDTH -1.0000\n'); + fprintf(fid,'# INTEGRAL %1.4f\n', sum(abs(rfn))/length(rfn)); + fprintf(fid,'# RF_FRACTION -1.0000\n'); + fprintf(fid,'# STEPS %d\n',length(rfn)); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'%3.2f %4.2f 1.0\n',[-angle(rfn(:)).'*180/pi; 1023*abs(rfn(:)).']); + fclose(fid); + + fid = fopen(sprintf('%s.GRD', root_fname),'wt'); + fprintf(fid,'# %s\n', sprintf('%s.GRD', root_fname)); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'# Spectral-spatial Matlab Package\n'); + fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); + fprintf(fid,'# Duration = %d us\n',round(length(g)*SS_TS*1e6)); + fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); + fprintf(fid,'# Points = %d\n',length(g)); + fprintf(fid,'# Max Gradient Strength = %.4f Gauss/cm\n',maxg); + fprintf(fid,'# (Max Gradient Strength Constraint = %.2f Gauss/cm)\n',SS_MXG); + fprintf(fid,'# Max Slew Rate = %.2f Gauss/cm/ms\n',SS_MXS); + fprintf(fid,'# Slice thickness = %.1f mm\n',thk*10); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'%d 1\n',round(32767*gn)); + fclose(fid); + + end + + + + + + \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_save_dyn.m b/RF_pulses/spectral_spatial/ss_save_dyn.m new file mode 100644 index 0000000..5396656 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_save_dyn.m @@ -0,0 +1,232 @@ +function ss_save_dyn(g,rf,ang,thk, isodelay, format, fspec, a_angs, root_fname, pulse_num) +% SS_SAVE - Save spectral-spatial pulse +% Uses Chuck Cunningham's format for GE systems, and creates associated +% .dat-file +% Pulse parameters saved in header for Varian fules +% +% ss_save_dyn(g,rf,ang,thk, format, fspec, a_angs, root_fname, pulse_num) +% +% g - in G/cm +% rf - in G +% ang - flip angle in radians +% thk - thickness in cm +% isodelay (optional) - delay from in-phase point to end of pulse (GE +% definition) +% format (optional) - 'GE' (default), 'Varian' +% fspec (optional) - frequency bands (Hz) to write in file +% a_angs (optional) - band amplidutes (radians) to write in file +% root_fname - root file name (no prompting) +% pulse_num - pulse number + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +ss_globals; + +if (nargin < 5) || isempty(isodelay) + isodelay = length(rf)*SS_TS/ 2; +end + +if (nargin < 6) || isempty(format) + format = 'GE'; +else + switch format, + case {'GE', 'Varian'} + otherwise + error(sprintf(['Format save type of: %s not' ... + ' recognized'], format)); + end; +end + + maxg = max(abs(g)); + if maxg ~= 0, + gn = g/maxg; + else + gn = g; + end; + + maxrf = max(abs(rf)); + rfn = rf / maxrf; + + + % calculate pulse parameters + nrf = length(rf); + abswidth = sum(abs(rfn))/nrf; + effwidth = sum(abs(rfn).^2)/nrf; + area = sum(abs(rfn))/nrf; + pon = (rfn >= 0.00001); + temp_pw = 0; + max_pw = 0; + for n=1:nrf + temp_pw = temp_pw + pon(n); + if (and(pon(n) == 0, temp_pw ~= 0)) + max_pw = max(max_pw, temp_pw); + temp_pw = 0; + end; + end; + max_pw = max_pw / n; + + dty_cyc = sum(abs(rfn) > 0.2236)/nrf; + if dty_cyc < max_pw, + dty_cyc = max_pw; + end; + + max_b1 = max(abs(rf)); + int_b1_sqr = sum(abs(rf).^2 * SS_TS * 1e3); + rms_b1 = sqrt(sum(abs(rf).^2))/nrf; + thk_scale = thk * SS_GAMMA / SS_GAMMA_HYDROGEN * 10; + + + % Allow magnitude of RF to go negative, this will + % help reduce sensitivity to theta modulation since + % there is a possible delay on the system for this case + % + + % Find pi jumps in phase and remove + % Do this by doubling phase and unwrapping 2*pi jumps + % + dang_rf = 2*angle(rfn); + dang_rf = dang_rf - dang_rf(1); + dang_rf = unwrap(dang_rf, 0.98*pi); + ang_rf = mod(dang_rf/2+pi,2*pi)-pi; + + mag_rf = real(rfn .* exp(-i*ang_rf)); + +% if 1, +% figure; +% subplot(211) +% t = 1:length(rf); +% plot(abs(rf)); +% hold on; +% plot(maxrf*mag_rf,'r--') +% +% subplot(212); +% plot(real(rf)); +% hold on; +% plot(imag(rf), 'b--'); +% plot(real(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); +% plot(imag(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); +% end; + + + + switch (format) + case 'GE' + + dat_name = sprintf('%s%03d.dat', root_fname, pulse_num); + fid = fopen(dat_name, 'w'); + if fid == -1, + fprintf(1, 'Error opening %s \n', dat_name); + return; + end; + + fprintf(fid,'%10d \t\t #Spectral-Spatial\n', 1); + fprintf(fid,'%10d \t\t #res\n', length(rf)); + fprintf(fid,'%10d \t\t #pw\n',round(length(rf)*SS_TS*1e6)); + fprintf(fid,'%10.7f \t\t #nom_flip \n',ang*180/pi); + fprintf(fid,'%10.7f \t\t #abswidth \n',abswidth); + fprintf(fid,'%10.7f \t\t #effwidth \n',effwidth); + fprintf(fid,'%10.7f \t\t #area \n',area); + fprintf(fid,'%10.7f \t\t #dtycyc \n',dty_cyc); + fprintf(fid,'%10.7f \t\t #maxpw \n',max_pw); + gamscale = SS_GAMMA/SS_GAMMA_HYDROGEN; % GE assumes max B1 is for application at 1H + fprintf(fid,'%10.7f \t\t #max_b1 \n',max_b1 * gamscale); + fprintf(fid,'%10.7f \t\t #max_int_b1_sqr \n',int_b1_sqr* gamscale^2); + fprintf(fid,'%10.7f \t\t #max_rms_b1 \n',rms_b1* gamscale^2); + fprintf(fid,'%10.3f \t\t #a_gzs \n',maxg); + fprintf(fid,'%10.3f \t\t #nom_thk(mm) \n',thk * gamscale * 10); + fprintf(fid,'%10d \t\t #isodelay\n',round(isodelay*1e6)); + fprintf(fid,'%10d \t\t #g_pow \n',0); + fprintf(fid,'%10d \t\t #g_pos_pow \n',0); + fprintf(fid,'%10d \t\t #g_neg_pow \n',0); + fprintf(fid,'%10d \t\t #g_abs \n',0); + fprintf(fid,'%10d \t\t #g_dgdt \n',0); + fprintf(fid,'%10d \t\t #g_pwm \n',0); + fprintf(fid,'%10d \t\t #g_pwm_abs \n',0); + fprintf(fid,'# *************************************\n'); + if (nargin == 7) + for b = 1:length(a_angs) + fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... + b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); + end + end + + fclose(fid); + + % Now write out RF and Gradient + % + rho_fname = sprintf('%s%03d.rho', root_fname, pulse_num); + signa(mag_rf,rho_fname,1); + + theta_fname = sprintf('%s%03d.pha', root_fname, pulse_num); + signa(-ang_rf,theta_fname,1/pi); + + g_fname = sprintf('%s%03d.grd', root_fname, pulse_num); + signa(gn,g_fname,1); + + case 'Varian' + + fid = fopen(sprintf('%s%03d.RF', root_fname, pulse_num),'wt'); + fprintf(fid,'# %s\n', sprintf('%s%03d.RF', root_fname, pulse_num)); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'# Spectral-spatial Matlab Package\n'); + fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); + fprintf(fid,'# Duration = %d us\n',round(length(rf)*SS_TS*1e6)); + fprintf(fid,'# Isodelay = %d us\n',round(isodelay*1e6)); + fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); + fprintf(fid,'# Flip = %.2f degrees\n',ang*180/pi); + fprintf(fid,'# Max B1 = %.4f Gauss\n',max_b1); + if (nargin == 7) + for b = 1:length(a_angs) + fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... + b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); + end + end + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'# VERSION Matlab\n'); + fprintf(fid,'# TYPE selective\n'); + fprintf(fid,'# MODULATION amplitude\n'); + fprintf(fid,'# EXCITEWIDTH -1.0000\n'); + fprintf(fid,'# INVERTWIDTH -1.0000\n'); + fprintf(fid,'# INTEGRAL %1.4f\n', sum(abs(rfn))/length(rfn)); + fprintf(fid,'# RF_FRACTION -1.0000\n'); + fprintf(fid,'# STEPS %d\n',length(rfn)); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'%3.2f %4.2f 1.0\n',[-angle(rfn(:)).'*180/pi; 1023*abs(rfn(:)).']); + fclose(fid); + + fid = fopen(sprintf('%s%03d.GRD', root_fname, pulse_num),'wt'); + fprintf(fid,'# %s\n', sprintf('%s.GRD', root_fname)); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'# Spectral-spatial Matlab Package\n'); + fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); + fprintf(fid,'# Duration = %d us\n',round(length(g)*SS_TS*1e6)); + fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); + fprintf(fid,'# Points = %d\n',length(g)); + fprintf(fid,'# Max Gradient Strength = %.4f Gauss/cm\n',maxg); + fprintf(fid,'# (Max Gradient Strength Constraint = %.2f Gauss/cm)\n',SS_MXG); + fprintf(fid,'# Max Slew Rate = %.2f Gauss/cm/ms\n',SS_MXS); + fprintf(fid,'# Slice thickness = %.1f mm\n',thk*10); + fprintf(fid,'# ***************************************************\n'); + fprintf(fid,'%d 1\n',round(32767*gn)); + fclose(fid); + + end + + + + + + \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_spect_correct.m b/RF_pulses/spectral_spatial/ss_spect_correct.m new file mode 100644 index 0000000..dad8961 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_spect_correct.m @@ -0,0 +1,332 @@ +function rfm = ss_spect_correct(b, bsf, Nper, Noff, f, ptype, ss_type, slr, ... + dbg) +% SS_SPECT_CORRECT - Correct spectral filter for irregular sampling +% +% function rf = ss_spect_correct(b, bsf, Nper, Noff, f, ptype, ss_type, slr, dbg) +% +% Inputs: +% b - spectral filter design, normalized so that passband has value of 1 +% bsf - beta polynomial scale factors (normally sin(ang/2)) +% Nper - period in samples between taps of b +% Noff - vector of sample offsets from reference point (may be fractional) +% f - Normalized frequency bands to try to correct - may be outside Nyquist (-1..1) +% ptype - type of pulse, 'ex', 'se', 'sat, 'inv' +% ss_type - 'Flyback' or 'EP' +% slr - SLR flag +% +% Outputs: +% rf - rf taps to give desired tip +% +% It is assumed that the first gradient lobe is a positive one, +% +% If a "Flyback" ss_type is specified, then filter taps will all +% be moving forward together by "n" units. With minimum-phase filters +% it is best to use the spectral filter reference for the first tap +% then move forward. +% +% If a "EP" ss_type is specified, then filter taps will be moving +% alternately forward/backward by "n" units. The reference should +% be the midpoint of the spectral lobes. +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This method is also described in: +% (1) C.H. Cunningham, D.B. Vigneron, A.P. Chen, D. Xu, M. Lustig, D.A. Kelley, +% J.M. Pauly, Spectral?spatial excitation and refocusing for reduced volume +% mis- registration at 7 Tesla, in: Proceedings of the 14th Annual Meeting +% of ISMRM, Seattle, 2006, p. 72. +% (2) C.H. Cunningham, A.P. Chen, M. Lustig, J. Lupo, D. Xu, J. Kurhanewicz, +% R.E. Hurd, J.M. Pauly, S.J. Nelson, D.B. Vigneron, Pulse sequence for +% dynamic volumetric imaging of hyperpolarized metabolic products, J. Magn. +% Reson. 193 (1) (2008) 139?146. + + +% Error checking on inputs + % + if nargin < 7, + error('Usage: ss_spect_correct(b, bsf, N, n, f, ptype, ss_type, dbg)'); + end; + + if nargin < 8, + dbg = 0; + end; + + switch ss_type, + case {'Flyback', 'EP'} + otherwise + error('ss_type must be ''Flyback'' or ''EP'''); + end; + + if length(bsf) ~= length(Noff), + error('bsf / offset vectors not same length'); + end; + nfilt = length(bsf); + + % Calculate sampling positions of ref filter taps + % + N = length(b); + t_ref = [0:N-1]; + + % Get sampling in pass/stopbands + % ensuring that mult_factor*N samples exist + % + mult_factor = 15; + fdiff = diff(f); + fsum = sum(fdiff(1:2:end)); % frequency range that is sampled + df = fsum/(mult_factor*N); + + nband = length(f)/2; + if strcmp(ss_type, 'Flyback'), + w = linspace(-pi, pi, 2*mult_factor*N); + else + w = []; + for band = 1:nband, + nf = ceil((f(band*2)-f(band*2-1))/df) + 1; + df_act = (f(band*2)-f(band*2-1))/(nf-1); + wband = f(band*2-1) + [0:nf-1]*df_act; + w = [w pi*wband]; + end; + end; + + % Plot w sampling + % + if (dbg >= 2), % Verbose + figure; + subplot(2,1,1); + plot(w/pi,ones(length(w)),'bx'); + hold on; + for band = 1:nband, + plot(f(band*2-1)*ones(1,2), [0 1], 'r'); + plot(f(band*2)*ones(1,2), [0 1], 'r'); + end; + title('Band Sampling'); + xlabel('Normalized Frequency'); + axis([min(w/pi) max(w/pi) -0.2 1.2]); + + [h_freq,freq] = freqz(b,1,[min(w/pi):0.005:max(w/pi)],2); + + subplot(2,1,2); + plot(freq,abs(h_freq)); + title('Frequency Response'); + xlabel('Normalized Frequency'); + axis([min(w/pi) max(w/pi) -0.2 1.2]); + end; + + + % Calculate spectral filter corrections + % + if (dbg >= 2), + filt_fig = figure; + end; + + % Get reference transform + % + Wref = exp(-i*kron(w', t_ref)); + Fref = Wref * b(:); + + for idx = 1:nfilt, + % Get actual sampling positions + % + switch (ss_type), + case 'Flyback', + t_act = t_ref + Noff(idx)/Nper; + case 'EP', + t_act = t_ref + (Noff(idx)/Nper * (-1).^[0:N-1]); + end; + + if (dbg >= 2) + figure(filt_fig); + subplot(411); + stem([t_ref.' t_act.'], ones(length(t_ref),2)); + legend('Reference', 'Actual'); + title('Sampling Locations'); + end; + + switch (ss_type) + case 'Flyback' + % Get actual + % + Wact = exp(-i*kron(w', t_act)); + + % Get least-squares fit to filter + % + type = 0; + switch(type) + case 0 + % Add regularization to this problem + % + Wact_pinv = pinv(Wact); + bm(:,idx) = Wact_pinv * Fref; + %bm(:,idx) = inv(Wact'*Wact + 1e-4*eye(size(Wact,2)))*Wact'*Fref; + case 1 + % Do constrained least-squares - best option, but slow + % Could be sped up using pdco + % + bm(:,idx) = lscon(Wact, Fref(:), 0, 1.2*max(abs(b)), b(:), 0); + case 2 + % pdco option + % + c = 1; + pdco_options = pdcoSet; + d1 = 1e-6; + d2 = 1; + x0 = b(:); + y0 = zeros(size(Wact,1),1); + z0 = ones(size(Wact,2),1); + xsize = mean(abs(b)); + zsize = 1; + bm(:,idx) = pdco(c, Wact, Fref(:), -1.2*max(abs(b)), 1.2*max(abs(b)), ... + d1, d2, pdco_options, x0, y0, z0, xsize,zsize,1); + end; + + if 0 + figure; + Fref_fix = Wact * bm(:,idx); + plot(w/pi,abs(Fref_fix)); + pause; + end; + + % Since samples are still uniform, we can + % just use SLR to get rf + % + if slr, + rfm(:,idx) = b2rf(bsf(idx) * bm(:,idx)); + else + rfm(:,idx) = 2*asin(abs(bsf(idx))) * conj(bm(:,idx)); + end; + case 'EP' + % Get actual + % + Wact = exp(-i*kron(w', t_act)); + + % Get least-squares fit to filter + % + Wact_pinv = pinv(Wact); + bm(:,idx) = Wact_pinv * Fref; + + % Can't do SLR yet + % + if slr, + rfm(:,idx) = 2*asin(abs(bsf(idx)))*conj(bm(:,idx)); + else + rfm(:,idx) = 2*asin(abs(bsf(idx))) * bm(:,idx); + end; + end; + + if ( (dbg >= 2) && (rem(idx,10)==0) ), + figure(filt_fig); + show_M = 0; + plot_db = 0; + if show_M, + rf_ref = b2rf(bsf(round(end/2)) * b(:)); + subplot(412); + hold off; + plot(abs(rf_ref),'b-'); + hold on; + plot(abs(rfm(:,idx)),'r--'); + + % Fill in large time indices with RF + % + t_ref_x = Nper + t_ref*Nper; + t_act_x = Nper + round(t_act*Nper); + + % Fill in large (mostly zero) arrays with RF + % + rf_ref_x = zeros(1,(N+2)*Nper); + rf_ref_x(t_ref_x) = rf_ref; + + rf_act_x = zeros(1,(N+2)*Nper); + rf_act_x(t_act_x) = rf_ref; + + rf_actfix_x = zeros(1,(N+2)*Nper); + rf_actfix_x(t_act_x) = rfm(:,idx); + + % Now determine M + % + g = pi * ones(length(rf_ref_x)); + Mref = ab2ex(abr(rf_ref_x, g, w/pi)); + Mact = ab2ex(abr(rf_act_x, g, w/pi)); + Mactfix = ab2ex(abr(rf_actfix_x, g, w/pi)); + subplot(413); + if plot_db, + hold off; + plot(w/pi,20*log10(abs(Mref)),'b'); + hold on; + plot(w/pi,20*log10(abs(Mactfix)),'r--'); + plot(w/pi,20*log10(abs(Mact)),'g--'); + ylabel('DB Scale'); + else + hold off; + plot(w/pi,abs(Mref),'b'); + hold on; + plot(w/pi,abs(Mactfix),'r--'); + plot(w/pi,abs(Mact),'g--'); + ylabel('Linear Scale'); + end; + title('Magnitude Magnetization'); + + subplot(414); + hold off; + plot(w/pi,angle(Mref),'b'); + hold on; + plot(w/pi,angle(Mactfix),'r--'); + plot(w/pi,angle(Mact),'g--'); + title('Phase Magnetization'); + else, + Fact = Wact * b(:); + Fact_fix = Wact * bm(:,idx); + + subplot(4,1,2); + hold off; + plot(abs(b)); + hold on; + plot(abs(bm(:,idx)), 'r--'); + title('Beta Polynomials'); + + subplot(4,1,3); + if plot_db, + hold off; + plot(w/pi,20*log10(abs(Fref)),'b-'); + hold on; + plot(w/pi, 20*log10(abs(Fact)), 'g--'); + plot(w/pi, 20*log10(abs(Fact_fix)), 'r--'); + ylabel('DB Scale'); + else + hold off; + plot(w/pi,abs(Fref),'b-'); + hold on; + plot(w/pi, abs(Fact), 'g--'); + plot(w/pi, abs(Fact_fix), 'r--'); + ylabel('Linear Scale'); + end; + + title('Magnitude Response'); + + subplot(4,1,4); + hold off; + plot(w/pi,angle(Fref),'b-'); + hold on; + plot(w/pi,angle(Fact),'g--'); + plot(w/pi,angle(Fact_fix),'r--'); + title('Phase Response'); + end; + + fprintf(1,'Offset: %f -- Hit any key to continue\n', Noff(idx)); + pause; + end; + end; + diff --git a/RF_pulses/spectral_spatial/ss_verse.m b/RF_pulses/spectral_spatial/ss_verse.m new file mode 100644 index 0000000..f8b5072 --- /dev/null +++ b/RF_pulses/spectral_spatial/ss_verse.m @@ -0,0 +1,45 @@ +% rfv = ss_verse(gv,rf) +% +% Computes the versed version of rf for a given time-vayring gradient gv + +% written by John Pauly, 1992 +% Bug fixes by Peder Larson, 2007 +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package +% +% Authors: Adam B. Kerr and Peder E. Z. Larson +% +% (c)1992-2011 Board of Trustees, Leland Stanford Junior University and +% The Regents of the University of California. +% All Rights Reserved. +% +% Please see the Copyright_Information and README files included with this +% package. All works derived from this package must be properly cited. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function rfv = ss_verse(g,rf) + +[m n] = size(g); +if m Date: Wed, 9 Jul 2014 17:10:44 -0700 Subject: [PATCH 04/18] IDEAL cleanup --- IDEAL/nsa.m | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 IDEAL/nsa.m diff --git a/IDEAL/nsa.m b/IDEAL/nsa.m new file mode 100644 index 0000000..5fd4864 --- /dev/null +++ b/IDEAL/nsa.m @@ -0,0 +1,65 @@ +function out = nsa(df, ne) +%This function calculates the number of signal averages (NSA) for an IDEAL +%acquisition with n species and ne echoes. Echo spacing (dTE) is assumed to +%be constant. +% +%SYNTAX: +%out = nsa(df,ne) +% +%INPUT: +%df is a vector containing the relative frequencies for the species of +%interest. +% +%ne is the number of echoes to acquire +% +%OUTPUT: +%out.NSA: Number of signal averages (i.e. noise performance) for each species +%out.CN: Condition number +%out.dte: echo spacings used to calculate condition number and NSA +% +%EXAMPLE: +%df = [620 414 288 0]; %lac pa-h2o ala pa @ 4.7T +%out = nsa(df,7); +% +%JWG 2013-03-07 + +df = df(:); +n = length(df); +t0 = 1e-3; %s +dte = (0.01:0.01:8)*1e-3; %s + +NSA = zeros(n,length(dte)); +CN = zeros(1,length(dte)); + +for ii = 1:length(dte) + for jj = 1:n + te = t0:dte(ii):t0+(ne-1)*dte(ii); + te = te(:); + A = exp(1i*2*pi*te*df.'); % te*df.' is matrix multiplication + inv_AHA = inv(A'*A); + NSA(jj,ii) = 1/inv_AHA(jj,jj); + CN(1,ii) = cond(A,2); + end +end + +%plot results +figure() +subplot(2,1,1),plot(dte*1e3,real(NSA.')) +hold on +title([int2str(ne) ' echo acquisition for ' int2str(length(df)) ' species']); +xlabel('\DeltaTE (ms)') +ylabel('NSA') +ylim([0 ne+1]) + +% now plot condition # +subplot(2,1,2) +plot(dte*1e3,CN) +ylim([1 10]) +xlabel('\DeltaTE (ms)') +ylabel('Condition #') + +% save results in structure +out.nsa = NSA; +out.cond_number = CN; +out.dte = dte; +end \ No newline at end of file From 74114d54ae1fa9bb3a590a13a890340205af849e Mon Sep 17 00:00:00 2001 From: agentmess Date: Mon, 14 Jul 2014 13:36:38 -0700 Subject: [PATCH 05/18] Create README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..04bb74a --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +hyperpolarized-mri-toolbox +========================== + +The goal of this toolbox is to provide research-level and prototyping software tools for hyperpolarized MRI experiments. It is currently based on MATLAB code, and includes code for designing radiofrequency (RF) pulses, readout gradients, and data reconstruction. + +This toolbox was created as a part of the UCSF Hyperpolarized MRI Technology Resource Center (http://www.radiology.ucsf.edu/research/labs/hyperpolarized-mri-tech), and we encourage the entire hyperpolarized MRI research community to contribute tools that will help our field rapidly progress. + +For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/). + +Please let us know if you would like to contribute or have suggestions for content. From 609451cead894184f6af9d4441f2ef1eb4b35b5f Mon Sep 17 00:00:00 2001 From: agentmess Date: Mon, 14 Jul 2014 13:41:23 -0700 Subject: [PATCH 06/18] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 04bb74a..ebfccd8 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,9 @@ This toolbox was created as a part of the UCSF Hyperpolarized MRI Technology Res For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/). Please let us know if you would like to contribute or have suggestions for content. + +Project Organizer: Peder Larson, University of California - San Francisco +Project Contributors: +* Jeremy Gordon, University of California - San Francisco +* Adam Kerr, Stanford University +* You :) From ba1be84e0feeeb0d3076b3e449c138e5b80a242f Mon Sep 17 00:00:00 2001 From: agentmess Date: Mon, 14 Jul 2014 13:42:01 -0700 Subject: [PATCH 07/18] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ebfccd8..b593461 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,9 @@ For enhanced data visualization tools, including optimized implementations of so Please let us know if you would like to contribute or have suggestions for content. -Project Organizer: Peder Larson, University of California - San Francisco -Project Contributors: +**Project Organizer**: Peder Larson, University of California - San Francisco + +**Project Contributors**: * Jeremy Gordon, University of California - San Francisco * Adam Kerr, Stanford University * You :) From 2fdf2909af1582d4706320e69e8d55c7b59b7293 Mon Sep 17 00:00:00 2001 From: agentmess Date: Mon, 14 Jul 2014 13:46:29 -0700 Subject: [PATCH 08/18] IDEAL cleanup --- nsa.m | 65 ----------------------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 nsa.m diff --git a/nsa.m b/nsa.m deleted file mode 100644 index 5fd4864..0000000 --- a/nsa.m +++ /dev/null @@ -1,65 +0,0 @@ -function out = nsa(df, ne) -%This function calculates the number of signal averages (NSA) for an IDEAL -%acquisition with n species and ne echoes. Echo spacing (dTE) is assumed to -%be constant. -% -%SYNTAX: -%out = nsa(df,ne) -% -%INPUT: -%df is a vector containing the relative frequencies for the species of -%interest. -% -%ne is the number of echoes to acquire -% -%OUTPUT: -%out.NSA: Number of signal averages (i.e. noise performance) for each species -%out.CN: Condition number -%out.dte: echo spacings used to calculate condition number and NSA -% -%EXAMPLE: -%df = [620 414 288 0]; %lac pa-h2o ala pa @ 4.7T -%out = nsa(df,7); -% -%JWG 2013-03-07 - -df = df(:); -n = length(df); -t0 = 1e-3; %s -dte = (0.01:0.01:8)*1e-3; %s - -NSA = zeros(n,length(dte)); -CN = zeros(1,length(dte)); - -for ii = 1:length(dte) - for jj = 1:n - te = t0:dte(ii):t0+(ne-1)*dte(ii); - te = te(:); - A = exp(1i*2*pi*te*df.'); % te*df.' is matrix multiplication - inv_AHA = inv(A'*A); - NSA(jj,ii) = 1/inv_AHA(jj,jj); - CN(1,ii) = cond(A,2); - end -end - -%plot results -figure() -subplot(2,1,1),plot(dte*1e3,real(NSA.')) -hold on -title([int2str(ne) ' echo acquisition for ' int2str(length(df)) ' species']); -xlabel('\DeltaTE (ms)') -ylabel('NSA') -ylim([0 ne+1]) - -% now plot condition # -subplot(2,1,2) -plot(dte*1e3,CN) -ylim([1 10]) -xlabel('\DeltaTE (ms)') -ylabel('Condition #') - -% save results in structure -out.nsa = NSA; -out.cond_number = CN; -out.dte = dte; -end \ No newline at end of file From c0c903ab954641fff0ebe77f15870e446409f143 Mon Sep 17 00:00:00 2001 From: agentmess Date: Thu, 12 Feb 2015 17:45:37 -0800 Subject: [PATCH 09/18] Added optimal signal VFA code --- .../variable_flip_angles/vfa_opt_signal.m | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 RF_pulses/variable_flip_angles/vfa_opt_signal.m diff --git a/RF_pulses/variable_flip_angles/vfa_opt_signal.m b/RF_pulses/variable_flip_angles/vfa_opt_signal.m new file mode 100644 index 0000000..ccd7034 --- /dev/null +++ b/RF_pulses/variable_flip_angles/vfa_opt_signal.m @@ -0,0 +1,28 @@ +function [flip, mxy, mz] = vfa_opt_signal(N, E1); +% [flip, mxy, mz] = vfa_opt_signal(N,E1) +% +% Calculates series of flip angles for a maximum summed signal across +% all RF pulses. Derived in Nagashima, K. Optimum pulse flip angles for multi-scan acquisition of hyperpolarized nmr and mri. J Magn Reson 190, 2 (February 2008), 183–188. +% +% INPUTS: +% N - number of pulses +% E1 = exp(-TR/T1) accounts for T1 decay between acquisitions. +% +% OUTPUTS: +% flip - flip angles +% mxy,mz - expected magnetization with given E1 +% +% (c) 2008-2013 The Regents of the University of California +% All Rights Reserved. +% +% Author: Peder E. Z. Larson + + +if nargin < 2 || E1 == 1 + flip = vfa_const_amp(N, pi/2); + return +end + +flip = acos( sqrt((E1^2-E1.^(2.*(N-[1:N]+1))) ./ (1-E1.^(2*(N-[1:N]+1)))) ); + +[mxy, mz] = hyperpolarized_mag_usage(flip, E1); From 797d49093454afe4947fa0d3f5c7dd98b095d66b Mon Sep 17 00:00:00 2001 From: agentmess Date: Wed, 25 Feb 2015 16:19:36 -0800 Subject: [PATCH 10/18] updates to documentation and new optimization code Major updates to documentation Added optimal_SNR_* code that solves optimization problems and demonstrates usage --- README.md | 4 +- RF_pulses/variable_flip_angles/README | 35 ++- .../variable_flip_angles/mvfa_const_amp.m | 7 +- .../variable_flip_angles/optimal_SNR_angles.m | 230 ++++++++++++++++++ .../variable_flip_angles/optimal_SNR_demo.m | 109 +++++++++ .../variable_flip_angles/vfa_example_script.m | 35 ++- 6 files changed, 398 insertions(+), 22 deletions(-) create mode 100755 RF_pulses/variable_flip_angles/optimal_SNR_angles.m create mode 100755 RF_pulses/variable_flip_angles/optimal_SNR_demo.m diff --git a/README.md b/README.md index b593461..bcc2f88 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,9 @@ hyperpolarized-mri-toolbox The goal of this toolbox is to provide research-level and prototyping software tools for hyperpolarized MRI experiments. It is currently based on MATLAB code, and includes code for designing radiofrequency (RF) pulses, readout gradients, and data reconstruction. -This toolbox was created as a part of the UCSF Hyperpolarized MRI Technology Resource Center (http://www.radiology.ucsf.edu/research/labs/hyperpolarized-mri-tech), and we encourage the entire hyperpolarized MRI research community to contribute tools that will help our field rapidly progress. +This toolbox was created as a part of the UCSF Hyperpolarized MRI Technology Resource Center (http://www.radiology.ucsf.edu/research/labs/hyperpolarized-mri-tech) which is funded by the National Institutes of Health (NIH Grant P41-EB013598). + +It is hosted on this open-source, collaborative platform in order to encourage anyone and everyone in the hyperpolarized MRI research community to contribute tools that will help our field rapidly progress. For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/). diff --git a/RF_pulses/variable_flip_angles/README b/RF_pulses/variable_flip_angles/README index f30cf6d..daa766e 100644 --- a/RF_pulses/variable_flip_angles/README +++ b/RF_pulses/variable_flip_angles/README @@ -1,14 +1,35 @@ Variable Flip Angle RF Pulse Design scripts -Authors: Peder E. Z. Larson and Ann Xing +Original Authors: Peder E. Z. Larson, Ann Xing, Sonam Machingal, John Maidens -(c) 2008-2013 The Regents of the University of California. +(c) 2008-2015 The Regents of the University of California. All Rights Reserved. ====================== -These Matlab functions are for designing variable flip angle schemes for hyperpolarized MR applications. All functions are documented within. These accompany the manuscript: -Xing Y, Reed GD, Pauly JM, Kerr AB, and Larson PEZ. Optimal Variable Flip Angle Schemes For Dynamic Acquisition Of Exchanging Hyperpolarized Substrates. J Magn Reson. 2013 Sep; 234:75-81. -http://www.ncbi.nlm.nih.gov/pubmed/23845910 +These Matlab functions are for designing variable flip angle schemes for hyperpolarized MR applications. All functions are documented within. -All works deriving from this package must be properly cited. Please include the following sources of support: -- Hyperpolarized MRI Technology Resource Center at UCSF (NIH P41-EB013598) +Description of functions: +* vfa_const_amp + RF-compensated variable flip angle scheme for constant signal + Can also include compensation for T1 or an effective T1, aiming for constant signal amplitude +References: + Zhao, L., Mulkern, R., Tseng, C.-H., Williamson, D., Patz, S., Kraft, R., Walsworth, R. L., Jolesz, F. A., and Albert, M. S. Gradient-echo imaging considerations for hyperpolarized 129xe mr. J Magn Reson B 113, 2 (November 1996), 179–183. + Xing Y, Reed GD, Pauly JM, Kerr AB, and Larson PEZ. Optimal Variable Flip Angle Schemes For Dynamic Acquisition Of Exchanging Hyperpolarized Substrates. J Magn Reson. 2013 Sep; 234:75-81. http://www.ncbi.nlm.nih.gov/pubmed/23845910 +* vfa_opt_signal + flip angle schemes to maximize the total signal when summed across all acquisitions + Theoretically derived to include compensation for T1 decay + Emperically derived to be optimal for metabolic products as well in optimal_SNR_demo.m +References: +Nagashima, K. Optimum pulse flip angles for multi-scan acquisition of hyperpolarized nmr and mri. J Magn Reson 190, 2 (February 2008), 183–188. + +* mvfa_const_amp + Constant amplitude signal flip angles in the presence of both T1 decay and metabolic conversion +References: + Zhao, L., Mulkern, R., Tseng, C.-H., Williamson, D., Patz, S., Kraft, R., Walsworth, R. L., Jolesz, F. A., and Albert, M. S. Gradient-echo imaging considerations for hyperpolarized 129xe mr. J Magn Reson B 113, 2 (November 1996), 179–183. + Xing Y, Reed GD, Pauly JM, Kerr AB, and Larson PEZ. Optimal Variable Flip Angle Schemes For Dynamic Acquisition Of Exchanging Hyperpolarized Substrates. J Magn Reson. 2013 Sep; 234:75-81. http://www.ncbi.nlm.nih.gov/pubmed/23845910 + +* optimal_SNR_flips + Optimization of total metabolic product signal when summed across all acquisitions + Results are nearly identical to vfa_opt_signal, as demonstrated in optimal_SNR_demo.m + +This project is supported by the Hyperpolarized MRI Technology Resource Center at UCSF (NIH P41-EB013598) \ No newline at end of file diff --git a/RF_pulses/variable_flip_angles/mvfa_const_amp.m b/RF_pulses/variable_flip_angles/mvfa_const_amp.m index 7dbd850..67e3950 100644 --- a/RF_pulses/variable_flip_angles/mvfa_const_amp.m +++ b/RF_pulses/variable_flip_angles/mvfa_const_amp.m @@ -2,7 +2,7 @@ % flips = mvfa_const_amp(N, TR, k12, R1, Minit) % % Calculates series of flip angles for substrate and product that -% are exchanging for a constant amplitude signal in +% are exchanging aiming for a constant amplitude signal in % hyperpolarized MR, assuming negligible thermal magnetization and back-reaction. % % INPUTS: @@ -36,7 +36,7 @@ flips(1,:) = vfa_const_amp(N, pi/2, exp(-TR * (R1(1) + k12))); % substrate flip angle -Sbounds = [0 Minit(2)]; % bound product signal +Sbounds = [0 sum(Minit)]; % bound product signal mag(:,1) = Minit; A = [-R1(1)-k12 0; @@ -59,4 +59,5 @@ end end -flips(2,N) = pi/2; \ No newline at end of file +flips(2,N) = pi/2; +flips = real(flips); \ No newline at end of file diff --git a/RF_pulses/variable_flip_angles/optimal_SNR_angles.m b/RF_pulses/variable_flip_angles/optimal_SNR_angles.m new file mode 100755 index 0000000..e9a6fed --- /dev/null +++ b/RF_pulses/variable_flip_angles/optimal_SNR_angles.m @@ -0,0 +1,230 @@ +function [flips, Mxy, Mz] =optimal_SNR_angles(T,TR,k,R1,Tinj,substrate_flips,dbg); +% flips =optimal_SNR_angles(T1,TR,T,tend,substrate_flips); +% +% Calculates series of flip angles to maximize cumulative signal of +% metabolic product (e.g. lactate) in hyperpolarized MR, for a fixed set of +% defined substrate (e.g. pyruvate) flip angles. +% Uses a gamma variate input model +% +% It can be derived based on this code that, to a very good approximation, +% only the relaxation rate of the product, the total scan time, and the TR +% influence the resulting flip angles +% +% +% INPUTS: +% T - total scan time in sec +% TR - repetition time in sec +% k - conversion rate from product to substrate, 1/sec +% R1 - relaxation rate of substrate and product (can specify both or one if equal) +% Tinj - approximate duration of injection +% substrate_flips (optional) - flip angles of substrate +% dbg (optional) - print out messages and create plots +% +% OUTPUTS: +% flips - flip angles for substrate and product +% Mxy,Mz - simulated magnetizations using optimal scheme and input +% parameters +% +% +% (c) 2014-2015 The Regents of the University of California +% All Rights Reserved. +% +% Authors: John Maidens, Sonam Machingal + +if length(R1) == 1 + R1 = [R1 R1]; +end + +if length(k) == 1 + % only kPL provided, estimate kTRANS + k = [k, .03]; +end + + +% define number of acquisitions- +N = max(floor(T/TR),1); + +if nargin<7 || isempty(substrate_flips) + % generate substrate flip angles + substrate_flips = vfa_const_amp(N,pi/2,exp(-TR*(R1(1) + k(1)))); +end + +if nargin < 8 + dbg = 0; % don't print outputs +end + +% define model parameters + +syms R1P R1L kPL kTRANS t0 A0 sigma_1 sigma_2 sigma_3 alpha_1 beta_1 +parameters_of_interest = [kPL kTRANS]; +parameters_of_interest_nominal_values = [k(1) k(2)]; +nuisance_parameters = [alpha_1 beta_1 A0]; +nuisance_parameters_nominal_values = [Tinj/3 Tinj/4 1]; % approximate incorporation of Tinj here, set as known_parameter? +known_parameters = [R1P R1L t0]; +known_parameter_values = [R1(1) R1(2) 0]; + +% define system matrices for differential eq. dx/dt = A*x(t) + B*u(t) +A = [ -kPL-R1P 0 ; + kPL -R1L]; +B = [kTRANS; 0]; + +% define input function shape + +u = @(t) A0*(t-t0)^alpha_1*exp(-(t-t0)/beta_1); %gamma variate + + +% generate SNR-optimal lactate flip angles + +[flips, Mxy, Mz, u_sim] = optimal_flip_angle_design_max_product_SNR(A, B, u, TR, N, ... + parameters_of_interest, nuisance_parameters, ... + known_parameters, parameters_of_interest_nominal_values, ... + nuisance_parameters_nominal_values, known_parameter_values, ... + substrate_flips(:),dbg); + +if dbg + display('=====Metabolite flip angle generation complete=====') + + % plot optimal flip angles + t = [0:N-1]*TR; + figure + subplot(3,2,1) + plot(t,180/pi*flips(2,:), 'mx-') + title('flip angle scheme for Lactate') + xlabel('time') + ylabel('flip angle (degrees)') + %axis([1 N 0 100]) + + subplot(3,2,2) + plot(t,180/pi*flips(1,:), 'mx-') + title('flip angle scheme for Pyruvate') + xlabel('time') + ylabel('flip angle (degrees)') + %axis([1 N 0 100]) + + subplot(3,2,3) + plot(t,Mz(2,:), 'mx-') + title('Simulated magnetization for Lactate') + xlabel('time') + ylabel('signal') + %axis([1 N 0 max(Mz(:))]) + + subplot(3,2,4) + plot(t,Mz(1,:), 'mx-') + title('Simulated magnetization for pyruvate') + xlabel('time') + ylabel('signal') + %axis([1 N 0 max(Mz(:))]) + + subplot(3,2,5) + plot(t,Mxy(2,:), 'mx-') + title('Simulated signal for Lactate') + xlabel('time') + ylabel('signal') + %axis([1 N 0 max(Mz(:))]) + + subplot(3,2,6) + plot(t,Mxy(1,:), 'mx-') + title('Simulated signal for pyruvate') + xlabel('time') + ylabel('signal') + + %figure + %plot(t, u_sim) +end +end + + +function [thetas_opt, Mxy, Mz, u] = optimal_flip_angle_design_max_product_SNR(A, B, u, TR, N, ... + parameters_of_interest, nuisance_parameters, ... + known_parameters, parameters_of_interest_nominal_values, ... + nuisance_parameters_nominal_values, known_parameter_values, ... + substrate_flips,dbg) + +if dbg + display('===== Computing optimal flip angles =====') +end + +% Ensure that input arguments are compatible +[i, j] = size(A); +if i ~= j + error('The argument A must be a square matrix'); +end + +if size(B, 1) ~= i + error('The number of rows of B must equal the size of A'); +end + +if size(B, 2) ~= size(u, 1) + error('The number of columns of B must equal the number of entries of u') +end + +if size(parameters_of_interest) ~= size(parameters_of_interest_nominal_values) + error('The arguments parameters_of_interest and parameters_of_interest_nominal_values must be the same size'); +end + +if size(nuisance_parameters) ~= size(nuisance_parameters_nominal_values) + error('The arguments nuisance_parameters and nuisance_parameters_nominal_values must be the same size'); +end + +if size(known_parameter_values) ~= size(known_parameters) + error('The arguments known_parameters and known_parameter_values must be the same size'); +end + + + +% compute symbolic system discretization +Ad_sym = expm(TR*A); +Bd_sym = A\((Ad_sym - eye(size(A)))*B); + +% evaluate system matrices and input at nominal parameter values +Ad_nom = double(subs(Ad_sym, [parameters_of_interest, nuisance_parameters, known_parameters], ... + [parameters_of_interest_nominal_values, nuisance_parameters_nominal_values, known_parameter_values])); +Bd_nom = double(subs(Bd_sym, [parameters_of_interest, nuisance_parameters, known_parameters], ... + [parameters_of_interest_nominal_values, nuisance_parameters_nominal_values, known_parameter_values])); +u_fun = matlabFunction(subs(u,[parameters_of_interest, nuisance_parameters, known_parameters], ... + [parameters_of_interest_nominal_values, nuisance_parameters_nominal_values, known_parameter_values])); + +% define objective function for total product SNR +subindex=@(A) A(2,:); %select second row +obj = @(product_flips) -(sum(sum(subindex(trajectories([substrate_flips, product_flips, pi/2*ones(N,1)], Ad_nom, Bd_nom, u_fun, TR, N))))); + +% initialize optimization problem +if dbg + options = optimset('MaxFunEvals', 50000, 'MaxIter', 1000, 'Display', 'iter'); +else + options = optimset('MaxFunEvals', 50000, 'MaxIter', 1000, 'Display', 'off', 'LargeScale', 'off'); +end + +initial_product_flips=zeros(N,1); % or vfa_const_amp? +%% + +% perform optimization +product_flips_opt = fminunc(obj, initial_product_flips, options); + +% add fixed flip angles to result +thetas_opt = [substrate_flips, product_flips_opt].'; + +[y, Mz, u] = trajectories([thetas_opt.', pi/2*ones(N,1)], Ad_nom, Bd_nom, u_fun, TR, N); +Mxy = y(1:2,:); +end + + +function [y, x, u] = trajectories(thetas, Ad, Bd, u_fun, TR, N) + +n = size(Ad, 1); +x = zeros(n, N); + +% compute input and state trajectories +u = u_fun(TR*(1:N)); +x(:, 1) = Bd*u(1); +for k=1:N-1 + x(:, k+1) = Ad * diag(cos(thetas(k,1:n))) * x(:, k) + Bd * u(k+1); %because the third colomn is 90 degree pulses +end + +% concatenate state and input trajectories +y = sin(thetas').*[x; u]; + +end + + + diff --git a/RF_pulses/variable_flip_angles/optimal_SNR_demo.m b/RF_pulses/variable_flip_angles/optimal_SNR_demo.m new file mode 100755 index 0000000..63dd150 --- /dev/null +++ b/RF_pulses/variable_flip_angles/optimal_SNR_demo.m @@ -0,0 +1,109 @@ +clear all +clc + +fprintf('This scripts tests an approximate max lactate SNR flip schedule\n versus those derived using a full optimization solver\n') +fprintf('--------------------------\n') + + +% default parameters +N = 16; % number of pulses +TR = 3; % repetition time +kPL = 0.05; % conversion rate from pyruvate to lactate +R1P = 1/35; R1L = 1/30; % relaxation rates of pyruvate and lactate +Tinj = 10; %injection time + +% flip angle schedule for approximately maximum lactate SNR to be validated +fprintf('The approximate max lactate SNR flip schedule is generated by:\n') +fprintf(' vfa_opt_signal(N, exp(-TR * R1L ))\n\n') +fprintf('Note that the approximate maximum SNR lactate flip angles only depend on the TR and lactate T1\n') +fprintf('This is truly maximized with pyruvate flip angles of zero, so to detect pyruvate we choose a\n') +fprintf('T1-effective schedule to provide sufficient SNR as:\n') +fprintf(' vfa_const_amp(N, pi/2, exp(-TR * (R1P + kPL)))\n\n') + +flips_maxsnr = [vfa_const_amp(N, pi/2, exp(-TR * (R1P + kPL))); ... + vfa_opt_signal(N, exp(-TR * R1L ))]; + +%% test approximate max lactate SNR flip schedule using full optimization solver + +% R1P +fprintf('\nTest over various pyruvate relaxation rates:\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for R1P_new = [1/10, 1/30, 1/50] + flips_test = optimal_SNR_angles(N*TR,TR,kPL,[R1P_new, R1L],Tinj, flips_maxsnr(1,:)); + fprintf('\t\tT1pyurvate = %d s is %.4f degrees\n', 1/R1P_new, max(abs(flips_maxsnr(2,:) - flips_test(2,:)))*180/pi) +end + +% compare for different R1L +fprintf('\nTest over various lactate relaxation rates:\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for R1L_new = [1/10, 1/30, 1/50] + flips_maxsnr_new = [vfa_const_amp(N, pi/2, exp(-TR * (R1P + kPL))); ... + vfa_opt_signal(N, exp(-TR * R1L_new ))]; + + flips_test = optimal_SNR_angles(N*TR,TR,kPL,[R1P, R1L_new],Tinj, flips_maxsnr_new(1,:)); + fprintf('\t\tT1lactate = %d s is %.4f degrees\n', 1/R1L_new, max(abs(flips_maxsnr_new(2,:) - flips_test(2,:)))*180/pi) +end + +% kPL +fprintf('\nTest over various conversion rates:\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for kPL_new = [.01 .05 .1] + flips_test = optimal_SNR_angles(N*TR,TR,kPL_new,[R1P, R1L],Tinj, flips_maxsnr(1,:)); + fprintf('\t\tkPL = %.2f 1/s is %.4f degrees\n', kPL_new, max(abs(flips_maxsnr(2,:) - flips_test(2,:)))*180/pi) +end + +% compare for different TR +fprintf('\nTest over various TR:\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for TR_new = [1 3 6] + flips_maxsnr_new = [vfa_const_amp(N, pi/2, exp(-TR_new * (R1P + kPL))); ... + vfa_opt_signal(N, exp(-TR_new * R1L ))]; + + flips_test = optimal_SNR_angles(N*TR_new,TR_new,kPL,[R1P, R1L],Tinj, flips_maxsnr_new(1,:)); + fprintf('\t\tTR = %d s is %.4f degrees\n', TR_new, max(abs(flips_maxsnr_new(2,:) - flips_test(2,:)))*180/pi) +end + + +% substrate_flips +fprintf('\nTest over various pyruvate flip schedules (using T1-effective with range of T1eff):\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for R1eff_new = [-.05 0 .05] + flips_test = optimal_SNR_angles(N*TR,TR,kPL,[R1P, R1L],Tinj, vfa_const_amp(N, pi/2, exp(-TR * R1eff_new))); + fprintf('\t\tT1eff = %.2f s is %.4f degrees\n', 1/R1eff_new, max(abs(flips_maxsnr(2,:) - flips_test(2,:)))*180/pi) +end + +% compare for different N +fprintf('\nTest over various number of pulses:\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for N_new = [8 16 32] + flips_maxsnr_new = [vfa_const_amp(N_new, pi/2, exp(-TR * (R1P + kPL))); ... + vfa_opt_signal(N_new, exp(-TR * R1L ))]; + + flips_test = optimal_SNR_angles(N_new*TR,TR,kPL,[R1P, R1L],Tinj, flips_maxsnr_new(1,:)); + fprintf('\t\tN pulses = %d is %.4f degrees\n', N_new, max(abs(flips_maxsnr_new(2,:) - flips_test(2,:)))*180/pi) +end + +% Tinj +% This is similar to testing over different initial magnetizations (Minit) +% used in other code in this project +fprintf('\nTest over various injection durations:\n') +fprintf('\tmaximum difference between approximate solution and full optimization for\n') +for Tinj_new = [2 10 20] + flips_test = optimal_SNR_angles(N*TR,TR,kPL,[R1P, R1L],Tinj_new, flips_maxsnr(1,:)); + fprintf('\t\tTinj = %d s is %.4f degrees\n', Tinj_new, max(abs(flips_maxsnr(2,:) - flips_test(2,:)))*180/pi) +end + + +%% determine optimal SNR N and TR +% not finished yet + +T = [1:60]; +TR = [1:6]; +for IT = 1:length(T) + for ITR = 1:length(TR) + [flips, Mxy, Mz] = optimal_SNR_angles(T(IT), TR(ITR), kPL, [R1P R1L], Tinj, pi/100*ones(floor(T(IT)/TR(ITR)),1)); + S(IT, ITR) = sum(Mxy(2,:)) / sqrt(size(Mxy,2)); + end +end + +mesh(TR, T, S) \ No newline at end of file diff --git a/RF_pulses/variable_flip_angles/vfa_example_script.m b/RF_pulses/variable_flip_angles/vfa_example_script.m index a149334..d718019 100644 --- a/RF_pulses/variable_flip_angles/vfa_example_script.m +++ b/RF_pulses/variable_flip_angles/vfa_example_script.m @@ -2,42 +2,55 @@ % % Author: Peder E. Z. Larson % -% (c)2014 The Regents of the University of California. +% (c)2014-2015 The Regents of the University of California. % All Rights Reserved. %% example for pyruvate (substrate) and lactate (product) -N = 100; % number of pulses -TR = 0.3; % repetition time +N = 12; % number of pulses +TR = 3; % repetition time kPL = 0.05; % conversion rate from pyruvate to lactate -R1P = 1/35; R1L = 1/30; % relataxtion rates of pyruvate and lactate +R1P = 1/35; R1L = 1/30; % relaxation rates of pyruvate and lactate Minit = [1; 0.05]; % initial magnetization of Pyr, Lac +% flips_XXX - first row is pyruvate flip angles, second row is lactate flip +% angles + +% maximum lactate SNR scheme +% (invariant with pyruvate flip angles, so adjust as needed to get +% sufficient pyruvate SNR) +flips_maxsnr = [vfa_const_amp(N, pi/2, exp(-TR * (R1P + kPL))); ... + vfa_opt_signal(N, exp(-TR * R1L ))]; + % T1-effective scheme flips_t1eff = [vfa_const_amp(N, pi/2, exp(-TR * (R1P + kPL))); ... vfa_const_amp(N, pi/2, exp(-TR * (R1L - kPL)))]; % const-signal scheme - optimize for constant signal amplitude +% with the chosen parameters this is not realizable, but increasing N or +% the initial lactate magnetization, Minit(2), will result in a constant +% amplitude solution flips_constsignal = mvfa_const_amp(N, TR, kPL, [R1P R1L], Minit); +[Mxy_maxsnr, Mz_maxsnr] = simulate_2site_model(Minit, [R1P R1L], [kPL 0], flips_maxsnr, TR); [Mxy_t1eff, Mz_t1eff] = simulate_2site_model(Minit, [R1P R1L], [kPL 0], flips_t1eff, TR); [Mxy_constsignal, Mz_constsignal] = simulate_2site_model(Minit, [R1P R1L], [kPL 0], flips_constsignal, TR); t = [0:N-1] * TR; figure subplot(221) -plot(t, flips_t1eff(1,:)*180/pi, t, flips_constsignal(1,:)*180/pi) -title('Pyruvate'), legend('T1-effective', 'const-signal') +plot(t, flips_maxsnr(1,:)*180/pi,t, flips_t1eff(1,:)*180/pi, t, flips_constsignal(1,:)*180/pi) +title('Pyruvate'), legend('Max SNR', 'T1-effective', 'const-signal') xlabel('time (s)'), ylabel('flip angle (degrees)') subplot(222) -plot(t, flips_t1eff(2,:)*180/pi, t, flips_constsignal(2,:)*180/pi) +plot(t, flips_maxsnr(2,:)*180/pi,t, flips_t1eff(2,:)*180/pi, t, flips_constsignal(2,:)*180/pi) title('Lactate') xlabel('time (s)'), ylabel('flip angle (degrees)') subplot(223) -plot(t, Mxy_t1eff(1,:), t, Mxy_constsignal(1,:)) +plot(t, Mxy_maxsnr(1,:),t, Mxy_t1eff(1,:), t, Mxy_constsignal(1,:)) title('Pyruvate'), xlabel('time (s)'), ylabel('Simulated Signal') subplot(224) -plot(t, Mxy_t1eff(2,:), t, Mxy_constsignal(2,:)) +plot(t, Mxy_maxsnr(2,:),t, Mxy_t1eff(2,:), t, Mxy_constsignal(2,:)) title('Lactate') xlabel('time (s)'), ylabel('Simulated Signal') @@ -45,9 +58,9 @@ validate = 0; if validate - flips_t1effnew = flips_t1eff; flips_constsignalnew = flips_constsignal; + flips_maxsnrnew = flips_maxsnr; flips_t1effnew = flips_t1eff; flips_constsignalnew = flips_constsignal; load test_data/vfa_example_data - if max(abs(flips_t1effnew - flips_t1eff)) > eps | max(abs(flips_constsignalnew - flips_constsignal )) > eps + if max(abs(flips_maxsnrnew - flips_maxsnr)) > eps | max(abs(flips_t1effnew - flips_t1eff)) > eps | max(abs(flips_constsignalnew - flips_constsignal )) > eps error('Validation failed for variable flip angle example') else disp('Validation passed for variable flip angle example') From 4c803a2b52c1cda049aa8a95a147e2c37180fe0d Mon Sep 17 00:00:00 2001 From: agentmess Date: Wed, 25 Feb 2015 22:05:54 -0800 Subject: [PATCH 11/18] bug fixes, added some exploration of optimization Deeper dive into optimization of flip angles, still not complete --- .../variable_flip_angles/optimal_SNR_angles.m | 9 ++-- .../variable_flip_angles/optimal_SNR_demo.m | 50 +++++++++++++++---- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/RF_pulses/variable_flip_angles/optimal_SNR_angles.m b/RF_pulses/variable_flip_angles/optimal_SNR_angles.m index e9a6fed..e2901dd 100755 --- a/RF_pulses/variable_flip_angles/optimal_SNR_angles.m +++ b/RF_pulses/variable_flip_angles/optimal_SNR_angles.m @@ -44,18 +44,18 @@ % define number of acquisitions- N = max(floor(T/TR),1); -if nargin<7 || isempty(substrate_flips) +if nargin<6 || isempty(substrate_flips) % generate substrate flip angles substrate_flips = vfa_const_amp(N,pi/2,exp(-TR*(R1(1) + k(1)))); end -if nargin < 8 +if nargin < 7 dbg = 0; % don't print outputs end % define model parameters -syms R1P R1L kPL kTRANS t0 A0 sigma_1 sigma_2 sigma_3 alpha_1 beta_1 +syms R1P R1L kPL kTRANS t0 A0 alpha_1 beta_1 parameters_of_interest = [kPL kTRANS]; parameters_of_interest_nominal_values = [k(1) k(2)]; nuisance_parameters = [alpha_1 beta_1 A0]; @@ -216,9 +216,10 @@ % compute input and state trajectories u = u_fun(TR*(1:N)); + x(:, 1) = Bd*u(1); for k=1:N-1 - x(:, k+1) = Ad * diag(cos(thetas(k,1:n))) * x(:, k) + Bd * u(k+1); %because the third colomn is 90 degree pulses + x(:, k+1) = Ad * diag(cos(thetas(k,1:n))) * x(:, k) + Bd * u(k+1); end % concatenate state and input trajectories diff --git a/RF_pulses/variable_flip_angles/optimal_SNR_demo.m b/RF_pulses/variable_flip_angles/optimal_SNR_demo.m index 63dd150..1827f70 100755 --- a/RF_pulses/variable_flip_angles/optimal_SNR_demo.m +++ b/RF_pulses/variable_flip_angles/optimal_SNR_demo.m @@ -94,16 +94,48 @@ end -%% determine optimal SNR N and TR -% not finished yet - -T = [1:60]; -TR = [1:6]; +%% determine optimal SNR in free parameter dimensions +% based on above results, only remaining free parameters are: +% total time and TR +% and optimal results may depend on T1 of lactate. +% Below are some brute force simulations to try and solve amongst these +% free parameters. +% Not finished yet, no comparison across TR: +% (I think the error is due to scaling of input function in 'trajectories +% sub-function of optimal_SNR_angles - PEZL) + +clear S_noinj S_inj + +TR = 2; + +T = [10:2:60]; +R1L = 1./[15:5:40]; for IT = 1:length(T) - for ITR = 1:length(TR) - [flips, Mxy, Mz] = optimal_SNR_angles(T(IT), TR(ITR), kPL, [R1P R1L], Tinj, pi/100*ones(floor(T(IT)/TR(ITR)),1)); - S(IT, ITR) = sum(Mxy(2,:)) / sqrt(size(Mxy,2)); + for IR1L = 1:length(R1L) + % using negligible pyruvate flip angles + + % Tinj = 2 is like starting after injection + [flips, Mxy, Mz] = optimal_SNR_angles(T(IT), TR, kPL, [R1P R1L(IR1L)], 2, pi/100*ones(floor(T(IT)/TR),1)); + S_noinj(IT, IR1L) = sum(Mxy(2,:)) / sqrt(size(Mxy,2)); + + % Tinj = 10 is like a typical, 10-15 s injection time + [flips, Mxy, Mz] = optimal_SNR_angles(T(IT), TR, kPL, [R1P R1L(IR1L)], 10, pi/100*ones(floor(T(IT)/TR),1)); + S_inj(IT, IR1L) = sum(Mxy(2,:)) / sqrt(size(Mxy,2)); + end end -mesh(TR, T, S) \ No newline at end of file +figure +subplot(1,2,1) +mesh(1./R1L, T, S_noinj) +axis tight +xlabel('T_{1.lactate}'), ylabel('Total time'), zlabel('Total SNR') +title('Start after injection') +view([-65 12]) + +subplot(1,2,2) +mesh(1./R1L, T, S_inj) +axis tight +xlabel('T_{1.lactate}'), ylabel('Total time'), zlabel('Total SNR') +title('Start during injection') +view([-65 12]) From d94d5bf6372060ecd4fb689a328d4a53c2a3e196 Mon Sep 17 00:00:00 2001 From: agentmess Date: Thu, 9 Apr 2015 10:09:50 -0700 Subject: [PATCH 12/18] Added gradient scaling compensation function and rf_tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gradient scaling to compensate for effects of previous RF pulses rf_tools is a slightly modified version from John Pauly’s package (http://rsl.stanford.edu/research/software.html) --- .../gradient_scaling_slice_compensation.m | 112 ++++ RF_pulses/rf_tools/README | 46 ++ RF_pulses/rf_tools/ab2ex.m | 16 + RF_pulses/rf_tools/ab2inv.m | 16 + RF_pulses/rf_tools/ab2sat.m | 17 + RF_pulses/rf_tools/ab2se.m | 16 + RF_pulses/rf_tools/ab2st.m | 17 + RF_pulses/rf_tools/abr.m | 39 ++ RF_pulses/rf_tools/cplot.m | 16 + RF_pulses/rf_tools/csg.m | 72 +++ RF_pulses/rf_tools/csg2.m | 47 ++ RF_pulses/rf_tools/dimp.m | 10 + RF_pulses/rf_tools/dinf.m | 29 + RF_pulses/rf_tools/dz2d.m | 57 ++ RF_pulses/rf_tools/dzbeta.m | 63 ++ RF_pulses/rf_tools/dzepse.m | 57 ++ RF_pulses/rf_tools/dzlp.m | 19 + RF_pulses/rf_tools/dzls.m | 22 + RF_pulses/rf_tools/dzmp.m | 32 + RF_pulses/rf_tools/dzrf.m | 86 +++ RF_pulses/rf_tools/dzsr.m | 10 + RF_pulses/rf_tools/fftc.m | 26 + RF_pulses/rf_tools/fmp.m | 24 + RF_pulses/rf_tools/gt2cm.m | 19 + RF_pulses/rf_tools/iq2ap.m | 11 + RF_pulses/rf_tools/ktog.m | 4 + RF_pulses/rf_tools/ktos.m | 3 + RF_pulses/rf_tools/loadwave.m | 18 + RF_pulses/rf_tools/mag2mp.m | 33 + RF_pulses/rf_tools/mex5/abrx.c | 115 ++++ RF_pulses/rf_tools/mex5/b2a.c | 76 +++ RF_pulses/rf_tools/mex5/b2a.code.c | 108 ++++ RF_pulses/rf_tools/mex5/b2rf.c | 79 +++ RF_pulses/rf_tools/mex5/cabc2rf.c | 85 +++ RF_pulses/rf_tools/mex5/cabc2rf.code.c | 74 +++ RF_pulses/rf_tools/mex5/four1.c | 51 ++ RF_pulses/rf_tools/mex5/minpeakrf.c | 568 ++++++++++++++++++ RF_pulses/rf_tools/msinc.m | 15 + RF_pulses/rf_tools/remod.m | 10 + RF_pulses/rf_tools/rf_tools manual.pdf | Bin 0 -> 1833628 bytes RF_pulses/rf_tools/rfscale.m | 12 + RF_pulses/rf_tools/signa.m | 63 ++ RF_pulses/rf_tools/t2hz.m | 18 + RF_pulses/rf_tools/verse.m | 29 + RF_pulses/rf_tools/versec.m | 15 + RF_pulses/rf_tools/zpl.m | 22 + 46 files changed, 2277 insertions(+) create mode 100644 RF_pulses/gradient_scaling_slice_compensation.m create mode 100644 RF_pulses/rf_tools/README create mode 100644 RF_pulses/rf_tools/ab2ex.m create mode 100644 RF_pulses/rf_tools/ab2inv.m create mode 100644 RF_pulses/rf_tools/ab2sat.m create mode 100644 RF_pulses/rf_tools/ab2se.m create mode 100644 RF_pulses/rf_tools/ab2st.m create mode 100644 RF_pulses/rf_tools/abr.m create mode 100644 RF_pulses/rf_tools/cplot.m create mode 100644 RF_pulses/rf_tools/csg.m create mode 100644 RF_pulses/rf_tools/csg2.m create mode 100644 RF_pulses/rf_tools/dimp.m create mode 100644 RF_pulses/rf_tools/dinf.m create mode 100644 RF_pulses/rf_tools/dz2d.m create mode 100644 RF_pulses/rf_tools/dzbeta.m create mode 100644 RF_pulses/rf_tools/dzepse.m create mode 100644 RF_pulses/rf_tools/dzlp.m create mode 100644 RF_pulses/rf_tools/dzls.m create mode 100644 RF_pulses/rf_tools/dzmp.m create mode 100644 RF_pulses/rf_tools/dzrf.m create mode 100644 RF_pulses/rf_tools/dzsr.m create mode 100644 RF_pulses/rf_tools/fftc.m create mode 100644 RF_pulses/rf_tools/fmp.m create mode 100644 RF_pulses/rf_tools/gt2cm.m create mode 100644 RF_pulses/rf_tools/iq2ap.m create mode 100644 RF_pulses/rf_tools/ktog.m create mode 100644 RF_pulses/rf_tools/ktos.m create mode 100644 RF_pulses/rf_tools/loadwave.m create mode 100644 RF_pulses/rf_tools/mag2mp.m create mode 100644 RF_pulses/rf_tools/mex5/abrx.c create mode 100644 RF_pulses/rf_tools/mex5/b2a.c create mode 100644 RF_pulses/rf_tools/mex5/b2a.code.c create mode 100644 RF_pulses/rf_tools/mex5/b2rf.c create mode 100644 RF_pulses/rf_tools/mex5/cabc2rf.c create mode 100644 RF_pulses/rf_tools/mex5/cabc2rf.code.c create mode 100644 RF_pulses/rf_tools/mex5/four1.c create mode 100644 RF_pulses/rf_tools/mex5/minpeakrf.c create mode 100644 RF_pulses/rf_tools/msinc.m create mode 100644 RF_pulses/rf_tools/remod.m create mode 100644 RF_pulses/rf_tools/rf_tools manual.pdf create mode 100644 RF_pulses/rf_tools/rfscale.m create mode 100644 RF_pulses/rf_tools/signa.m create mode 100644 RF_pulses/rf_tools/t2hz.m create mode 100644 RF_pulses/rf_tools/verse.m create mode 100644 RF_pulses/rf_tools/versec.m create mode 100644 RF_pulses/rf_tools/zpl.m diff --git a/RF_pulses/gradient_scaling_slice_compensation.m b/RF_pulses/gradient_scaling_slice_compensation.m new file mode 100644 index 0000000..e697ca5 --- /dev/null +++ b/RF_pulses/gradient_scaling_slice_compensation.m @@ -0,0 +1,112 @@ +function [gscale, Mxy, Mz, S] = gradient_scaling_slice_compensation(rf, flips, g, fsim) +% [gscale, Mxy, Mz, S] = gradient_scaling_slice_compensation(rf, flips [, g, fsim]) +% OR +% [gscale, Mxy, Mz, S] = gradient_scaling_slice_compensation(rf, flips [, Nisodelay, fsim]) +% +% In a hyperpolarized experiment, the RF pulse slice profiles can become +% substantially distorted in the transition regions due to the uneven +% depletion of the hyperpolarized magnetization. +% +% This function implements a gradient compensation scheme for equalizing +% the summed slice signal across RF pulses with arbitrary flip angles. +% This method was proposed in: +% Deppe, M. H., Teh, K., Parra-Robles, J., Lee, K. J., and Wild, J. M. +% Slice profile effects in 2d slice-selective mri of hyperpolarized +% nuclei. J Magn Reson 202, 2 (Feb 2010), 180?9. +% Doi: 10.1016/j.jmr.2009.11.003 +% +% INPUTS: +% rf - RF pulse shape +% flips - flip angles (radians) +% g (optional) - gradient waveform +% OR +% Nisodelay (optional) - isodelay samples (e.g. is length(rf)/2 for linear +% phase pulses, such as sinc shapes) +% fsim (optional) - frequency offset of simulations +% +% OUTPUTS: +% gscale - gradient scaling factors +% Mxy, Mz - simulated slice profiles with scaling factors +% S - simulated total slice signal with scaling factors +% +% (c) 2013-2015 The Regents of the University of California +% All Rights Reserved. +% +% Originally written by: Peder E. Z. Larson + +Nrf = length(rf); +N = length(flips); + +if nargin < 3 || isempty(g) + g = [ones(Nrf,1); -round(Nrf/2)]; + rf = [rf(:);0]; Nrf = Nrf+1; +elseif length(g) == 1 + Nisodelay = g; + g = [ones(Nrf,1); -Nisodelay]; + rf = [rf(:);0]; Nrf = Nrf+1; +end + +if nargin < 4 + fsim = 0; +end + +g = g * 2*pi /sum(g(:)); + +Sflips = sin(flips) .*cumprod([1 cos(flips(1:end-1))]); + +for n = 1:N + rf_all(1:Nrf,n) = rf /sum(rf) * flips(n); % small-tip scaling +end +gscale(1) = 1; + +Nsim = 1000; +x = linspace(-2, 2, Nsim); + +[a b] = abr(rf_all(1:Nrf,1),gscale(1)*g, x, fsim); + +Mxy(1:Nsim,1) = 2*conj(a).*b; +Mz(1:Nsim,1) = 1 - 2*conj(b).*b; + +S1 = abs(sum(Mxy))/Nsim; + +maxIter = 1000; + +for n = 2:N + gscale(n) = gscale(n-1); + glim = [gscale(n-1), 10*gscale(n-1)]; + [a b] = abr(rf_all(1:Nrf,n),gscale(n)*g, x, fsim); + Mxy(1:Nsim,n) = 2*conj(a).*b .* Mz(1:Nsim, n-1); + Snew = abs(sum(Mxy(1:Nsim,n)))/Nsim; + Niter = 0; + while (abs(S1/Sflips(1) - Snew/Sflips(n)) > S1/Sflips(1)*1e-3) && ... + (Niter < maxIter) + if Snew/Sflips(n) > S1/Sflips(1) + % shrink slice + gold = gscale(n); + gscale(n) = mean(glim); + glim(1) = gold; + else + % slice too thin + gold = gscale(n); + gscale(n) = mean(glim); + glim(2) = gold; + end + [a b] = abr(rf_all(1:Nrf,n),gscale(n)*g, x, fsim); + Mxy(1:Nsim,n) = 2*conj(a).*b .* Mz(1:Nsim, n-1); + Snew = abs(sum(Mxy(1:Nsim,n)))/Nsim; + Niter = Niter + 1; + end + Mz(1:Nsim,n) = ( 1 - 2*conj(b).*b ) .* Mz(1:Nsim,n-1); +end + +figure +%subplot(211), plot(x, real(Mxy), x, imag(Mxy),'--'); +[xplot yplot] = meshgrid(1:N, x); +subplot(211) +mesh(xplot, yplot,abs(Mxy)), view([-70 20]) +xlabel('Pulse number'), ylabel('Slice profile'), zlabel('|M_{XY}|') +subplot(212) +mesh(xplot, yplot,abs(Mz)), view([-70 20]) +xlabel('Pulse number'), ylabel('Slice profile'), zlabel('M_Z') + +%pause diff --git a/RF_pulses/rf_tools/README b/RF_pulses/rf_tools/README new file mode 100644 index 0000000..0ef18e1 --- /dev/null +++ b/RF_pulses/rf_tools/README @@ -0,0 +1,46 @@ + This directory contains all the rf_tools matlab stuff. Put this in +your MATLABPATH environment variable + + setenv MATLABPATH /usr/local/wherever/rf_tools + +if that is where you put it. + + You need to compile the simulator, and various parts of the design +algorithm. These are the the "mexX" subdirectories, where X is 4 or 5 +depending on whether you are using matlab 4 or 5. + + If you are using matlab 4, cd to mex4, do a "make all", and copy the +.mexsol files back into this directory. + + If you are using matlab 5, run matlab, and cd to the mex5 directory. +If you are using the default compiler on your platform, then invoke + + mex abrx.c + mex b2rf.c + mex b2a.c + mex cabc2rf.c + +Then quit matlab, and copy the mex5/*.mexsol files into the rf_tools +directory. I use gcc under Solaris, in which case, use + + mex CC=gcc OPTFLAGS=-fPIC abrx.c + +instead. The -fPIC flag is important. Without it, things seem to +work, but fail occasionally for no apparent reason. Also, make sure +/usr/ccs/bin and the matlab5.1/bin directory are in your path, and +that you use the Sun make, as, and ld, and not the gnu version that +may be lurking elsewhere. + + There is documentation in man.ps, as well as online help for most +routines. + +New features for this release are support throughout for 2D RF pulses +including design, simulation and plotting. The routine dz2d designs +spiral 2D pulses. The spectral-spatial pulse design routine is new. +It does a true 2D SLR design, so it works fine for large flip angles. + +Let me know if if find any bugs, would like things to work differently, +or have anything you like to see added. + + -- John (pauly@mrsrl.stanford.edu) + diff --git a/RF_pulses/rf_tools/ab2ex.m b/RF_pulses/rf_tools/ab2ex.m new file mode 100644 index 0000000..0c949db --- /dev/null +++ b/RF_pulses/rf_tools/ab2ex.m @@ -0,0 +1,16 @@ +function mxy = ab2ex(a,b); + +% mxy = ab2ex(a,b) -- or -- mxy = ab2ex(ab) +% +% Computes the excitation profile 2*conj(a).b + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +if nargin == 1, + [m n] = size(a); + b = a(:,(n/2+1):n); + a = a(:,1:n/2); +end; + +mxy = 2*conj(a).*b; diff --git a/RF_pulses/rf_tools/ab2inv.m b/RF_pulses/rf_tools/ab2inv.m new file mode 100644 index 0000000..4b394e1 --- /dev/null +++ b/RF_pulses/rf_tools/ab2inv.m @@ -0,0 +1,16 @@ +% mz = ab2inv(a,b) -- or -- mz = ab2inv(ab) +% +% Computes the inversion profile 1-2*b.*conj(b) + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function mz = ab2inv(a,b); + +if nargin == 1, + [m n] = size(a); + b = a(:,(n/2+1):n); + a = a(:,1:n/2); +end; + +mz = 1-2*conj(b).*b; diff --git a/RF_pulses/rf_tools/ab2sat.m b/RF_pulses/rf_tools/ab2sat.m new file mode 100644 index 0000000..e13a802 --- /dev/null +++ b/RF_pulses/rf_tools/ab2sat.m @@ -0,0 +1,17 @@ +% mz = ab2sat(a,b) -- or -- mz = ab2sat(ab) +% +% Computes the saturation profile 1-2*b.*conj(b) + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function mz = ab2sat(a,b); + +if nargin == 1, + [m n] = size(a); + b = a(:,(n/2+1):n); + a = a(:,1:n/2); +end; + +mz = 1-2*conj(b).*b; + diff --git a/RF_pulses/rf_tools/ab2se.m b/RF_pulses/rf_tools/ab2se.m new file mode 100644 index 0000000..9a4f239 --- /dev/null +++ b/RF_pulses/rf_tools/ab2se.m @@ -0,0 +1,16 @@ +% mxy = ab2se(a,b) -- or -- mxy = ab2se(ab) +% +% Computes the spin-echo profile i*b.*b + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function mxy = ab2se(a,b); + +if nargin == 1, + [m n] = size(a); + b = a(:,(n/2+1):n); + a = a(:,1:n/2); +end + +mxy = i*b.*b; \ No newline at end of file diff --git a/RF_pulses/rf_tools/ab2st.m b/RF_pulses/rf_tools/ab2st.m new file mode 100644 index 0000000..81b4159 --- /dev/null +++ b/RF_pulses/rf_tools/ab2st.m @@ -0,0 +1,17 @@ +% mxy = ab2se(a,b) -- or -- mxy = ab2se(ab) +% +% Computes the "straight through" term a.*a + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function mxy = ab2st(a,b); + +if nargin == 2, + mxy = i*a.*a; +elseif nargin == 1, + mxy = i*a(:,1).*a(:,1); +else + ab2xx +end + diff --git a/RF_pulses/rf_tools/abr.m b/RF_pulses/rf_tools/abr.m new file mode 100644 index 0000000..15ffa94 --- /dev/null +++ b/RF_pulses/rf_tools/abr.m @@ -0,0 +1,39 @@ +% abr - compute the Cayley-Klein parameters for the rotation produced +% by an RF pulse. Uses Le Roux's convention on beta +% +% [a b] = abr(rf, x); +% a, b = Cayley-Klein paramters +% rf = n point rf waveform +% g = optional gradient waveform +% x = vectors of spatial positions to compute a and b. +% +% useful identities: +% mxy = 2*conj(a).*b); selective excitation +% mz = 1 - 2*b.*conj(b); inversion +% mxy = i(b.*b); spin echo profile +% + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function [a, b] = abr(rf, g, x, y) + +l = length(rf); + +if nargin == 2, + x = g; + g = ones(1,l)*2*pi/l; +end; + +if nargin == 4, + [a b] = abrx(rf, g, x, y); +elseif (nargin==2) || (nargin==3), + [a b] = abrx(rf, g, x); +end; + +b = -conj(b); +if nargout == 1, + a = [a b]; +end; + + diff --git a/RF_pulses/rf_tools/cplot.m b/RF_pulses/rf_tools/cplot.m new file mode 100644 index 0000000..c1cf1eb --- /dev/null +++ b/RF_pulses/rf_tools/cplot.m @@ -0,0 +1,16 @@ +% +% cplot(x) - plot complex function; +% + +% written by John Pauly, 1989 +% (c) Board of Trustees, Leland Stanford Junior University + +function cplot(x) + +l = length(x); +t = [1:l]/(l+1); +plot(t,real(x),t,imag(x)); + + + + diff --git a/RF_pulses/rf_tools/csg.m b/RF_pulses/rf_tools/csg.m new file mode 100644 index 0000000..27e966b --- /dev/null +++ b/RF_pulses/rf_tools/csg.m @@ -0,0 +1,72 @@ +% function [nk] = csg(k,mxg,mxs,[g0, gamma]) +% +% This routine takes a k-space trajectory and time warps it to +% meet gradient amplitude and slew rate constraints. +% +% Inputs: +% k -- k-space trajectory, scaled to cycles/cm +% mxg -- maximum gradient, G/cm +% mxs -- maximum slew rate, (G/cm)/ms +% g0 (optional) -- initial gradient strength, G/cm +% gamma (optional) -- kHz/G +% +% Outputs: +% nk -- new k-space trajectory meeting the constraints +% +% csg also reports the gradient duration required. +% + +% Written by John Pauly, 1993 +% +% Oct 4, 2004 modified to use 'spline' in interp1, now that it works in +% matlab 7 + +function [nk] = csg(k,mxg,mxs,g0,gamma) + +if nargin < 5 + gamma = 4.257; +end + +td = 1; +len = length(k); + +% compute initial gradient, slew rate +g = [diff(k)]/(gamma*(td/len)); +if nargin < 4 || isempty(g0) + g = [0 g]; +else + g = [g0 g]; +end +s = diff(g)/(td/len); +%s = [s s(end)]; + +% Compute slew rate limited trajectory +nk = k; + +for N = 1:5 +g = [diff(nk)]/(gamma*(td/len)); +if nargin < 4 || isempty(g0) + g = [0 g]; +else + g = [g0 g]; +end +s = diff(g)/(td/len); +ndts = sqrt(abs(s/mxs)); +nt = [0,cumsum(ndts)*td/len]; +%nk = csplinx(nt,k,[1:len]*nt(len)/len); +nk = interp1(nt,nk,[0:len-1]*nt(len)/(len-1),'spline'); +end + + +% Apply the additional gradient amplitude constraint +g = [0 diff(nk)]/(gamma*(nt(len)/len)); + +%ndtg = max(abs(g/mxg),1); +ndtg = max(abs(g),mxg); +nt = [0, cumsum(ndtg(1:end-1))*nt(len)/(mxg*len)]; +%nk = csplinx(nt,nk,[1:len]*nt(len)/len); +nk = interp1(nt,nk,[0:len-1]*nt(len)/(len-1),'spline'); + +% report the waveform length +disp(sprintf('Gradient duration is %6.3f ms',nt(len))); + diff --git a/RF_pulses/rf_tools/csg2.m b/RF_pulses/rf_tools/csg2.m new file mode 100644 index 0000000..368af11 --- /dev/null +++ b/RF_pulses/rf_tools/csg2.m @@ -0,0 +1,47 @@ +% function [nk] = csg(k,mxg,mxs) +% +% This routine takes a k-space trajectory and time warps it to +% meet gradient amplitude and slew rate constraints. +% +% Inputs: +% k -- k-space trajectory, scaled to cycles/cm +% mxg -- maximum gradient, G/cm +% mxs -- maximum slew rate, (G/cm)/ms +% +% Outputs: +% nk -- new k-space trajectory meeting the constraints +% +% csg also reports the gradient duration required. +% + +% Written by John Pauly, 1993 + +function [nk] = csg(k,mxg,mxs) + +td = 1; +len = length(k); + +g0 = k(2)-k(1); +g1 = k(3)-k(2); +s0 = g1 - g0; +gm1 = g0-s0; + +% compute initial gradient, slew rate +g = [gm1 diff(k)]/(4.26*(td/len)); +s = diff(g)/(td/len); +s = [s(1) s]; + +% Compute slew rate limited trajectory +ndts = sqrt(abs(s/mxs)); +nt = cumsum(ndts)*td/len; +nk = csplinx(nt,k,[1:len]*nt(len)/len); + +% Apply the additional gradient amplitude constraint +g = [0 diff(nk)]/(4.26*(nt(len)/len)); +ndtg = max(abs(g),mxg); +nt = cumsum(ndtg)*nt(len)/(mxg*len); +nk = csplinx(nt,nk,[1:len]*nt(len)/len); + +% report the waveform length +disp(sprintf('Gradient duration is %6.3f ms',nt(len))); + diff --git a/RF_pulses/rf_tools/dimp.m b/RF_pulses/rf_tools/dimp.m new file mode 100644 index 0000000..f3b02c6 --- /dev/null +++ b/RF_pulses/rf_tools/dimp.m @@ -0,0 +1,10 @@ +% dimp -- calculate D infinity for a minimum phase filter + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function d=dimp(d1,d2) + +d = 0.5*dinf(2*d1,0.5*d2.*d2); + + diff --git a/RF_pulses/rf_tools/dinf.m b/RF_pulses/rf_tools/dinf.m new file mode 100644 index 0000000..edc7a61 --- /dev/null +++ b/RF_pulses/rf_tools/dinf.m @@ -0,0 +1,29 @@ +% dinf -- calculate D infinity for a linear phase filter + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function d = dinf(d1,d2) + +a1 = 5.309e-3; +a2 = 7.114e-2; +a3 = -4.761e-1; +a4 = -2.66e-3; +a5 = -5.941e-1; +a6 = -4.278e-1; + +l10d1 = log10(d1); +l10d2 = log10(d2); + +[m1 n1] = size(l10d1); +if (m1 +#include +#include +#include "mex.h" + +#define RF prhs[0] /* complex rf */ +#define GC prhs[1] /* complex gradient */ +#define X prhs[2] /* x samples */ +#define Y prhs[3] /* y samples */ + +#define ALF plhs[0] /* 2D grid of alpha's */ +#define BET plhs[1] /* 2D grid of alpha's */ + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) + +double *rfi, *rfq, *gx, *gy, x, y, *alpr, *alpi, *btpr, *btpi, *xp, *yp; +int ns; +char s[80]; +void abrot(double a[2], double b[2]); + +void mexFunction(int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int nx, ny, ix, iy; + double alf[2], bet[2]; + + if ((nrhs < 3) || (nrhs > 4) || (nlhs != 2)) + mexErrMsgTxt("Usage: [alpha, beta] = abrx(rf, g, x {, y})"); + + ns = max(mxGetN(RF),mxGetM(RF)); + if (ns != max(mxGetN(GC),mxGetM(GC))) + mexErrMsgTxt("rf and gradient vectors are of different lengths"); + +/* mexErrMsgTxt(sprintf(s,"ns=%d",ns)); */ + + gx = mxGetPr(GC); + if (nrhs==4) gy = mxGetPi(GC); + rfi = mxGetPr(RF); rfq = mxGetPi(RF); + + nx = max(mxGetN(X),mxGetM(X)); + if (nrhs==4) + ny = max(mxGetN(Y),mxGetM(Y)); + else + ny = 1; + + ALF = mxCreateDoubleMatrix(nx,ny,mxCOMPLEX); + alpr = mxGetPr(ALF); alpi = mxGetPi(ALF); + BET = mxCreateDoubleMatrix(nx,ny,mxCOMPLEX); + btpr = mxGetPr(BET); btpi = mxGetPi(BET); + + if (nrhs==4) yp = mxGetPr(Y); + xp = mxGetPr(X); + + for (iy=0; iy0.0) { + nx = cpr/phi; ny = cpi/phi; nz = cg/phi; + } else { + nx = 0.0; ny = 0.0; nz = 1.0; /* doesn't matter, phi=0*/ + } + csp = cos(phi/2); snp = sin(phi/2); + al[0] = csp; al[1] = nz*snp; + be[0] = ny*snp; be[1] = nx*snp; + + bp[0] = al[0]*b[0]-al[1]*b[1]+be[0]*a[0]-be[1]*(-a[1]); + bp[1] = al[0]*b[1]+al[1]*b[0]+be[1]*a[0]+be[0]*(-a[1]); + + ap[0] = -( be[0] *b[0]-(-be[1])*b[1]) + + al[0] *a[0]-(-al[1])*(-a[1]); + ap[1] = -(-(-(be[1])*b[0]+ be[0] *b[1]) + + (-al[1])*a[0]+ al[0] *(-a[1])); + + a[0] = ap[0]; a[1] = ap[1]; b[0] = bp[0]; b[1] = bp[1]; + } + + return; +} diff --git a/RF_pulses/rf_tools/mex5/b2a.c b/RF_pulses/rf_tools/mex5/b2a.c new file mode 100644 index 0000000..9fb17d3 --- /dev/null +++ b/RF_pulses/rf_tools/mex5/b2a.c @@ -0,0 +1,76 @@ +/* + * [rf] = b2rf (b) + * + * C program version of b2rf. + * + * Mex driver for subroutine. + * Gets complex rf from complex polynomial b. + * + * Written by Adam Kerr, October 1992 + * Modified from John Pauly's code. + * (c) Board of Trustees, Leland Stanford Junior University + */ + +#include +#include +#include "mex.h" + +#define MAXN (1024) + +#define max(a,b) ((a)>(b) ? (a) : (b)) + +/* driver for matlab call */ + +#define B prhs[0] /* alpha polynomial */ +#define A plhs[0] /* RF pulse */ +void b2a(double *b, int n, double *a); +void cabc2rf(double *a, double *b, int n, double *rf); +double a[MAXN*2], b[MAXN*2]; +double rf[MAXN*2]; + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + double *bpr, *bpi, *ar, *ai; + int n; + int i, j; + + if ((nrhs != 1) || (nlhs != 1)) + mexErrMsgTxt("Usage: [rf] = b2rf (b)"); + + n = max (mxGetN(B), mxGetM(B)); + if (n > MAXN) + mexErrMsgTxt("beta polynomial too long"); + + /* copy b into array */ + bpr = mxGetPr(B); + bpi = mxGetPi(B); + if (bpi != NULL) + for (i=0; i + +#define ZEROPAD (16) +#define MAXN (1024 * ZEROPAD) +#define MP (0.0000001) + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define magsqr(a,j) (a[2*j]*a[2*j] + a[2*j+1]*a[2*j+1]) +void four1(double bf[], int nnc, int fwd); +double bf[MAXN*2], am[MAXN*2], af[MAXN*2]; + +void b2a(double *b, int n, double *a) +{ + double bmx, bm, p; + int i, j, nn, nnc; + char s[80]; + + /* next bigger power of 2 */ + for (nn=1; nn<=n; nn*=2); + nn *=2; + /*nn = (int) (exp(log(2)*ceil(log((double)n)/log(2))))+1;*/ + + /* size of arrays used for computation */ + nnc = nn*ZEROPAD; + + for (i=0; i bmx) + bmx = bm; + } + if (bmx >= 1.0) + for (i=0; i +#include +#include "mex.h" + +#define MAXN (1024) + +#define max(a,b) ((a)>(b) ? (a) : (b)) + +/* driver for matlab call */ + +#define B prhs[0] /* alpha polynomial */ +#define RF plhs[0] /* RF pulse */ +void b2a(double *b, int n, double *a); +void cabc2rf(double *a, double *b, int n, double *rf); +double a[MAXN*2], b[MAXN*2]; +double rf[MAXN*2]; + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + double *bpr, *bpi, *rfr, *rfi; + int n; + int i, j; + + if ((nrhs != 1) || (nlhs != 1)) + mexErrMsgTxt("Usage: [rf] = b2rf (b)"); + + n = max (mxGetN(B), mxGetM(B)); + if (n > MAXN) + mexErrMsgTxt("beta polynomial too long"); + + /* copy b into array */ + bpr = mxGetPr(B); + bpi = mxGetPi(B); + if (bpi != NULL) + for (i=0; i +#include +#include "mex.h" + +#define MAXN (4096) + +#define max(a,b) ((a)>(b) ? (a) : (b)) + +/* driver for matlab call */ + +#define A prhs[0] /* alpha, beta polynomials */ +#define B prhs[1] + +#define RF plhs[0] /* RF out - complex */ + +void cabc2rf( double *a, double *b, int n, double *rf); + +double a[MAXN*2], b[MAXN*2], rf[MAXN*2]; + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + double *ar, *ai, *br, *bi, *rfr, *rfi; + + int n; + int i, j; + + if ((nrhs != 2) || (nlhs != 1)) + mexErrMsgTxt("Usage: [rf] = cabc2rf (a,b)"); + + n = max (mxGetN(A), mxGetM(A)); + if (n > MAXN) + mexErrMsgTxt ("alpha polynomial too long"); + + if (max (mxGetN(B), mxGetM(B)) != n) + mexErrMsgTxt ("alpha, beta polynomials MUST be same length"); + + /* copy a, b into arrays */ + ar = mxGetPr(A); ai = mxGetPi(A); + br = mxGetPr(B); bi = mxGetPi(B); + for (i=0; i + +#define MAXN (1024) + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define mag(a,j) (sqrt (a[(j)*2]*a[(j)*2]+a[(j)*2+1]*a[(j)*2+1])) +#define re_div(a,i,b,j) ((a[i*2]*b[j*2] + a[i*2+1]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) +#define im_div(a,i,b,j) ((a[i*2+1]*b[j*2] - a[i*2]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) +double a2[MAXN*2], b2[MAXN*2]; + + +void cabc2rf(double a[], double b[], int n, double rf[]) +{ + int i, j; + double sj[2], cj; + double phi, theta; /* use definitions from SLR paper, somewhat + different from those in John's abc2rf() */ + + for (j=n-1; j>=0; j--) + { + /* get real cj and complex sj now */ + cj = sqrt (1 / (1 + (b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])/ + (a[j*2]*a[j*2] + a[j*2+1]*a[j*2+1]) )); + sj[0] = re_div (b,j,a,j) * cj; + sj[1] = -im_div (b,j,a,j) * cj; + + /* get phi and theta now */ + phi = 2 * atan2 (mag(sj,0), cj); + theta = atan2 (sj[1],sj[0]); + + /* get rf now from phi and theta */ + rf[j*2] = phi * cos (theta); + rf[j*2+1] = phi * sin (theta); + + /* create new polynomials now */ + for (i=0; i<=j; i++) + { + a2[i*2] = cj * a[i*2] + sj[0] * b[i*2] - sj[1] * b[i*2+1]; + a2[i*2+1] = cj * a[i*2+1] + sj[0] * b[i*2+1] + sj[1] * b[i*2]; + b2[i*2] = -sj[0] * a[i*2] - sj[1] * a[i*2+1] + cj * b[i*2]; + b2[i*2+1] = -sj[0] * a[i*2+1] + sj[1] * a[i*2] + cj * b[i*2+1]; + } + + /* copy back into old polynomials now */ + /* try other way + for (i=0; i<=j-1; i++) + { + a[i*2] = a2[i*2+2]; + a[i*2+1] = a2[i*2+3]; + b[i*2] = b2[i*2]; + b[i*2+1] = b2[i*2+1]; + } */ + for (i=0; i<=2*j-1; i++) + { + a[i] = a2[i+2]; + b[i] = b2[i]; + } + } +} + diff --git a/RF_pulses/rf_tools/mex5/four1.c b/RF_pulses/rf_tools/mex5/four1.c new file mode 100644 index 0000000..330e7b0 --- /dev/null +++ b/RF_pulses/rf_tools/mex5/four1.c @@ -0,0 +1,51 @@ +#include + +#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr + +void four1(double data[], int nn, int isign) +{ + int n,mmax,m,j,istep,i; + double wtemp,wr,wpr,wpi,wi,theta; + double tempr,tempi; + + n=nn << 1; + j=1; + for (i=1;i i) { + SWAP(data[j],data[i]); + SWAP(data[j+1],data[i+1]); + } + m=n >> 1; + while (m >= 2 && j > m) { + j -= m; + m >>= 1; + } + j += m; + } + mmax=2; + while (n > mmax) { + istep=2*mmax; + theta=6.28318530717959/(isign*mmax); + wtemp=sin(0.5*theta); + wpr = -2.0*wtemp*wtemp; + wpi=sin(theta); + wr=1.0; + wi=0.0; + for (m=1;m +#include +#include +#define MAXN 1024 + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define mag(a,j) (hypot (a[(j)*2], a[(j)*2+1])) + +/* driver for matlab call */ + +#define Z prhs[0] /* complex z roots */ +#define FLIP prhs[1] /* indices of roots to flip */ +#define BSF prhs[2] /* scaling factor for beta polynomial */ + +#define ZMIN plhs[0] /* complex roots */ + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + double z[MAXN*2], z0[MAXN*2]; + double zmin[MAXN*2], *zpi, *zpr, *flp; + int sflip[MAXN]; + int cflip[MAXN*2]; + int nflip, nroots; + int nsflip, ncflip; + double bsf; + int i, j; + int ncomb; + double start_peakrf; + double min_peakrf, peakrf; + int min_index; + int bittest; + int r; + int r1, r2; + double z2peakrf(); + void b2a(); + + if ((nrhs != 3) || (nlhs != 1)) + mexErrMsgTxt ("Usage: [zmin] = minpeakrf (z, flip, bsf)"); + + nroots = max (mxGetN(Z), mxGetM(Z)); + if (nroots+1 > MAXN) + mexErrMsgTxt ("z vector too long"); + + nflip = mxGetM(FLIP); + + bsf = mxGetPr(BSF)[0]; + if ((bsf < 0) || (bsf > 1.0)) + mexErrMsgTxt ("bsf not in 0..1"); + + /* copy z into c array */ + zpr = mxGetPr(Z); + zpi = mxGetPi(Z); + for (i=0; i + +#define ZEROPAD (8) +#define MAXNP (1024 * ZEROPAD) +#define MP (0.0000001) + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define magsqr(a,j) (a[2*j]*a[2*j] + a[2*j+1]*a[2*j+1]) +void four1(double bf[], int nnc, int fwd); +double bf[MAXNP*2], am[MAXNP*2], af[MAXNP*2]; + +void b2a(double *b, int n, double *a) +{ + double bmx, bm, p; + int i, j, nn, nnc; + + /* next bigger power of 2 */ + nn = (int) (exp(log(2)*ceil(log((double)n)/log(2))))+1; + + /* size of arrays used for computation */ + nnc = nn*ZEROPAD; + + for (i=0; i bmx) + bmx = bm; + } + if (bmx >= 1.0) + for (i=0; i + +#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr + +void four1(double data[], int nn, int isign) +{ + int n,mmax,m,j,istep,i; + double wtemp,wr,wpr,wpi,wi,theta; + double tempr,tempi; + + n=nn << 1; + j=1; + for (i=1;i i) { + SWAP(data[j],data[i]); + SWAP(data[j+1],data[i+1]); + } + m=n >> 1; + while (m >= 2 && j > m) { + j -= m; + m >>= 1; + } + j += m; + } + mmax=2; + while (n > mmax) { + istep=2*mmax; + theta=6.28318530717959/(isign*mmax); + wtemp=sin(0.5*theta); + wpr = -2.0*wtemp*wtemp; + wpi=sin(theta); + wr=1.0; + wi=0.0; + for (m=1;m + +/*define MAXN (1024)*/ + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define mag(a,j) (hypot (a[(j)*2], a[(j)*2+1])) +#define re_mult(a1,b1,a2,b2) ((a1)*(a2) - (b1)*(b2)) +#define im_mult(a1,b1,a2,b2) ((a1)*(b2) + (a2)*(b1)) + +npoly (z, n, b) +double z[], b[]; +int n; +{ + int i; + int nn; + double bf[MAXN*2]; + double bfmax, bfmag; + + b[0] = 1; /* b[0] = 1 + i0 */ + b[1] = 0; + for (i=0; i0; i--) + { + p[(i*2)] += re_mult(p[(i-1)*2], p[(i-1)*2+1],a, b); + p[(i*2)+1] += im_mult(p[(i-1)*2], p[(i-1)*2+1], a, b); + } +} + + +/* + * cabc2rf (a, b, n, rf) + * + * C program version of cabc2rf. + * + * Performs inverse SLR tranform on complex a,b to give complex rf pulse + * + * + * Written by Adam Kerr, October 1992 + * Modified from John Pauly's code. + * (c) Board of Trustees, Leland Stanford Junior University + */ + +#include + +/*define MAXN (1024)*/ + +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define mag(a,j) (sqrt (a[(j)*2]*a[(j)*2]+a[(j)*2+1]*a[(j)*2+1])) +#define re_div(a,i,b,j) ((a[i*2]*b[j*2] + a[i*2+1]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) +#define im_div(a,i,b,j) ((a[i*2+1]*b[j*2] - a[i*2]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) +double a2[MAXN*2], b2[MAXN*2]; + + +void cabc2rf(double a[], double b[], int n, double rf[]) +{ + int i, j; + double sj[2], cj; + double phi, theta; /* use definitions from SLR paper, somewhat + different from those in John's abc2rf() */ + + for (j=n-1; j>=0; j--) + { + /* get real cj and complex sj now */ + cj = sqrt (1 / (1 + (b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])/ + (a[j*2]*a[j*2] + a[j*2+1]*a[j*2+1]) )); + sj[0] = re_div (b,j,a,j) * cj; + sj[1] = -im_div (b,j,a,j) * cj; + + /* get phi and theta now */ + phi = 2 * atan2 (mag(sj,0), cj); + theta = atan2 (sj[1],sj[0]); + + /* get rf now from phi and theta */ + rf[j*2] = phi * cos (theta); + rf[j*2+1] = phi * sin (theta); + + /* create new polynomials now */ + for (i=0; i<=j; i++) + { + a2[i*2] = cj * a[i*2] + sj[0] * b[i*2] - sj[1] * b[i*2+1]; + a2[i*2+1] = cj * a[i*2+1] + sj[0] * b[i*2+1] + sj[1] * b[i*2]; + b2[i*2] = -sj[0] * a[i*2] - sj[1] * a[i*2+1] + cj * b[i*2]; + b2[i*2+1] = -sj[0] * a[i*2+1] + sj[1] * a[i*2] + cj * b[i*2+1]; + } + + /* copy back into old polynomials now */ + /* try other way + for (i=0; i<=j-1; i++) + { + a[i*2] = a2[i*2+2]; + a[i*2+1] = a2[i*2+3]; + b[i*2] = b2[i*2]; + b[i*2+1] = b2[i*2+1]; + } */ + for (i=0; i<=2*j-1; i++) + { + a[i] = a2[i+2]; + b[i] = b2[i]; + } + } +} + diff --git a/RF_pulses/rf_tools/msinc.m b/RF_pulses/rf_tools/msinc.m new file mode 100644 index 0000000..28fc66c --- /dev/null +++ b/RF_pulses/rf_tools/msinc.m @@ -0,0 +1,15 @@ +% h = msinc(n,m) +% +% Returns a hamming windowed sinc of length n, with m sinc-cycles, +% which means a time-bandwidth of 4*m +% + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function ms = msinc(n,m) + +x = [-n/2:(n-1)/2]/(n/2); +snc = sin(m*2*pi*x+0.00001)./(m*2*pi*x+0.00001); +ms = snc.*(0.54+0.46*cos(pi*x)); +ms = ms*4*m/(n); diff --git a/RF_pulses/rf_tools/remod.m b/RF_pulses/rf_tools/remod.m new file mode 100644 index 0000000..d0773b0 --- /dev/null +++ b/RF_pulses/rf_tools/remod.m @@ -0,0 +1,10 @@ +function rfn = remod(rf,t,n,f); + +nc = t*f; +lrf = length(rf); + +w = [0:lrf-1]/lrf; +wi = (floor(w*n)+0.5)/n; + +rfn = rf.*exp(i*2*pi*w*nc).*exp(-i*2*pi*wi*nc); + diff --git a/RF_pulses/rf_tools/rf_tools manual.pdf b/RF_pulses/rf_tools/rf_tools manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b872b50edee80907639251fd72a7a54acf21831e GIT binary patch literal 1833628 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

m~`7RNoW6t_Xl6(9G~4h>E2&6 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 a@Mdk_tRH@|k$M!b>lK-Tj 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

C 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 %f~a(Kb#$sNo32SI4YbBDWmXo5G6 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 =Dsn*u`@M2M-Ar;L$Z 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
c4ubL;T{j!yzDh~h@a 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 literal 0 HcmV?d00001 diff --git a/RF_pulses/rf_tools/rfscale.m b/RF_pulses/rf_tools/rfscale.m new file mode 100644 index 0000000..b9bfdd2 --- /dev/null +++ b/RF_pulses/rf_tools/rfscale.m @@ -0,0 +1,12 @@ +function rfs = rfscale(rf,t) + +% takes an RF waveform and scales it to kHz if played for time +% t (ms). Signa can handle at most 1 kHz. 700 Hz is better, +% and 500 Hz seems to be what product psd's use. + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +rfs = rf*length(rf)/(2*pi*t); + + diff --git a/RF_pulses/rf_tools/signa.m b/RF_pulses/rf_tools/signa.m new file mode 100644 index 0000000..483eb52 --- /dev/null +++ b/RF_pulses/rf_tools/signa.m @@ -0,0 +1,63 @@ +function signa(wav,fn,s) + +% +% signa(waveform, filename [,scale]); +% +% writes the waveform out as short integers with the low +% bit masked off. +% +% Inputs: +% waveform -- vector, may be complex +% filename -- string, if wavefrom is complex '.r' and '.i' are appended, +% and two files are written. +% scale -- optional scale. If unspecified, the waveform is scaled to +% full scale integer 32766. If specified, the output is +% waveform*scale*32766 +% + +% +% Written by John Pauly, Dec. 5, 1994 +% (c) Leland Stanford Jr. University +% + +wmax = hex2dec('7ffe'); + +% if no scale is specified, use as much dynamic range as possible +if nargin == 2, + s = 1/max(max(abs(real(wav)),abs(imag(wav)))); +end; + +% scale up to fit in a short integer +wav = wav*s*wmax; + +% mask off low bit, since it would be an EOS otherwise +wav = 2*round(wav/2); + +% if the imaginary component is zero, supress it +if sum(abs(imag(wav))) == 0, + wav = real(wav); +end; + +if isreal(wav), + fip = fopen(fn,'wb','b'); + if fip == -1, + disp(sprintf('Error opening %s for write',fn)); + return; + end; + fwrite(fip,wav,'short'); +else + fip = fopen([fn,'.r'],'wb','b'); + if fip == -1, + disp(sprintf('Error opening %s for write',[fn,'.r'])); + return; + end; + fwrite(fip,real(wav),'short'); + fclose(fip); + fip = fopen([fn,'.i'],'wb','b'); + if fip == -1, + disp(sprintf('Error opening %s for write',[fn,'.i'])); + return; + end; + fwrite(fip,imag(wav),'short'); + fclose(fip); +end; diff --git a/RF_pulses/rf_tools/t2hz.m b/RF_pulses/rf_tools/t2hz.m new file mode 100644 index 0000000..64a3de8 --- /dev/null +++ b/RF_pulses/rf_tools/t2hz.m @@ -0,0 +1,18 @@ +% +% Takes dimensionless x used by abr, and scales it to kHz based +% on pulse duration t (ms), using a particularly mysterious algorithm. +% +% fs = t2hz(x,t) +% +% x -- normalized frequency x vector used by abr +% t -- pulse duration in ms +% +% fs -- scaled frequency axis, in kHz +% + +% written by John Pauly, 1992 +% (c) Board of Trustees, Leland Stanford Junior University + +function fs = t2hz(x,t) + +fs = x/t; diff --git a/RF_pulses/rf_tools/verse.m b/RF_pulses/rf_tools/verse.m new file mode 100644 index 0000000..63ed6db --- /dev/null +++ b/RF_pulses/rf_tools/verse.m @@ -0,0 +1,29 @@ +% rfv = verse(gv,rf) +% +% Computes the versed version of rf for a given time-vayring gradient gv +% +% written by John Pauly, 1992 +% Bug fixes by Peder Larson, 2007 +% (c) Board of Trustees, Leland Stanford Junior University + +function rfv = verse(g,rf) + +[m n] = size(g); +if m Date: Thu, 19 Nov 2015 16:32:35 -0800 Subject: [PATCH 13/18] renamed mex directory --- RF_pulses/rf_tools/{mex5 => mex files}/abrx.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/b2a.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/b2a.code.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/b2rf.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/cabc2rf.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/cabc2rf.code.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/four1.c | 0 RF_pulses/rf_tools/{mex5 => mex files}/minpeakrf.c | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename RF_pulses/rf_tools/{mex5 => mex files}/abrx.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/b2a.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/b2a.code.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/b2rf.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/cabc2rf.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/cabc2rf.code.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/four1.c (100%) rename RF_pulses/rf_tools/{mex5 => mex files}/minpeakrf.c (100%) diff --git a/RF_pulses/rf_tools/mex5/abrx.c b/RF_pulses/rf_tools/mex files/abrx.c similarity index 100% rename from RF_pulses/rf_tools/mex5/abrx.c rename to RF_pulses/rf_tools/mex files/abrx.c diff --git a/RF_pulses/rf_tools/mex5/b2a.c b/RF_pulses/rf_tools/mex files/b2a.c similarity index 100% rename from RF_pulses/rf_tools/mex5/b2a.c rename to RF_pulses/rf_tools/mex files/b2a.c diff --git a/RF_pulses/rf_tools/mex5/b2a.code.c b/RF_pulses/rf_tools/mex files/b2a.code.c similarity index 100% rename from RF_pulses/rf_tools/mex5/b2a.code.c rename to RF_pulses/rf_tools/mex files/b2a.code.c diff --git a/RF_pulses/rf_tools/mex5/b2rf.c b/RF_pulses/rf_tools/mex files/b2rf.c similarity index 100% rename from RF_pulses/rf_tools/mex5/b2rf.c rename to RF_pulses/rf_tools/mex files/b2rf.c diff --git a/RF_pulses/rf_tools/mex5/cabc2rf.c b/RF_pulses/rf_tools/mex files/cabc2rf.c similarity index 100% rename from RF_pulses/rf_tools/mex5/cabc2rf.c rename to RF_pulses/rf_tools/mex files/cabc2rf.c diff --git a/RF_pulses/rf_tools/mex5/cabc2rf.code.c b/RF_pulses/rf_tools/mex files/cabc2rf.code.c similarity index 100% rename from RF_pulses/rf_tools/mex5/cabc2rf.code.c rename to RF_pulses/rf_tools/mex files/cabc2rf.code.c diff --git a/RF_pulses/rf_tools/mex5/four1.c b/RF_pulses/rf_tools/mex files/four1.c similarity index 100% rename from RF_pulses/rf_tools/mex5/four1.c rename to RF_pulses/rf_tools/mex files/four1.c diff --git a/RF_pulses/rf_tools/mex5/minpeakrf.c b/RF_pulses/rf_tools/mex files/minpeakrf.c similarity index 100% rename from RF_pulses/rf_tools/mex5/minpeakrf.c rename to RF_pulses/rf_tools/mex files/minpeakrf.c From 88984ee3e2de2855131578b824e90962021b5d2e Mon Sep 17 00:00:00 2001 From: agentmess Date: Tue, 1 Dec 2015 09:21:54 -0800 Subject: [PATCH 14/18] Removing Spectral Spatial from toolbox (moved into its own repo) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removing the spectral-spatial RF code, since this is now being stored in its own repository (agentmess/Spectral-Spatial-RF-Pulse-Design) Next idea is to try and add it in as a subtree… updating readme --- README.md | 17 +- RF_pulses/rf_tools/README | 46 -- RF_pulses/rf_tools/ab2ex.m | 16 - RF_pulses/rf_tools/ab2inv.m | 16 - RF_pulses/rf_tools/ab2sat.m | 17 - RF_pulses/rf_tools/ab2se.m | 16 - RF_pulses/rf_tools/ab2st.m | 17 - RF_pulses/rf_tools/abr.m | 39 -- RF_pulses/rf_tools/cplot.m | 16 - RF_pulses/rf_tools/csg.m | 72 --- RF_pulses/rf_tools/csg2.m | 47 -- RF_pulses/rf_tools/dimp.m | 10 - RF_pulses/rf_tools/dinf.m | 29 - RF_pulses/rf_tools/dz2d.m | 57 -- RF_pulses/rf_tools/dzbeta.m | 63 -- RF_pulses/rf_tools/dzepse.m | 57 -- RF_pulses/rf_tools/dzlp.m | 19 - RF_pulses/rf_tools/dzls.m | 22 - RF_pulses/rf_tools/dzmp.m | 32 - RF_pulses/rf_tools/dzrf.m | 86 --- RF_pulses/rf_tools/dzsr.m | 10 - RF_pulses/rf_tools/fftc.m | 26 - RF_pulses/rf_tools/fmp.m | 24 - RF_pulses/rf_tools/gt2cm.m | 19 - RF_pulses/rf_tools/iq2ap.m | 11 - RF_pulses/rf_tools/ktog.m | 4 - RF_pulses/rf_tools/ktos.m | 3 - RF_pulses/rf_tools/loadwave.m | 18 - RF_pulses/rf_tools/mag2mp.m | 33 - RF_pulses/rf_tools/mex files/abrx.c | 115 ---- RF_pulses/rf_tools/mex files/b2a.c | 76 --- RF_pulses/rf_tools/mex files/b2a.code.c | 108 ---- RF_pulses/rf_tools/mex files/b2rf.c | 79 --- RF_pulses/rf_tools/mex files/cabc2rf.c | 85 --- RF_pulses/rf_tools/mex files/cabc2rf.code.c | 74 --- RF_pulses/rf_tools/mex files/four1.c | 51 -- RF_pulses/rf_tools/mex files/minpeakrf.c | 568 ------------------ RF_pulses/rf_tools/msinc.m | 15 - RF_pulses/rf_tools/remod.m | 10 - RF_pulses/rf_tools/rf_tools manual.pdf | Bin 1833628 -> 0 bytes RF_pulses/rf_tools/rfscale.m | 12 - RF_pulses/rf_tools/signa.m | 63 -- RF_pulses/rf_tools/t2hz.m | 18 - RF_pulses/rf_tools/verse.m | 29 - RF_pulses/rf_tools/versec.m | 15 - RF_pulses/rf_tools/zpl.m | 22 - .../spectral_spatial/Copyright_Information | 12 - RF_pulses/spectral_spatial/README | 34 -- .../spectral_spatial/create_freq_specs.m | 46 -- RF_pulses/spectral_spatial/examples/demo.m | 367 ----------- .../spectral_spatial/examples/demo_C13.m | 237 -------- .../examples/demo_dualband_se.m | 98 --- .../spectral_spatial/examples/demo_mband.m | 217 ------- .../examples/demo_mband_phs.m | 132 ---- RF_pulses/spectral_spatial/fftf.m | 82 --- RF_pulses/spectral_spatial/fftr.m | 78 --- RF_pulses/spectral_spatial/fir_expand.m | 408 ------------- RF_pulses/spectral_spatial/fir_linprog.m | 380 ------------ RF_pulses/spectral_spatial/fir_min_order.m | 231 ------- .../spectral_spatial/fir_min_order_linprog.m | 226 ------- .../spectral_spatial/fir_min_order_qprog.m | 228 ------- .../fir_min_order_qprog_phs.m | 213 ------- RF_pulses/spectral_spatial/fir_minphase.m | 210 ------- .../spectral_spatial/fir_minphase_power.m | 211 ------- RF_pulses/spectral_spatial/fir_pm.m | 256 -------- RF_pulses/spectral_spatial/fir_pm_minpow.m | 384 ------------ RF_pulses/spectral_spatial/fir_qprog.m | 318 ---------- RF_pulses/spectral_spatial/fir_qprog_phs.m | 400 ------------ RF_pulses/spectral_spatial/grad_min_bridge.m | 117 ---- RF_pulses/spectral_spatial/grad_mintrap.m | 70 --- RF_pulses/spectral_spatial/grad_ss.m | 185 ------ RF_pulses/spectral_spatial/plot_spec.m | 35 -- RF_pulses/spectral_spatial/plot_spec_phs.m | 49 -- RF_pulses/spectral_spatial/rf_ripple.m | 119 ---- RF_pulses/spectral_spatial/signa.m | 63 -- RF_pulses/spectral_spatial/spec_interp.m | 130 ---- .../spectral_spatial/spec_interp_nonuniform.m | 137 ----- RF_pulses/spectral_spatial/spectral_fact.m | 64 -- RF_pulses/spectral_spatial/ss_alias.m | 385 ------------ RF_pulses/spectral_spatial/ss_b1verse.m | 238 -------- RF_pulses/spectral_spatial/ss_band_plot.m | 99 --- RF_pulses/spectral_spatial/ss_band_plot_phs.m | 99 --- RF_pulses/spectral_spatial/ss_design.m | 492 --------------- RF_pulses/spectral_spatial/ss_design_phs.m | 495 --------------- RF_pulses/spectral_spatial/ss_ep.m | 524 ---------------- RF_pulses/spectral_spatial/ss_ep_phs.m | 535 ----------------- RF_pulses/spectral_spatial/ss_flyback.m | 507 ---------------- RF_pulses/spectral_spatial/ss_flyback_phs.m | 536 ----------------- RF_pulses/spectral_spatial/ss_globals.m | 114 ---- RF_pulses/spectral_spatial/ss_opt.m | 186 ------ RF_pulses/spectral_spatial/ss_plot.m | 267 -------- RF_pulses/spectral_spatial/ss_response_mxy.m | 67 --- RF_pulses/spectral_spatial/ss_save.m | 236 -------- RF_pulses/spectral_spatial/ss_save_dyn.m | 232 ------- RF_pulses/spectral_spatial/ss_spect_correct.m | 332 ---------- RF_pulses/spectral_spatial/ss_verse.m | 45 -- 96 files changed, 12 insertions(+), 13296 deletions(-) delete mode 100644 RF_pulses/rf_tools/README delete mode 100644 RF_pulses/rf_tools/ab2ex.m delete mode 100644 RF_pulses/rf_tools/ab2inv.m delete mode 100644 RF_pulses/rf_tools/ab2sat.m delete mode 100644 RF_pulses/rf_tools/ab2se.m delete mode 100644 RF_pulses/rf_tools/ab2st.m delete mode 100644 RF_pulses/rf_tools/abr.m delete mode 100644 RF_pulses/rf_tools/cplot.m delete mode 100644 RF_pulses/rf_tools/csg.m delete mode 100644 RF_pulses/rf_tools/csg2.m delete mode 100644 RF_pulses/rf_tools/dimp.m delete mode 100644 RF_pulses/rf_tools/dinf.m delete mode 100644 RF_pulses/rf_tools/dz2d.m delete mode 100644 RF_pulses/rf_tools/dzbeta.m delete mode 100644 RF_pulses/rf_tools/dzepse.m delete mode 100644 RF_pulses/rf_tools/dzlp.m delete mode 100644 RF_pulses/rf_tools/dzls.m delete mode 100644 RF_pulses/rf_tools/dzmp.m delete mode 100644 RF_pulses/rf_tools/dzrf.m delete mode 100644 RF_pulses/rf_tools/dzsr.m delete mode 100644 RF_pulses/rf_tools/fftc.m delete mode 100644 RF_pulses/rf_tools/fmp.m delete mode 100644 RF_pulses/rf_tools/gt2cm.m delete mode 100644 RF_pulses/rf_tools/iq2ap.m delete mode 100644 RF_pulses/rf_tools/ktog.m delete mode 100644 RF_pulses/rf_tools/ktos.m delete mode 100644 RF_pulses/rf_tools/loadwave.m delete mode 100644 RF_pulses/rf_tools/mag2mp.m delete mode 100644 RF_pulses/rf_tools/mex files/abrx.c delete mode 100644 RF_pulses/rf_tools/mex files/b2a.c delete mode 100644 RF_pulses/rf_tools/mex files/b2a.code.c delete mode 100644 RF_pulses/rf_tools/mex files/b2rf.c delete mode 100644 RF_pulses/rf_tools/mex files/cabc2rf.c delete mode 100644 RF_pulses/rf_tools/mex files/cabc2rf.code.c delete mode 100644 RF_pulses/rf_tools/mex files/four1.c delete mode 100644 RF_pulses/rf_tools/mex files/minpeakrf.c delete mode 100644 RF_pulses/rf_tools/msinc.m delete mode 100644 RF_pulses/rf_tools/remod.m delete mode 100644 RF_pulses/rf_tools/rf_tools manual.pdf delete mode 100644 RF_pulses/rf_tools/rfscale.m delete mode 100644 RF_pulses/rf_tools/signa.m delete mode 100644 RF_pulses/rf_tools/t2hz.m delete mode 100644 RF_pulses/rf_tools/verse.m delete mode 100644 RF_pulses/rf_tools/versec.m delete mode 100644 RF_pulses/rf_tools/zpl.m delete mode 100644 RF_pulses/spectral_spatial/Copyright_Information delete mode 100644 RF_pulses/spectral_spatial/README delete mode 100644 RF_pulses/spectral_spatial/create_freq_specs.m delete mode 100644 RF_pulses/spectral_spatial/examples/demo.m delete mode 100644 RF_pulses/spectral_spatial/examples/demo_C13.m delete mode 100644 RF_pulses/spectral_spatial/examples/demo_dualband_se.m delete mode 100644 RF_pulses/spectral_spatial/examples/demo_mband.m delete mode 100644 RF_pulses/spectral_spatial/examples/demo_mband_phs.m delete mode 100644 RF_pulses/spectral_spatial/fftf.m delete mode 100644 RF_pulses/spectral_spatial/fftr.m delete mode 100644 RF_pulses/spectral_spatial/fir_expand.m delete mode 100644 RF_pulses/spectral_spatial/fir_linprog.m delete mode 100644 RF_pulses/spectral_spatial/fir_min_order.m delete mode 100644 RF_pulses/spectral_spatial/fir_min_order_linprog.m delete mode 100644 RF_pulses/spectral_spatial/fir_min_order_qprog.m delete mode 100644 RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m delete mode 100644 RF_pulses/spectral_spatial/fir_minphase.m delete mode 100644 RF_pulses/spectral_spatial/fir_minphase_power.m delete mode 100644 RF_pulses/spectral_spatial/fir_pm.m delete mode 100644 RF_pulses/spectral_spatial/fir_pm_minpow.m delete mode 100644 RF_pulses/spectral_spatial/fir_qprog.m delete mode 100644 RF_pulses/spectral_spatial/fir_qprog_phs.m delete mode 100644 RF_pulses/spectral_spatial/grad_min_bridge.m delete mode 100644 RF_pulses/spectral_spatial/grad_mintrap.m delete mode 100644 RF_pulses/spectral_spatial/grad_ss.m delete mode 100644 RF_pulses/spectral_spatial/plot_spec.m delete mode 100644 RF_pulses/spectral_spatial/plot_spec_phs.m delete mode 100644 RF_pulses/spectral_spatial/rf_ripple.m delete mode 100644 RF_pulses/spectral_spatial/signa.m delete mode 100644 RF_pulses/spectral_spatial/spec_interp.m delete mode 100644 RF_pulses/spectral_spatial/spec_interp_nonuniform.m delete mode 100644 RF_pulses/spectral_spatial/spectral_fact.m delete mode 100644 RF_pulses/spectral_spatial/ss_alias.m delete mode 100644 RF_pulses/spectral_spatial/ss_b1verse.m delete mode 100644 RF_pulses/spectral_spatial/ss_band_plot.m delete mode 100644 RF_pulses/spectral_spatial/ss_band_plot_phs.m delete mode 100644 RF_pulses/spectral_spatial/ss_design.m delete mode 100644 RF_pulses/spectral_spatial/ss_design_phs.m delete mode 100644 RF_pulses/spectral_spatial/ss_ep.m delete mode 100644 RF_pulses/spectral_spatial/ss_ep_phs.m delete mode 100644 RF_pulses/spectral_spatial/ss_flyback.m delete mode 100644 RF_pulses/spectral_spatial/ss_flyback_phs.m delete mode 100644 RF_pulses/spectral_spatial/ss_globals.m delete mode 100644 RF_pulses/spectral_spatial/ss_opt.m delete mode 100644 RF_pulses/spectral_spatial/ss_plot.m delete mode 100644 RF_pulses/spectral_spatial/ss_response_mxy.m delete mode 100644 RF_pulses/spectral_spatial/ss_save.m delete mode 100644 RF_pulses/spectral_spatial/ss_save_dyn.m delete mode 100644 RF_pulses/spectral_spatial/ss_spect_correct.m delete mode 100644 RF_pulses/spectral_spatial/ss_verse.m diff --git a/README.md b/README.md index bcc2f88..cb589b0 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,26 @@ -hyperpolarized-mri-toolbox +# hyperpolarized-mri-toolbox ========================== The goal of this toolbox is to provide research-level and prototyping software tools for hyperpolarized MRI experiments. It is currently based on MATLAB code, and includes code for designing radiofrequency (RF) pulses, readout gradients, and data reconstruction. -This toolbox was created as a part of the UCSF Hyperpolarized MRI Technology Resource Center (http://www.radiology.ucsf.edu/research/labs/hyperpolarized-mri-tech) which is funded by the National Institutes of Health (NIH Grant P41-EB013598). - It is hosted on this open-source, collaborative platform in order to encourage anyone and everyone in the hyperpolarized MRI research community to contribute tools that will help our field rapidly progress. -For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/). +## Additional Resources + +More tools for hyperpolarized MRI RF pulse design are now in +(../Spectral-Spatial-RF-Pulse-Design) + +For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/), which is also hosted on github (../../SIVICLab/sivic) + +## Support + +This toolbox was created as a part of the UCSF Hyperpolarized MRI Technology Resource Center (http://www.radiology.ucsf.edu/research/labs/hyperpolarized-mri-tech) which is funded by the National Institutes of Health (NIH Grant P41-EB013598). Please let us know if you would like to contribute or have suggestions for content. **Project Organizer**: Peder Larson, University of California - San Francisco -**Project Contributors**: +**Initial Project Contributors**: * Jeremy Gordon, University of California - San Francisco * Adam Kerr, Stanford University * You :) diff --git a/RF_pulses/rf_tools/README b/RF_pulses/rf_tools/README deleted file mode 100644 index 0ef18e1..0000000 --- a/RF_pulses/rf_tools/README +++ /dev/null @@ -1,46 +0,0 @@ - This directory contains all the rf_tools matlab stuff. Put this in -your MATLABPATH environment variable - - setenv MATLABPATH /usr/local/wherever/rf_tools - -if that is where you put it. - - You need to compile the simulator, and various parts of the design -algorithm. These are the the "mexX" subdirectories, where X is 4 or 5 -depending on whether you are using matlab 4 or 5. - - If you are using matlab 4, cd to mex4, do a "make all", and copy the -.mexsol files back into this directory. - - If you are using matlab 5, run matlab, and cd to the mex5 directory. -If you are using the default compiler on your platform, then invoke - - mex abrx.c - mex b2rf.c - mex b2a.c - mex cabc2rf.c - -Then quit matlab, and copy the mex5/*.mexsol files into the rf_tools -directory. I use gcc under Solaris, in which case, use - - mex CC=gcc OPTFLAGS=-fPIC abrx.c - -instead. The -fPIC flag is important. Without it, things seem to -work, but fail occasionally for no apparent reason. Also, make sure -/usr/ccs/bin and the matlab5.1/bin directory are in your path, and -that you use the Sun make, as, and ld, and not the gnu version that -may be lurking elsewhere. - - There is documentation in man.ps, as well as online help for most -routines. - -New features for this release are support throughout for 2D RF pulses -including design, simulation and plotting. The routine dz2d designs -spiral 2D pulses. The spectral-spatial pulse design routine is new. -It does a true 2D SLR design, so it works fine for large flip angles. - -Let me know if if find any bugs, would like things to work differently, -or have anything you like to see added. - - -- John (pauly@mrsrl.stanford.edu) - diff --git a/RF_pulses/rf_tools/ab2ex.m b/RF_pulses/rf_tools/ab2ex.m deleted file mode 100644 index 0c949db..0000000 --- a/RF_pulses/rf_tools/ab2ex.m +++ /dev/null @@ -1,16 +0,0 @@ -function mxy = ab2ex(a,b); - -% mxy = ab2ex(a,b) -- or -- mxy = ab2ex(ab) -% -% Computes the excitation profile 2*conj(a).b - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -if nargin == 1, - [m n] = size(a); - b = a(:,(n/2+1):n); - a = a(:,1:n/2); -end; - -mxy = 2*conj(a).*b; diff --git a/RF_pulses/rf_tools/ab2inv.m b/RF_pulses/rf_tools/ab2inv.m deleted file mode 100644 index 4b394e1..0000000 --- a/RF_pulses/rf_tools/ab2inv.m +++ /dev/null @@ -1,16 +0,0 @@ -% mz = ab2inv(a,b) -- or -- mz = ab2inv(ab) -% -% Computes the inversion profile 1-2*b.*conj(b) - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function mz = ab2inv(a,b); - -if nargin == 1, - [m n] = size(a); - b = a(:,(n/2+1):n); - a = a(:,1:n/2); -end; - -mz = 1-2*conj(b).*b; diff --git a/RF_pulses/rf_tools/ab2sat.m b/RF_pulses/rf_tools/ab2sat.m deleted file mode 100644 index e13a802..0000000 --- a/RF_pulses/rf_tools/ab2sat.m +++ /dev/null @@ -1,17 +0,0 @@ -% mz = ab2sat(a,b) -- or -- mz = ab2sat(ab) -% -% Computes the saturation profile 1-2*b.*conj(b) - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function mz = ab2sat(a,b); - -if nargin == 1, - [m n] = size(a); - b = a(:,(n/2+1):n); - a = a(:,1:n/2); -end; - -mz = 1-2*conj(b).*b; - diff --git a/RF_pulses/rf_tools/ab2se.m b/RF_pulses/rf_tools/ab2se.m deleted file mode 100644 index 9a4f239..0000000 --- a/RF_pulses/rf_tools/ab2se.m +++ /dev/null @@ -1,16 +0,0 @@ -% mxy = ab2se(a,b) -- or -- mxy = ab2se(ab) -% -% Computes the spin-echo profile i*b.*b - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function mxy = ab2se(a,b); - -if nargin == 1, - [m n] = size(a); - b = a(:,(n/2+1):n); - a = a(:,1:n/2); -end - -mxy = i*b.*b; \ No newline at end of file diff --git a/RF_pulses/rf_tools/ab2st.m b/RF_pulses/rf_tools/ab2st.m deleted file mode 100644 index 81b4159..0000000 --- a/RF_pulses/rf_tools/ab2st.m +++ /dev/null @@ -1,17 +0,0 @@ -% mxy = ab2se(a,b) -- or -- mxy = ab2se(ab) -% -% Computes the "straight through" term a.*a - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function mxy = ab2st(a,b); - -if nargin == 2, - mxy = i*a.*a; -elseif nargin == 1, - mxy = i*a(:,1).*a(:,1); -else - ab2xx -end - diff --git a/RF_pulses/rf_tools/abr.m b/RF_pulses/rf_tools/abr.m deleted file mode 100644 index 15ffa94..0000000 --- a/RF_pulses/rf_tools/abr.m +++ /dev/null @@ -1,39 +0,0 @@ -% abr - compute the Cayley-Klein parameters for the rotation produced -% by an RF pulse. Uses Le Roux's convention on beta -% -% [a b] = abr(rf, x); -% a, b = Cayley-Klein paramters -% rf = n point rf waveform -% g = optional gradient waveform -% x = vectors of spatial positions to compute a and b. -% -% useful identities: -% mxy = 2*conj(a).*b); selective excitation -% mz = 1 - 2*b.*conj(b); inversion -% mxy = i(b.*b); spin echo profile -% - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function [a, b] = abr(rf, g, x, y) - -l = length(rf); - -if nargin == 2, - x = g; - g = ones(1,l)*2*pi/l; -end; - -if nargin == 4, - [a b] = abrx(rf, g, x, y); -elseif (nargin==2) || (nargin==3), - [a b] = abrx(rf, g, x); -end; - -b = -conj(b); -if nargout == 1, - a = [a b]; -end; - - diff --git a/RF_pulses/rf_tools/cplot.m b/RF_pulses/rf_tools/cplot.m deleted file mode 100644 index c1cf1eb..0000000 --- a/RF_pulses/rf_tools/cplot.m +++ /dev/null @@ -1,16 +0,0 @@ -% -% cplot(x) - plot complex function; -% - -% written by John Pauly, 1989 -% (c) Board of Trustees, Leland Stanford Junior University - -function cplot(x) - -l = length(x); -t = [1:l]/(l+1); -plot(t,real(x),t,imag(x)); - - - - diff --git a/RF_pulses/rf_tools/csg.m b/RF_pulses/rf_tools/csg.m deleted file mode 100644 index 27e966b..0000000 --- a/RF_pulses/rf_tools/csg.m +++ /dev/null @@ -1,72 +0,0 @@ -% function [nk] = csg(k,mxg,mxs,[g0, gamma]) -% -% This routine takes a k-space trajectory and time warps it to -% meet gradient amplitude and slew rate constraints. -% -% Inputs: -% k -- k-space trajectory, scaled to cycles/cm -% mxg -- maximum gradient, G/cm -% mxs -- maximum slew rate, (G/cm)/ms -% g0 (optional) -- initial gradient strength, G/cm -% gamma (optional) -- kHz/G -% -% Outputs: -% nk -- new k-space trajectory meeting the constraints -% -% csg also reports the gradient duration required. -% - -% Written by John Pauly, 1993 -% -% Oct 4, 2004 modified to use 'spline' in interp1, now that it works in -% matlab 7 - -function [nk] = csg(k,mxg,mxs,g0,gamma) - -if nargin < 5 - gamma = 4.257; -end - -td = 1; -len = length(k); - -% compute initial gradient, slew rate -g = [diff(k)]/(gamma*(td/len)); -if nargin < 4 || isempty(g0) - g = [0 g]; -else - g = [g0 g]; -end -s = diff(g)/(td/len); -%s = [s s(end)]; - -% Compute slew rate limited trajectory -nk = k; - -for N = 1:5 -g = [diff(nk)]/(gamma*(td/len)); -if nargin < 4 || isempty(g0) - g = [0 g]; -else - g = [g0 g]; -end -s = diff(g)/(td/len); -ndts = sqrt(abs(s/mxs)); -nt = [0,cumsum(ndts)*td/len]; -%nk = csplinx(nt,k,[1:len]*nt(len)/len); -nk = interp1(nt,nk,[0:len-1]*nt(len)/(len-1),'spline'); -end - - -% Apply the additional gradient amplitude constraint -g = [0 diff(nk)]/(gamma*(nt(len)/len)); - -%ndtg = max(abs(g/mxg),1); -ndtg = max(abs(g),mxg); -nt = [0, cumsum(ndtg(1:end-1))*nt(len)/(mxg*len)]; -%nk = csplinx(nt,nk,[1:len]*nt(len)/len); -nk = interp1(nt,nk,[0:len-1]*nt(len)/(len-1),'spline'); - -% report the waveform length -disp(sprintf('Gradient duration is %6.3f ms',nt(len))); - diff --git a/RF_pulses/rf_tools/csg2.m b/RF_pulses/rf_tools/csg2.m deleted file mode 100644 index 368af11..0000000 --- a/RF_pulses/rf_tools/csg2.m +++ /dev/null @@ -1,47 +0,0 @@ -% function [nk] = csg(k,mxg,mxs) -% -% This routine takes a k-space trajectory and time warps it to -% meet gradient amplitude and slew rate constraints. -% -% Inputs: -% k -- k-space trajectory, scaled to cycles/cm -% mxg -- maximum gradient, G/cm -% mxs -- maximum slew rate, (G/cm)/ms -% -% Outputs: -% nk -- new k-space trajectory meeting the constraints -% -% csg also reports the gradient duration required. -% - -% Written by John Pauly, 1993 - -function [nk] = csg(k,mxg,mxs) - -td = 1; -len = length(k); - -g0 = k(2)-k(1); -g1 = k(3)-k(2); -s0 = g1 - g0; -gm1 = g0-s0; - -% compute initial gradient, slew rate -g = [gm1 diff(k)]/(4.26*(td/len)); -s = diff(g)/(td/len); -s = [s(1) s]; - -% Compute slew rate limited trajectory -ndts = sqrt(abs(s/mxs)); -nt = cumsum(ndts)*td/len; -nk = csplinx(nt,k,[1:len]*nt(len)/len); - -% Apply the additional gradient amplitude constraint -g = [0 diff(nk)]/(4.26*(nt(len)/len)); -ndtg = max(abs(g),mxg); -nt = cumsum(ndtg)*nt(len)/(mxg*len); -nk = csplinx(nt,nk,[1:len]*nt(len)/len); - -% report the waveform length -disp(sprintf('Gradient duration is %6.3f ms',nt(len))); - diff --git a/RF_pulses/rf_tools/dimp.m b/RF_pulses/rf_tools/dimp.m deleted file mode 100644 index f3b02c6..0000000 --- a/RF_pulses/rf_tools/dimp.m +++ /dev/null @@ -1,10 +0,0 @@ -% dimp -- calculate D infinity for a minimum phase filter - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function d=dimp(d1,d2) - -d = 0.5*dinf(2*d1,0.5*d2.*d2); - - diff --git a/RF_pulses/rf_tools/dinf.m b/RF_pulses/rf_tools/dinf.m deleted file mode 100644 index edc7a61..0000000 --- a/RF_pulses/rf_tools/dinf.m +++ /dev/null @@ -1,29 +0,0 @@ -% dinf -- calculate D infinity for a linear phase filter - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function d = dinf(d1,d2) - -a1 = 5.309e-3; -a2 = 7.114e-2; -a3 = -4.761e-1; -a4 = -2.66e-3; -a5 = -5.941e-1; -a6 = -4.278e-1; - -l10d1 = log10(d1); -l10d2 = log10(d2); - -[m1 n1] = size(l10d1); -if (m1 -#include -#include -#include "mex.h" - -#define RF prhs[0] /* complex rf */ -#define GC prhs[1] /* complex gradient */ -#define X prhs[2] /* x samples */ -#define Y prhs[3] /* y samples */ - -#define ALF plhs[0] /* 2D grid of alpha's */ -#define BET plhs[1] /* 2D grid of alpha's */ - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) - -double *rfi, *rfq, *gx, *gy, x, y, *alpr, *alpi, *btpr, *btpi, *xp, *yp; -int ns; -char s[80]; -void abrot(double a[2], double b[2]); - -void mexFunction(int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[]) -{ - int nx, ny, ix, iy; - double alf[2], bet[2]; - - if ((nrhs < 3) || (nrhs > 4) || (nlhs != 2)) - mexErrMsgTxt("Usage: [alpha, beta] = abrx(rf, g, x {, y})"); - - ns = max(mxGetN(RF),mxGetM(RF)); - if (ns != max(mxGetN(GC),mxGetM(GC))) - mexErrMsgTxt("rf and gradient vectors are of different lengths"); - -/* mexErrMsgTxt(sprintf(s,"ns=%d",ns)); */ - - gx = mxGetPr(GC); - if (nrhs==4) gy = mxGetPi(GC); - rfi = mxGetPr(RF); rfq = mxGetPi(RF); - - nx = max(mxGetN(X),mxGetM(X)); - if (nrhs==4) - ny = max(mxGetN(Y),mxGetM(Y)); - else - ny = 1; - - ALF = mxCreateDoubleMatrix(nx,ny,mxCOMPLEX); - alpr = mxGetPr(ALF); alpi = mxGetPi(ALF); - BET = mxCreateDoubleMatrix(nx,ny,mxCOMPLEX); - btpr = mxGetPr(BET); btpi = mxGetPi(BET); - - if (nrhs==4) yp = mxGetPr(Y); - xp = mxGetPr(X); - - for (iy=0; iy0.0) { - nx = cpr/phi; ny = cpi/phi; nz = cg/phi; - } else { - nx = 0.0; ny = 0.0; nz = 1.0; /* doesn't matter, phi=0*/ - } - csp = cos(phi/2); snp = sin(phi/2); - al[0] = csp; al[1] = nz*snp; - be[0] = ny*snp; be[1] = nx*snp; - - bp[0] = al[0]*b[0]-al[1]*b[1]+be[0]*a[0]-be[1]*(-a[1]); - bp[1] = al[0]*b[1]+al[1]*b[0]+be[1]*a[0]+be[0]*(-a[1]); - - ap[0] = -( be[0] *b[0]-(-be[1])*b[1]) - + al[0] *a[0]-(-al[1])*(-a[1]); - ap[1] = -(-(-(be[1])*b[0]+ be[0] *b[1]) - + (-al[1])*a[0]+ al[0] *(-a[1])); - - a[0] = ap[0]; a[1] = ap[1]; b[0] = bp[0]; b[1] = bp[1]; - } - - return; -} diff --git a/RF_pulses/rf_tools/mex files/b2a.c b/RF_pulses/rf_tools/mex files/b2a.c deleted file mode 100644 index 9fb17d3..0000000 --- a/RF_pulses/rf_tools/mex files/b2a.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * [rf] = b2rf (b) - * - * C program version of b2rf. - * - * Mex driver for subroutine. - * Gets complex rf from complex polynomial b. - * - * Written by Adam Kerr, October 1992 - * Modified from John Pauly's code. - * (c) Board of Trustees, Leland Stanford Junior University - */ - -#include -#include -#include "mex.h" - -#define MAXN (1024) - -#define max(a,b) ((a)>(b) ? (a) : (b)) - -/* driver for matlab call */ - -#define B prhs[0] /* alpha polynomial */ -#define A plhs[0] /* RF pulse */ -void b2a(double *b, int n, double *a); -void cabc2rf(double *a, double *b, int n, double *rf); -double a[MAXN*2], b[MAXN*2]; -double rf[MAXN*2]; - -void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) -{ - - double *bpr, *bpi, *ar, *ai; - int n; - int i, j; - - if ((nrhs != 1) || (nlhs != 1)) - mexErrMsgTxt("Usage: [rf] = b2rf (b)"); - - n = max (mxGetN(B), mxGetM(B)); - if (n > MAXN) - mexErrMsgTxt("beta polynomial too long"); - - /* copy b into array */ - bpr = mxGetPr(B); - bpi = mxGetPi(B); - if (bpi != NULL) - for (i=0; i - -#define ZEROPAD (16) -#define MAXN (1024 * ZEROPAD) -#define MP (0.0000001) - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) -#define magsqr(a,j) (a[2*j]*a[2*j] + a[2*j+1]*a[2*j+1]) -void four1(double bf[], int nnc, int fwd); -double bf[MAXN*2], am[MAXN*2], af[MAXN*2]; - -void b2a(double *b, int n, double *a) -{ - double bmx, bm, p; - int i, j, nn, nnc; - char s[80]; - - /* next bigger power of 2 */ - for (nn=1; nn<=n; nn*=2); - nn *=2; - /*nn = (int) (exp(log(2)*ceil(log((double)n)/log(2))))+1;*/ - - /* size of arrays used for computation */ - nnc = nn*ZEROPAD; - - for (i=0; i bmx) - bmx = bm; - } - if (bmx >= 1.0) - for (i=0; i -#include -#include "mex.h" - -#define MAXN (1024) - -#define max(a,b) ((a)>(b) ? (a) : (b)) - -/* driver for matlab call */ - -#define B prhs[0] /* alpha polynomial */ -#define RF plhs[0] /* RF pulse */ -void b2a(double *b, int n, double *a); -void cabc2rf(double *a, double *b, int n, double *rf); -double a[MAXN*2], b[MAXN*2]; -double rf[MAXN*2]; - -void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) -{ - - double *bpr, *bpi, *rfr, *rfi; - int n; - int i, j; - - if ((nrhs != 1) || (nlhs != 1)) - mexErrMsgTxt("Usage: [rf] = b2rf (b)"); - - n = max (mxGetN(B), mxGetM(B)); - if (n > MAXN) - mexErrMsgTxt("beta polynomial too long"); - - /* copy b into array */ - bpr = mxGetPr(B); - bpi = mxGetPi(B); - if (bpi != NULL) - for (i=0; i -#include -#include "mex.h" - -#define MAXN (4096) - -#define max(a,b) ((a)>(b) ? (a) : (b)) - -/* driver for matlab call */ - -#define A prhs[0] /* alpha, beta polynomials */ -#define B prhs[1] - -#define RF plhs[0] /* RF out - complex */ - -void cabc2rf( double *a, double *b, int n, double *rf); - -double a[MAXN*2], b[MAXN*2], rf[MAXN*2]; - - -void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) -{ - - double *ar, *ai, *br, *bi, *rfr, *rfi; - - int n; - int i, j; - - if ((nrhs != 2) || (nlhs != 1)) - mexErrMsgTxt("Usage: [rf] = cabc2rf (a,b)"); - - n = max (mxGetN(A), mxGetM(A)); - if (n > MAXN) - mexErrMsgTxt ("alpha polynomial too long"); - - if (max (mxGetN(B), mxGetM(B)) != n) - mexErrMsgTxt ("alpha, beta polynomials MUST be same length"); - - /* copy a, b into arrays */ - ar = mxGetPr(A); ai = mxGetPi(A); - br = mxGetPr(B); bi = mxGetPi(B); - for (i=0; i - -#define MAXN (1024) - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) -#define mag(a,j) (sqrt (a[(j)*2]*a[(j)*2]+a[(j)*2+1]*a[(j)*2+1])) -#define re_div(a,i,b,j) ((a[i*2]*b[j*2] + a[i*2+1]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) -#define im_div(a,i,b,j) ((a[i*2+1]*b[j*2] - a[i*2]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) -double a2[MAXN*2], b2[MAXN*2]; - - -void cabc2rf(double a[], double b[], int n, double rf[]) -{ - int i, j; - double sj[2], cj; - double phi, theta; /* use definitions from SLR paper, somewhat - different from those in John's abc2rf() */ - - for (j=n-1; j>=0; j--) - { - /* get real cj and complex sj now */ - cj = sqrt (1 / (1 + (b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])/ - (a[j*2]*a[j*2] + a[j*2+1]*a[j*2+1]) )); - sj[0] = re_div (b,j,a,j) * cj; - sj[1] = -im_div (b,j,a,j) * cj; - - /* get phi and theta now */ - phi = 2 * atan2 (mag(sj,0), cj); - theta = atan2 (sj[1],sj[0]); - - /* get rf now from phi and theta */ - rf[j*2] = phi * cos (theta); - rf[j*2+1] = phi * sin (theta); - - /* create new polynomials now */ - for (i=0; i<=j; i++) - { - a2[i*2] = cj * a[i*2] + sj[0] * b[i*2] - sj[1] * b[i*2+1]; - a2[i*2+1] = cj * a[i*2+1] + sj[0] * b[i*2+1] + sj[1] * b[i*2]; - b2[i*2] = -sj[0] * a[i*2] - sj[1] * a[i*2+1] + cj * b[i*2]; - b2[i*2+1] = -sj[0] * a[i*2+1] + sj[1] * a[i*2] + cj * b[i*2+1]; - } - - /* copy back into old polynomials now */ - /* try other way - for (i=0; i<=j-1; i++) - { - a[i*2] = a2[i*2+2]; - a[i*2+1] = a2[i*2+3]; - b[i*2] = b2[i*2]; - b[i*2+1] = b2[i*2+1]; - } */ - for (i=0; i<=2*j-1; i++) - { - a[i] = a2[i+2]; - b[i] = b2[i]; - } - } -} - diff --git a/RF_pulses/rf_tools/mex files/four1.c b/RF_pulses/rf_tools/mex files/four1.c deleted file mode 100644 index 330e7b0..0000000 --- a/RF_pulses/rf_tools/mex files/four1.c +++ /dev/null @@ -1,51 +0,0 @@ -#include - -#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr - -void four1(double data[], int nn, int isign) -{ - int n,mmax,m,j,istep,i; - double wtemp,wr,wpr,wpi,wi,theta; - double tempr,tempi; - - n=nn << 1; - j=1; - for (i=1;i i) { - SWAP(data[j],data[i]); - SWAP(data[j+1],data[i+1]); - } - m=n >> 1; - while (m >= 2 && j > m) { - j -= m; - m >>= 1; - } - j += m; - } - mmax=2; - while (n > mmax) { - istep=2*mmax; - theta=6.28318530717959/(isign*mmax); - wtemp=sin(0.5*theta); - wpr = -2.0*wtemp*wtemp; - wpi=sin(theta); - wr=1.0; - wi=0.0; - for (m=1;m -#include -#include -#define MAXN 1024 - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) -#define mag(a,j) (hypot (a[(j)*2], a[(j)*2+1])) - -/* driver for matlab call */ - -#define Z prhs[0] /* complex z roots */ -#define FLIP prhs[1] /* indices of roots to flip */ -#define BSF prhs[2] /* scaling factor for beta polynomial */ - -#define ZMIN plhs[0] /* complex roots */ - -void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) -{ - double z[MAXN*2], z0[MAXN*2]; - double zmin[MAXN*2], *zpi, *zpr, *flp; - int sflip[MAXN]; - int cflip[MAXN*2]; - int nflip, nroots; - int nsflip, ncflip; - double bsf; - int i, j; - int ncomb; - double start_peakrf; - double min_peakrf, peakrf; - int min_index; - int bittest; - int r; - int r1, r2; - double z2peakrf(); - void b2a(); - - if ((nrhs != 3) || (nlhs != 1)) - mexErrMsgTxt ("Usage: [zmin] = minpeakrf (z, flip, bsf)"); - - nroots = max (mxGetN(Z), mxGetM(Z)); - if (nroots+1 > MAXN) - mexErrMsgTxt ("z vector too long"); - - nflip = mxGetM(FLIP); - - bsf = mxGetPr(BSF)[0]; - if ((bsf < 0) || (bsf > 1.0)) - mexErrMsgTxt ("bsf not in 0..1"); - - /* copy z into c array */ - zpr = mxGetPr(Z); - zpi = mxGetPi(Z); - for (i=0; i - -#define ZEROPAD (8) -#define MAXNP (1024 * ZEROPAD) -#define MP (0.0000001) - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) -#define magsqr(a,j) (a[2*j]*a[2*j] + a[2*j+1]*a[2*j+1]) -void four1(double bf[], int nnc, int fwd); -double bf[MAXNP*2], am[MAXNP*2], af[MAXNP*2]; - -void b2a(double *b, int n, double *a) -{ - double bmx, bm, p; - int i, j, nn, nnc; - - /* next bigger power of 2 */ - nn = (int) (exp(log(2)*ceil(log((double)n)/log(2))))+1; - - /* size of arrays used for computation */ - nnc = nn*ZEROPAD; - - for (i=0; i bmx) - bmx = bm; - } - if (bmx >= 1.0) - for (i=0; i - -#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr - -void four1(double data[], int nn, int isign) -{ - int n,mmax,m,j,istep,i; - double wtemp,wr,wpr,wpi,wi,theta; - double tempr,tempi; - - n=nn << 1; - j=1; - for (i=1;i i) { - SWAP(data[j],data[i]); - SWAP(data[j+1],data[i+1]); - } - m=n >> 1; - while (m >= 2 && j > m) { - j -= m; - m >>= 1; - } - j += m; - } - mmax=2; - while (n > mmax) { - istep=2*mmax; - theta=6.28318530717959/(isign*mmax); - wtemp=sin(0.5*theta); - wpr = -2.0*wtemp*wtemp; - wpi=sin(theta); - wr=1.0; - wi=0.0; - for (m=1;m - -/*define MAXN (1024)*/ - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) -#define mag(a,j) (hypot (a[(j)*2], a[(j)*2+1])) -#define re_mult(a1,b1,a2,b2) ((a1)*(a2) - (b1)*(b2)) -#define im_mult(a1,b1,a2,b2) ((a1)*(b2) + (a2)*(b1)) - -npoly (z, n, b) -double z[], b[]; -int n; -{ - int i; - int nn; - double bf[MAXN*2]; - double bfmax, bfmag; - - b[0] = 1; /* b[0] = 1 + i0 */ - b[1] = 0; - for (i=0; i0; i--) - { - p[(i*2)] += re_mult(p[(i-1)*2], p[(i-1)*2+1],a, b); - p[(i*2)+1] += im_mult(p[(i-1)*2], p[(i-1)*2+1], a, b); - } -} - - -/* - * cabc2rf (a, b, n, rf) - * - * C program version of cabc2rf. - * - * Performs inverse SLR tranform on complex a,b to give complex rf pulse - * - * - * Written by Adam Kerr, October 1992 - * Modified from John Pauly's code. - * (c) Board of Trustees, Leland Stanford Junior University - */ - -#include - -/*define MAXN (1024)*/ - -#define max(a,b) ((a)>(b) ? (a) : (b)) -#define min(a,b) ((a)<(b) ? (a) : (b)) -#define mag(a,j) (sqrt (a[(j)*2]*a[(j)*2]+a[(j)*2+1]*a[(j)*2+1])) -#define re_div(a,i,b,j) ((a[i*2]*b[j*2] + a[i*2+1]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) -#define im_div(a,i,b,j) ((a[i*2+1]*b[j*2] - a[i*2]*b[j*2+1])/(b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])) -double a2[MAXN*2], b2[MAXN*2]; - - -void cabc2rf(double a[], double b[], int n, double rf[]) -{ - int i, j; - double sj[2], cj; - double phi, theta; /* use definitions from SLR paper, somewhat - different from those in John's abc2rf() */ - - for (j=n-1; j>=0; j--) - { - /* get real cj and complex sj now */ - cj = sqrt (1 / (1 + (b[j*2]*b[j*2] + b[j*2+1]*b[j*2+1])/ - (a[j*2]*a[j*2] + a[j*2+1]*a[j*2+1]) )); - sj[0] = re_div (b,j,a,j) * cj; - sj[1] = -im_div (b,j,a,j) * cj; - - /* get phi and theta now */ - phi = 2 * atan2 (mag(sj,0), cj); - theta = atan2 (sj[1],sj[0]); - - /* get rf now from phi and theta */ - rf[j*2] = phi * cos (theta); - rf[j*2+1] = phi * sin (theta); - - /* create new polynomials now */ - for (i=0; i<=j; i++) - { - a2[i*2] = cj * a[i*2] + sj[0] * b[i*2] - sj[1] * b[i*2+1]; - a2[i*2+1] = cj * a[i*2+1] + sj[0] * b[i*2+1] + sj[1] * b[i*2]; - b2[i*2] = -sj[0] * a[i*2] - sj[1] * a[i*2+1] + cj * b[i*2]; - b2[i*2+1] = -sj[0] * a[i*2+1] + sj[1] * a[i*2] + cj * b[i*2+1]; - } - - /* copy back into old polynomials now */ - /* try other way - for (i=0; i<=j-1; i++) - { - a[i*2] = a2[i*2+2]; - a[i*2+1] = a2[i*2+3]; - b[i*2] = b2[i*2]; - b[i*2+1] = b2[i*2+1]; - } */ - for (i=0; i<=2*j-1; i++) - { - a[i] = a2[i+2]; - b[i] = b2[i]; - } - } -} - diff --git a/RF_pulses/rf_tools/msinc.m b/RF_pulses/rf_tools/msinc.m deleted file mode 100644 index 28fc66c..0000000 --- a/RF_pulses/rf_tools/msinc.m +++ /dev/null @@ -1,15 +0,0 @@ -% h = msinc(n,m) -% -% Returns a hamming windowed sinc of length n, with m sinc-cycles, -% which means a time-bandwidth of 4*m -% - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function ms = msinc(n,m) - -x = [-n/2:(n-1)/2]/(n/2); -snc = sin(m*2*pi*x+0.00001)./(m*2*pi*x+0.00001); -ms = snc.*(0.54+0.46*cos(pi*x)); -ms = ms*4*m/(n); diff --git a/RF_pulses/rf_tools/remod.m b/RF_pulses/rf_tools/remod.m deleted file mode 100644 index d0773b0..0000000 --- a/RF_pulses/rf_tools/remod.m +++ /dev/null @@ -1,10 +0,0 @@ -function rfn = remod(rf,t,n,f); - -nc = t*f; -lrf = length(rf); - -w = [0:lrf-1]/lrf; -wi = (floor(w*n)+0.5)/n; - -rfn = rf.*exp(i*2*pi*w*nc).*exp(-i*2*pi*wi*nc); - diff --git a/RF_pulses/rf_tools/rf_tools manual.pdf b/RF_pulses/rf_tools/rf_tools manual.pdf deleted file mode 100644 index b872b50edee80907639251fd72a7a54acf21831e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1833628 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

m~`7RNoW6t_Xl6(9G~4h>E2&6 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 a@Mdk_tRH@|k$M!b>lK-Tj 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

C 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 %f~a(Kb#$sNo32SI4YbBDWmXo5G6 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 =Dsn*u`@M2M-Ar;L$Z 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
c4ubL;T{j!yzDh~h@a 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 diff --git a/RF_pulses/rf_tools/rfscale.m b/RF_pulses/rf_tools/rfscale.m deleted file mode 100644 index b9bfdd2..0000000 --- a/RF_pulses/rf_tools/rfscale.m +++ /dev/null @@ -1,12 +0,0 @@ -function rfs = rfscale(rf,t) - -% takes an RF waveform and scales it to kHz if played for time -% t (ms). Signa can handle at most 1 kHz. 700 Hz is better, -% and 500 Hz seems to be what product psd's use. - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -rfs = rf*length(rf)/(2*pi*t); - - diff --git a/RF_pulses/rf_tools/signa.m b/RF_pulses/rf_tools/signa.m deleted file mode 100644 index 483eb52..0000000 --- a/RF_pulses/rf_tools/signa.m +++ /dev/null @@ -1,63 +0,0 @@ -function signa(wav,fn,s) - -% -% signa(waveform, filename [,scale]); -% -% writes the waveform out as short integers with the low -% bit masked off. -% -% Inputs: -% waveform -- vector, may be complex -% filename -- string, if wavefrom is complex '.r' and '.i' are appended, -% and two files are written. -% scale -- optional scale. If unspecified, the waveform is scaled to -% full scale integer 32766. If specified, the output is -% waveform*scale*32766 -% - -% -% Written by John Pauly, Dec. 5, 1994 -% (c) Leland Stanford Jr. University -% - -wmax = hex2dec('7ffe'); - -% if no scale is specified, use as much dynamic range as possible -if nargin == 2, - s = 1/max(max(abs(real(wav)),abs(imag(wav)))); -end; - -% scale up to fit in a short integer -wav = wav*s*wmax; - -% mask off low bit, since it would be an EOS otherwise -wav = 2*round(wav/2); - -% if the imaginary component is zero, supress it -if sum(abs(imag(wav))) == 0, - wav = real(wav); -end; - -if isreal(wav), - fip = fopen(fn,'wb','b'); - if fip == -1, - disp(sprintf('Error opening %s for write',fn)); - return; - end; - fwrite(fip,wav,'short'); -else - fip = fopen([fn,'.r'],'wb','b'); - if fip == -1, - disp(sprintf('Error opening %s for write',[fn,'.r'])); - return; - end; - fwrite(fip,real(wav),'short'); - fclose(fip); - fip = fopen([fn,'.i'],'wb','b'); - if fip == -1, - disp(sprintf('Error opening %s for write',[fn,'.i'])); - return; - end; - fwrite(fip,imag(wav),'short'); - fclose(fip); -end; diff --git a/RF_pulses/rf_tools/t2hz.m b/RF_pulses/rf_tools/t2hz.m deleted file mode 100644 index 64a3de8..0000000 --- a/RF_pulses/rf_tools/t2hz.m +++ /dev/null @@ -1,18 +0,0 @@ -% -% Takes dimensionless x used by abr, and scales it to kHz based -% on pulse duration t (ms), using a particularly mysterious algorithm. -% -% fs = t2hz(x,t) -% -% x -- normalized frequency x vector used by abr -% t -- pulse duration in ms -% -% fs -- scaled frequency axis, in kHz -% - -% written by John Pauly, 1992 -% (c) Board of Trustees, Leland Stanford Junior University - -function fs = t2hz(x,t) - -fs = x/t; diff --git a/RF_pulses/rf_tools/verse.m b/RF_pulses/rf_tools/verse.m deleted file mode 100644 index 63ed6db..0000000 --- a/RF_pulses/rf_tools/verse.m +++ /dev/null @@ -1,29 +0,0 @@ -% rfv = verse(gv,rf) -% -% Computes the versed version of rf for a given time-vayring gradient gv -% -% written by John Pauly, 1992 -% Bug fixes by Peder Larson, 2007 -% (c) Board of Trustees, Leland Stanford Junior University - -function rfv = verse(g,rf) - -[m n] = size(g); -if m 0, - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)+z_d1), 'k--'); - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)-z_d1), ... - 'k--'); - else - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)), 'k--'); - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)), ... - 'k--'); - end; -end; -plot(ftest, abs(mxy_new)); -plot([-fs/2 -fs/2], [0 sin(ang)], 'g--'); -plot([fs/2 fs/2], [0 sin(ang)], 'g--'); -hold off - -figure; -subplot(211) -t_opt = [0:length(g_opt)-1] * SS_TS * 1e3; -plot(t_opt, g_opt); -title('Gradient Waveforms'); - -subplot(212) -plot(t_opt, real(rf_opt),t_opt, imag(rf_opt)); -title('RF Waveforms'); - - - -% fprintf(1,'Do you want to save file in Chuck''s format? \n'); -% ss_save(g_opt,rf_opt,ang,z_thk); - -fprintf(1,'Hit any key to continue:\n'); -pause; - - - -%% -fprintf(1, '************************************************************\n'); -fprintf(1, 'Here''s a C13 multiband slice (5mm) excitation pulse, for pyr dynamic imaging\n'); - -% setup flip angles and bandwidths, and ripple -df = 0.5e-6 * 30000 * 1070;% 0.5 ppm = gamma_C13 * 30000 * 0.5e-6 -clear a_angs d fspec mets -mets(1).name = 'pyr'; mets(1).f = -230; mets(1).df = 2*df; mets(1).ang = 3.3; mets(1).d = .005; -mets(2).name = 'ala'; mets(2).f = -45; mets(2).df = 1.3*df; mets(2).ang = 20; mets(2).d = .015; -mets(3).name = 'pyrh'; mets(3).f = 40; mets(3).df = 1*df; mets(3).ang = 0; mets(3).d = .02; -mets(4).name = 'lac'; mets(4).f = 165; mets(4).df = 1.3*df; mets(4).ang = 20; mets(4).d = .01; - -Npe = 8; % number of phase encode steps - -% create vectors of angles, ripples, and band edges -for n = 1:length(mets) - a_angs(n) = mets(n).ang*pi/180; - d(n) = mets(n).d; - fspec(2*n-1) = mets(n).f - mets(n).df; - fspec(2*n) = mets(n).f + mets(n).df; - disp([mets(n).name ' metab fraction remaining after Npe = ' int2str(Npe) ' encodes: ' num2str(cos(a_angs(n))^Npe)]) -end -disp(''); - -ang = max(a_angs); - -fmid = (mets(1).f+mets(end).f)/2; -fspec = fspec - fmid; -fctr = 0; - -z_thk = 0.5; % 5 mm -z_tb = 3; - -ptype = 'ex'; z_ftype='ls'; -z_d1 = 0.01; z_d2 = 0.01; - -s_ftype = 'lin'; -ss_type = 'EP Whole'; - -ss_opt([]); % Reset all options -opt = ss_opt({'Nucleus', 'Carbon', ... - 'Max Duration', 20e-3, ... - 'Num Lobe Iters', 15, ... - 'Max B1', 0.85, ... - 'Num Fs Test', 100, ... - 'Verse Fraction', 0.8, ... - 'SLR', 0, ... - 'B1 Verse', 0, ... - 'Min Order', 1,... - 'Spect Correct', 1}); - -[g,rf,fs,z,f,mxy] = ... - ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... - z_ftype, s_ftype, ss_type, fctr, 0); - -g_opt = g; -rf_opt = rf; - -% Now compare spectral profiles at z = 0 -ftest = [min([fspec -fs/2]):max([fs/2 fspec])]; -mxy_new = ss_response_mxy(g_opt, rf_opt, 0, ftest, SS_TS, SS_GAMMA); - -figure; -hold on; -nband = length(fspec)/2; -for band = 1:nband, - if a_angs(band) > 0, - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)+z_d1), 'k--'); - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)-z_d1), ... - 'k--'); - else - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)), 'k--'); - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)), ... - 'k--'); - end; -end; -plot(ftest, abs(mxy_new)); -plot([-fs/2 -fs/2], [0 sin(ang)], 'g--'); -plot([fs/2 fs/2], [0 sin(ang)], 'g--'); -hold off - -figure; -subplot(211) -t_opt = [0:length(g_opt)-1] * SS_TS * 1e3; -plot(t_opt, g_opt); -title('Gradient Waveforms'); - -subplot(212) -plot(t_opt, real(rf_opt),t_opt, imag(rf_opt)); -title('RF Waveforms'); - - -return; diff --git a/RF_pulses/spectral_spatial/examples/demo_mband_phs.m b/RF_pulses/spectral_spatial/examples/demo_mband_phs.m deleted file mode 100644 index 9b5cf53..0000000 --- a/RF_pulses/spectral_spatial/examples/demo_mband_phs.m +++ /dev/null @@ -1,132 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -% Reset SS package globals -% -ss_opt([]); -ss_globals; - - -%% -fprintf(1, '\nHere''s a C13 multiband slab (6cm) excitation pulse, for pyr+urea dynamic imaging\n'); - -% setup flip angles and bandwidths, and ripple -df = 0.5e-6 * 30000 * 1070;% 0.5 ppm = gamma_C13 * 30000 * 0.5e-6 - -phs_spec = 1 * pi / 180; - -mets(5).name = 'lac'; mets(5).f = 165; mets(5).df = 1.5*df; mets(5).ang = 12;mets(5).d = .005; -mets(5).phs = 0;mets(5).dphs=phs_spec; - -mets(4).name = 'pyrh'; mets(4).f = 40; mets(4).df = 1*df; mets(4).ang = 2.5; mets(4).d = .015; -mets(4).phs = pi/2;mets(4).dphs=phs_spec; - -mets(3).name = 'ala'; mets(3).f = -45; mets(3).df = 1.5*df; mets(3).ang = 12; mets(3).d = .005; -mets(3).phs = pi/2;mets(3).dphs=phs_spec; - -mets(2).name = 'pyr'; mets(2).f = -230; mets(2).df = 2*df; mets(2).ang = 6; mets(2).d = .002; -mets(2).phs = 0;mets(2).dphs=phs_spec; - -mets(1).name = 'urea'; mets(1).f = -465; mets(1).df = 2*df; mets(1).ang = 6; mets(1).d = .002; -mets(1).phs = 0;mets(1).dphs=phs_spec; - - - -Npe = 8; % number of phase encode steps - -% create vectors of angles, ripples, and band edges -clear a_angs d fspec a_phs d_phs -for n = 1:length(mets) - a_angs(n) = mets(n).ang*pi/180; - d(n) = mets(n).d; - a_phs(n) = mets(n).phs; - d_phs(n) = mets(n).dphs; - fspec(2*n-1) = mets(n).f - mets(n).df; - fspec(2*n) = mets(n).f + mets(n).df; - disp([mets(n).name ' metab fraction remaining after Npe = ' int2str(Npe) ' encodes: ' num2str(cos(a_angs(n))^Npe)]) -end -disp(''); - -ang = max(a_angs); - -fmid = (mets(1).f+mets(end).f)/2; -fspec = fspec - fmid; -fctr = 0; - -z_thk = 6; z_tb = 4; ss_type = 'Flyback Whole'; - -ptype = 'ex'; -z_ftype='ls'; -z_d1 = 0.002; -z_d2 = 0.01; - -s_ftype = 'lin'; - -ss_opt([]); % Reset all options -opt = ss_opt({'Nucleus', 'Carbon', ... - 'Max Duration', 24e-3, ... - 'Num Lobe Iters', 15, ... - 'Max B1', 1.6, ... - 'Num Fs Test', 100, ... - 'Verse Fraction', 0.2, ... - 'SLR', 0, ... - 'B1 Verse', 0, ... - 'Min Order', 1,... - 'Spect Correct', 1}); - -[g,rf,fs,z,f,mxy,isodelay] = ... - ss_design_phs(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, a_phs, d_phs, ptype, ... - z_ftype, s_ftype, ss_type, fctr, 0); - -g_opt = g; -rf_opt = rf; - -% Now compare spectral profiles at z = 0 -ftest = [min([fspec -fs/2]):max([fs/2 fspec])]; -mxy_new = ss_response_mxy(g_opt, rf_opt, 0, ftest, SS_TS, SS_GAMMA); - -figure; -hold on; -nband = length(fspec)/2; -for band = 1:nband, - if a_angs(band) > 0, - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)+z_d1), 'k--'); - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)-z_d1), ... - 'k--'); - else - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))+d(band)), 'k--'); - plot(fspec(band*2-1:band*2), ones(1,2)*(sin(a_angs(band))-d(band)), ... - 'k--'); - end; -end; -plot(ftest, abs(mxy_new)); -plot([-fs/2 -fs/2], [0 sin(ang)], 'g--'); -plot([fs/2 fs/2], [0 sin(ang)], 'g--'); -hold off - -figure; -subplot(211) -t_opt = [0:length(g_opt)-1] * SS_TS * 1e3; -plot(t_opt, g_opt); -title('Gradient Waveforms'); - -subplot(212) -plot(t_opt, real(rf_opt),t_opt, imag(rf_opt)); -title('RF Waveforms'); - -ss_save(g,rf,pi/2,z_thk,isodelay); - - diff --git a/RF_pulses/spectral_spatial/fftf.m b/RF_pulses/spectral_spatial/fftf.m deleted file mode 100644 index f14cd08..0000000 --- a/RF_pulses/spectral_spatial/fftf.m +++ /dev/null @@ -1,82 +0,0 @@ -function xf = fftf(x, N, dim) -% FFTF - Forward Fourier transform, shifted -% -% function xf = fftf(x, N, dim) -% -% x -- time samples -% N -- dimension of Fourier space -% - length of vector if unspecified -% - length of column if unspecified and xt a matrix -% dim -- dimension to operate over, only used if matrix -% - column dimension if unspecified -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fftf.m,v 1.3 2012/02/01 00:41:22 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - xsize = size(x); - if length(xsize) > 2, - error('Only handles 2D matrices'); - end; - - if nargin < 2, - [mnval, mndim] = min(xsize); - if mnval > 1, - dim = 1; - N = xsize(dim); - else - dim = 3-mndim; % Get opposite of mndim - N = xsize(dim); - end; - elseif nargin < 3, - [mnval, mndim] = min(xsize); - if mnval > 1, - dim = 1; - if (N < xsize(dim)) - error('N less than number of rows of x'); - end; - else - dim = 3-mndim; % Get opposite of mndim - if (N < xsize(dim)) - error('N less than number of elements of x'); - end; - end; - end; - - % Create zeropad array - % - fsize = xsize; - fsize(dim) = N; - pad = zeros(fsize); - - % Fill in pad array - % - Nd2 = ceil((N+1)/2); - nxd2 = ceil((xsize(dim)+1)/2); - sidx = Nd2 - nxd2 + 1; - if dim == 1, - pad(sidx:sidx+xsize(dim)-1, :) = x; - else - pad(:, sidx:sidx+xsize(dim)-1) = x; - end; - - xf = fftshift(fft(ifftshift(pad,dim),N,dim), dim); - - return; - \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/fftr.m b/RF_pulses/spectral_spatial/fftr.m deleted file mode 100644 index 7fe476d..0000000 --- a/RF_pulses/spectral_spatial/fftr.m +++ /dev/null @@ -1,78 +0,0 @@ -function x = fftr(xf, N, dim) -% FFTR - Reverse Fourier transform, shifted -% -% function x = fftr(xf, N, dim) -% -% xf -- Fourier samples -% N -- dimension of x space -% - length of vector if unspecified -% - length of column if unspecified and xt a matrix -% dim -- dimension to operate over, only used if matrix -% - column dimension if unspecified -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fftr.m,v 1.3 2012/02/01 00:41:22 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - xfsize = size(xf); - if length(xfsize) > 2, - error('Only handles 2D matrices'); - end; - - if nargin < 2, - [mnval, mndim] = min(xfsize); - if mnval > 1, - dim = 1; - N = xfsize(dim); - else - dim = 3-mndim; % Get opposite of mndim - N = xfsize(dim); - end; - elseif nargin < 3, - [mnval, mndim] = min(xfsize); - if mnval > 1, - dim = 1; - if (N > xfsize(dim)) - error('N greater than number of rows of xf'); - end; - else - dim = 3-mndim; % Get opposite of mndim - if (N > xfsize(dim)) - error('N greater than number of elements of xf'); - end; - end; - end; - - % Get transform along dim - % - xpad = fftshift(ifft(ifftshift(xf,dim),[],dim),dim); - - % Fill in pad array - % - Nd2 = ceil((N+1)/2); - nxfd2 = ceil((xfsize(dim)+1)/2); - sidx = nxfd2 - Nd2 + 1; - if dim == 1, - x = xpad(sidx:sidx+N-1, :); - else - x = xpad(:,sidx:sidx+N-1); - end; - - return; - \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/fir_expand.m b/RF_pulses/spectral_spatial/fir_expand.m deleted file mode 100644 index d15a360..0000000 --- a/RF_pulses/spectral_spatial/fir_expand.m +++ /dev/null @@ -1,408 +0,0 @@ -% function [h, fn, an, dn] = fir_expand(n, f, a, d, a_min, dbg) -% -% Inputs: -% n: number of taps -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% a_min: minimum amplitude to allow, default if empty is min(0,min(a-d)); -% dbg: flag to turn on debugging statements/plots -% -% Outputs -% h: new filter -% fn: new frequency bands -% an: new amplitudes -% dn: new ripple -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_expand.m,v 1.5 2012/02/01 00:41:22 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -function [hn,fn,an,dn,status] = fir_expand(n,f,a,d,a_min,dbg) - - % Check input parameters - % - if nargin < 4, - error(['Usage: function [h,fn,an,dn,status] = fir_expand(n,f,a,' ... - 'd,[dbg])']); - end; - - if nargin < 5, - a_min = []; - end; - - if nargin < 6, - dbg = 0; - end; - - if (find(a(1:2:end)-a(2:2:end))) - error('Only works for flat bands now'); - end; - - % Confirm baseline design works - % - fn = f; - an = a; - dn = d; - [hn,status] = fir_pm(n,f,a,d,a_min,dbg); - if strcmp(status,'Failed') -% warning('Baseline design infeasible.'); - return; - end; - - % Now get number of transition regions, and type of filter - % - nband = length(f)/2; - if min(f) < 0, - real_filter = 0; - else - real_filter = 1; - end; - - if bitget(n,1) == 1, - odd_filter = 1; - else - odd_filter = 0; - end; - - % Get frequency grid - % - oversamp = 7; - if real_filter - m = oversamp * n; - fg = [0:m-1]/(m-1); - else - m = 2 * oversamp * n; - fg = [-m/2:m/2-1]/(m/2); - end; - - % Keep expanding each filter band up to point filter fails - % Choose lower-amplitude band to expand if possible, else expand - % bands equally - % - fbest = f; - if real_filter, - ntran = nband+1; - else - ntran = nband; - end; - if dbg >= 2, - ftry_fig = figure; - end - - for tran = 1:ntran, - if dbg >= 1, - fprintf(1, 'Optimizing transition %d of %d\n', tran, ntran); - end; - - % Get indices of left/right bands - % - if real_filter - if (tran == 1) - lband = 0; % Real-filter, no band left of band 1 - rband = 1; - elseif (tran == nband+1) - lband = nband; - rband = 0; - else - lband = tran-1; - rband = tran; - end; - else - lband = mod(tran-2,nband)+1; - rband = mod(tran-1,nband)+1; - end; - - % Get starting fgrid indices corresponding to - % band edges. - % - if lband ~= 0, - lidx = find((fg <= f(lband*2)), 1, 'last'); - end; - if rband ~= 0, - ridx = find((fg >= f(rband*2-1)), 1, 'first'); - end; - - % Get max number of grid points the band edges - % can move, as well as the step size for each - % band - % - if rband == 0, - nlmax = m - lidx; - nrmax = 0; - elseif lband == 0, - nlmax = 0; - nrmax = ridx - 1; - else - nlmax = mod(ridx-lidx, m); - nrmax = nlmax; - end; - ntotal = max(nlmax, nrmax); - - % Find order of band edges to expand - % -- preference is to expand stopbands first, then passbands - % in order to minimize energy in filter - - % Only add bands that are stopbands - % - band_order = []; - if ((lband ~= 0) && (rband~=0)) - if a(lband*2) == min(a) - band_order = [0]; - end; - if (a(rband*2) == min(a)) - band_order = [band_order 1]; - end; - elseif (lband ~= 0) - if a(lband*2) == min(a) - band_order = [band_order 0]; - end; - elseif (rband ~= 0) - if (a(rband*2) == min(a)) - band_order = [band_order 1]; - end; - end; - - if 0 - band_order = [0 1]; % 0 = left, 1 = right - if ((lband ~= 0) && (rband ~= 0) && ... - (a(lband*2) > a(rband*2-1))), % swap order - band_order = [1 0]; - end; - end; - - - % Bisection search on how many points to add to band - % edges. nlbot and nrbot are known working solutions. - % - nlbot = 0; nltop = nlmax; - nrbot = 0; nrtop = nrmax; - for working_band = band_order, - if working_band == 0, % lband - if dbg >= 2, - fprintf(1, 'Expanding left edge...\n'); - end; - % Update nltop for any right edge expansion - % - if lband ~= 0 - nltop = min(nltop, ntotal-nrbot); - end - while ((nltop - nlbot) > 0) - - if dbg >= 2, - fprintf(1,'nlbot: %d nltop: %d -- nrbot: %d nrtop: %d -- ntotal: %d\n', ... - nlbot, nltop, nrbot, nrtop, ntotal); - end; - % Advance left band and calculate feasibility - % - nltry = ceil((nltop + nlbot)/2); - lidxtry = mod(lidx + nltry -1, m) + 1; - ftry_cont = fbest; - ftry_cont(lband*2) = fg(lidxtry); - - % Create new freq spec from ftry_cont that removes - % any possible wraps (only occurs for complex filters) - % - ftry = ftry_cont; - atry = a; - dtry = d; - if ftry(1) > ftry(2), - if (ftry(1) == 1), - ftry(1) = -1; - else - ftry = [-1 ftry(2:end) ftry(1) 1]; - atry = [a a(1) a(2)]; - dtry = [d d(1)]; - end; - elseif ftry(end-1) > ftry(end), - if (ftry(end) == -1) - ftry(end) = 1; - else - ftry = [-1 ftry(end) ftry(1:end-1) 1]; - atry = [a(end) a(end) a]; - dtry = [d(end) d]; - end; - end; - - if dbg>=2, - clf; - hold on; - nb = length(ftry)/2; - for bnd = 1:nb, - plot([ftry(bnd*2-1) ftry(bnd*2-1) ftry(bnd*2) ftry(bnd*2)], ... - log10(1+[0 (atry(bnd*2-1)+dtry(bnd)) (atry(bnd*2)+dtry(bnd)) 0]), 'r'); - end; - for bnd = 1:nband, - plot([f(bnd*2-1) f(bnd*2-1) f(bnd*2) f(bnd*2)], ... - log10(1+[0 (a(bnd*2-1)+d(bnd)) (a(bnd*2)+d(bnd)) 0]), 'b'); - end; - drawnow; - fprintf(1,''); - pause; - fprintf(1,'\r \r'); - end; - - if any(diff(ftry) <= 0) - status = 'Failed'; - else - [h,status] = fir_pm(n,ftry,atry,dtry,a_min,dbg); - end; - if strcmp(status, 'Solved') - if dbg >= 3, - fprintf(1,'nltry: %d Solved\n',nltry); - end; - % Update nlbot - % - nlbot = nltry; - - % Update current best results - % - fbest = ftry_cont; - - % Update output - % - hn = h; - fn = ftry; - an = atry; - dn = dtry; - else - if dbg >= 3, - fprintf(1,'nltry: %d Failed\n',nltry); - end; - % Update nltop - % - if nltop == nlbot+1 - nltop = nlbot; - else - nltop = nltry; - end; - end; - end; % while - else % working band is rband - if dbg >= 2, - fprintf(1, 'Expanding right edge...\n'); - end; - % Update nrtop for any left edge expansion - % - if rband ~= 0 - nrtop = min(nrtop, ntotal-nlbot); - end - while ((nrtop - nrbot) > 0) - if dbg >= 2, - fprintf(1,'nlbot: %d nltop: %d -- nrbot: %d nrtop: %d -- ntotal: %d\n', ... - nlbot, nltop, nrbot, nrtop, ntotal); - end; - % Advance right band and calculate feasibility - % - nrtry = ceil((nrtop + nrbot)/2); - ridxtry = mod(ridx - nrtry -1, m) + 1; - ftry_cont = fbest; - ftry_cont(rband*2-1) = fg(ridxtry); - - % Create new freq spec from ftry_cont that removes - % any possible wraps (only occurs for complex filters) - % - ftry = ftry_cont; - atry = a; - dtry = d; - if ftry(1) > ftry(2), - if (ftry(1) == 1) - ftry(1) = -1; - else - ftry = [-1 ftry(2:end) ftry(1) 1]; - atry = [a a(1) a(2)]; - dtry = [d d(1)]; - end; - elseif ftry(end-1) > ftry(end), - if (ftry(end) == -1) - ftry(end) = 1; - else - ftry = [-1 ftry(end) ftry(1:end-1) 1]; - atry = [a(end) a(end) a]; - dtry = [d(end) d]; - end; - end; - - if dbg>=2, - clf; - hold on; - nb = length(ftry)/2; - for bnd = 1:nb, - plot([ftry(bnd*2-1) ftry(bnd*2-1) ftry(bnd*2) ftry(bnd*2)], ... - log10(1+[0 (atry(bnd*2-1)+dtry(bnd)) (atry(bnd*2)+dtry(bnd)) 0]), 'r'); - end; - for bnd = 1:nband, - plot([f(bnd*2-1) f(bnd*2-1) f(bnd*2) f(bnd*2)], ... - log10(1+[0 (a(bnd*2-1)+d(bnd)) (a(bnd*2)+d(bnd)) 0]), 'b'); - end; - drawnow; - fprintf(1,''); - pause; - fprintf(1,'\r \r'); - end; - - if any(diff(ftry) <= 0) - status = 'Failed'; - else - [h,status] = fir_pm(n,ftry,atry,dtry,a_min,dbg); - end; - if strcmp(status, 'Solved') - if dbg >= 3, - fprintf(1,'nrtry: %d Solved\n',nrtry); - end; - - % Update nrbot - % - nrbot = nrtry; - - % Update current best results - % - fbest = ftry_cont; - - % Update output - % - hn = h; - fn = ftry; - an = atry; - dn = dtry; - else - if dbg >= 3, - fprintf(1,'nrtry: %d Failed\n',nrtry); - end; - % Update nrtop - % - if nrtop == nrbot+1 - nrtop = nrbot; - else - nrtop = nrtry; - end; - end; - end; % while - end; % if working band - end; % for working band - if dbg >= 2, - fprintf(1,'nlbot: %d nltop: %d -- nrbot: %d nrtop: %d -- ntotal: %d\n', ... - nlbot, nltop, nrbot, nrtop, ntotal); - end; - end % for tran - - status = 'Solved'; - - diff --git a/RF_pulses/spectral_spatial/fir_linprog.m b/RF_pulses/spectral_spatial/fir_linprog.m deleted file mode 100644 index 1f39e2f..0000000 --- a/RF_pulses/spectral_spatial/fir_linprog.m +++ /dev/null @@ -1,380 +0,0 @@ - -function [h, status] = fir_linprog(n, f, a, d, h0, dbg) -% FIR_LINPROG - FIR filter design using linear programming -% -% Design n-tap linear-phase filter that meets multiband frequency -% specification. If h0 is provided, it is used as an initial -% estimate of the filter taps. -% -% Also constrain H(f) > min(0, min(a(1:2:end)-d), min(a(2:2:end)-d)) -% Also minimizes sum(H(f)) in transition bands. -% -% function [h, status] = fir_linprog(n, f, a, d, h0, dbg) -% -% Inputs: --- similar to cfirpm -% n: number of taps returned -% f: frequency bands (-1->1) -% a: amplitude at band edges -% d: ripple in bands -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_linprog.m,v 1.11 2013/08/15 16:01:59 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - % Default value for dbg - % - if nargin < 6, - dbg = 0; - end; - - % Determine if real or complex coefficients - % - f = f * pi; % Scale to +/- pi - if min(f) < 0, - real_filter = 0; - else - real_filter = 1; - end; - - % Determine if filter has odd or even number of - % taps - % - if (bitget(n,1) == 1) - odd_filter = 1; - else - odd_filter = 0; - end; - - % If the frequency specification has a non-zero point - % at +/- 1, then the order must be even. A warning is - % printed and a failure returned if this is the case. - % - if (~odd_filter) - idx = find(abs(f) == pi); - if find(a(idx) == 1) - warning('n odd and frequency spec 1 at fs/2'); - - status = 'Failed'; - h = []; - return; - end; - end; - - % Determine number of optimization parameters - % - nhalf = ceil(n/2); % number of taps in half-side of - % filter - nx = nhalf; - if ~real_filter, - if odd_filter, - nx = 2*nhalf-1; - else - nx = 2*nhalf; - end; - end; - - % Create optimization arrays - % - oversamp = 15; - undersamp_tran = 1; % Undersampling factor for transition - % regions - % Get first pass on w - % - if real_filter, - m = oversamp * n; - w = linspace(0,pi,m); - else - m = 2 * oversamp * n; - w = linspace(-pi,pi,m); - end; - - % Add explicit samples to w at the edge of each specified band - % - w = sort([w f]); - - % Find indices to passbands/stopbands, and fill in upper/lower bounds - % - idx_band = []; U_band = []; L_band = []; - nband = length(f)/2; - for band = 1:nband, - idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); - % Get amplitude from linear interpolation on band - % - idx_band = [idx_band idx]; - if (f(band*2-1) == f(band*2)) - amp = a(band*2-1); - else - amp = a(band*2-1) + (a(band*2)-a(band*2-1)) * ... - ((w(idx) - f(band*2-1))/(f(band*2)-f(band*2-1))); - end; - U_band = [U_band (amp + d(band))]; - L_band = [L_band (amp - d(band))]; - end; - - % Get transition indices - % - idx_tmp = ones(1,length(w)); - idx_tmp(idx_band) = 0; - idx_tran = find(idx_tmp == 1); - - % Get average representation of response - % - lb_resp = size(w); - lb_resp(idx_band) = (U_band + L_band)/2; - lb_resp(idx_tran) = (max(U_band) + min(L_band))/2; - if real_filter, - lb_resp = [lb_resp(end:-1:1) lb_resp(2:end-1)]; - end; - if dbg >= 3, - if real_filter, - wplot = [-w(end:-1:1) w(2:end-1)]; - else - wplot = w; - end; - figure; - plot(wplot,lb_resp); - end; - - % Fill in x0 with whatever taps are available from h0 - % - if nargin < 5 || isempty(h0), - h0 = []; - end; - x0 = fill_opt_param(h0,nx,real_filter,odd_filter,lb_resp,dbg); - - % Decimate w in transition regions - % - idx_tran = idx_tran(1:undersamp_tran:end); - - % Add transition band limits to be between the + max - % specification on each band and min of (0,min(L_band)) - % - if ~isempty(idx_tran) - U_amp_tran = max(U_band); - U_tran = U_amp_tran*ones(1,length(idx_tran)); - L_amp_tran = min(0, min(L_band)); - L_tran = L_amp_tran*ones(1,length(idx_tran)); - else - U_tran = []; - L_tran = []; - end; - - % Update w, idx_band - % - wband = w(idx_band); - idx_band = [1:length(wband)]; - wtran = w(idx_tran); - idx_tran = [1:length(wtran)] + length(wband); - w = [wband(:).' wtran(:).']; - m = size(w,2); - - if dbg >= 3, - figure; - plot(w(idx_band),U_band,'*'); - hold on; - plot(w(idx_band),L_band,'o'); - plot(w(idx_tran),U_tran,'r*'); - plot(w(idx_tran),L_tran,'ro'); - pause; - end; - - if real_filter - % create optimization matrices - % A is the matrix used to compute the power spectrum - % A(w,:) = [1 2*cos(w) 2*cos(2*w) ... 2*cos(n*w)] - if (odd_filter) - Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; - else - Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; - end; - Asin = []; - else - if (odd_filter) - Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; - Asin = [2*sin(kron(w',[1:nhalf-1]))]; - else - Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; - Asin = [2*sin(kron(w',[0:nhalf-1]+0.5))]; - end; - end; - - % Get subset of A matrix for current order - % - A = [Acos Asin]; - - % Build matrix for upper bound constraints - % - A_U = [A(idx_band,:); A(idx_tran,:)]; - U_b = [U_band U_tran]; - - % Build matrices for lower bound constraints - % - A_L = [A(idx_band, :); A(idx_tran,:)]; - L_b = [L_band L_tran]; - - % Combine matrices - % - A_b = [A_U; -A_L]; - b = [U_b -L_b]; - - % Set minimization vector to add up transform - % in transition region. For magnitude filter design - % this will minimize the energy. - % - fmin = sum(A(idx_tran,:), 1); - - % Call minimization routine - % - if real_filter, - [x,fval,exitflag,output] = ... - linprog(fmin, A_b, b, [],[],[],[],x0,... - optimset('LargeScale', 'off', 'Algorithm', 'active-set', ... - 'Display','off')); - else - [x,fval,exitflag,output] = ... - linprog(fmin, A_b, b, [],[],[],[],x0,... - optimset('LargeScale','off', 'Algorithm', 'active-set', 'Display','off')); - end; - - if dbg >= 3, - H = A * x; - figure; - plot_spec(f,a,d); - [wsort, sidx] = sort(w); - plot(w(sidx), H(sidx)); - hold on; - plot(w(sidx), H(sidx),'rx'); - title('Frequency response calculated with A'); - end; - - if (exitflag == 1) % feasible - h = fill_h(x,nhalf,real_filter, odd_filter,dbg); - status = 'Solved'; - else - h = []; - status = 'Failed'; - end; - return; - -function h = fill_h(x,nhalf,real_filter,odd_filter,dbg) -% Function to fill in filter taps from optimization parameters -% - x = x(:); - if real_filter, - if odd_filter, - h = x(1:end); - h = [x(end:-1:2); h]; - else - h = x(1:end); - h = [x(end:-1:1); h]; - end; - else - if odd_filter, - h = x(1:nhalf) + i * [0; x(nhalf+1:end)]; - h = [conj(h(end:-1:2)); h]; - else - h = x(1:nhalf) + i * x(nhalf+1:end); - h = [conj(h(end:-1:1)); h]; - end; - end; - - return; - -function x0 = fill_opt_param(h0,nx,real_filter,odd_filter,lb_resp,dbg) -% Function to fill in optimization vector given a filter -% description. Doesn't really work well unless the previous -% filter shares the same oddness/evenness so I will ignore -% that case for now -% - % Initialize x0 and x lengths - % - x0 = zeros(nx,1); - if real_filter, - nx_half = nx; - else - if odd_filter, - nx_half = (nx+1)/2; - else - nx_half = nx/2; - end; - end; - - % Initialize whether FFT init should be used - % - fft_init = 0; - - if isempty(h0), - fft_init = 1; - else - % Get lengths - % - nh = length(h0); - nh_half = ceil(nh/2); - - % Check to see if the oddness/evenness of the filter - % is the same - % - if ((odd_filter && ~bitget(nh,1)) || ... - (~odd_filter && bitget(nh,1))) - fft_init = 1; - end; - end; - - if (fft_init), - % Get FFT of lower bound to use as initialization - % - nh_half = nx_half; - if odd_filter, - nh = nh_half*2 - 1; - else - nh = nh_half * 2; - end; - h0 = fftr(hamming(length(lb_resp)).*lb_resp(:),nh); - end; - - % Now copy taps - % - if odd_filter, - if real_filter, - x0(1:min(nx_half,nh_half)) = ... - real(h0(nh_half:nh_half+min(nx_half,nh_half)-1)); - else - x0(1:min(nx_half,nh_half)) = ... - real(h0(nh_half:nh_half+min(nx_half,nh_half)-1)); - x0(nx_half+1:nx_half+min(nx_half,nh_half)-1) = ... - imag(h0(nh_half+1:nh_half+min(nx_half,nh_half)-1)); - end; - else - if real_filter, - x0(1:min(nx_half,nh_half)) = ... - real(h0(nh_half+1:nh_half+min(nx_half,nh_half))); - else - x0(1:min(nx_half,nh_half)) = ... - real(h0(nh_half+1:nh_half+min(nx_half,nh_half))); - x0(nx_half+1:nx_half+min(nx_half,nh_half)) = ... - imag(h0(nh_half+1:nh_half+min(nx_half,nh_half))); - end; - end; -return; - - - - - diff --git a/RF_pulses/spectral_spatial/fir_min_order.m b/RF_pulses/spectral_spatial/fir_min_order.m deleted file mode 100644 index d7cfcf4..0000000 --- a/RF_pulses/spectral_spatial/fir_min_order.m +++ /dev/null @@ -1,231 +0,0 @@ -% Determines minimum-order linear-phase filter that meets -% amplitude/ripple specifications. -% -% function [h, status] = fir_min_order(n, f, a, d, odd_or_even, a_min, dbg) -% -% Inputs: --- similar to cfirpm -% n: max number of taps to try -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% even_odd: 1 - odd only -% 2 - even only -% anything else - either odd or even -% a_min: minimum amplitude in transition regions, if [], then -% min(0, min(a-d)) is used -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_min_order.m,v 1.11 2012/02/01 00:41:22 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% -% Bisection search calling fir_pm to determine minimum order -% filter that meets linear phase requirements. By default it will check both -% odd and even length filters. If a non-zero point exists at +/- 1, it will -% only check odd filters. Only odd or even filters can be specified by the -% parameter odd_even. -% -% Inputs: -% n - number of taps -% f - frequency bands -% a - amplitudes at band edges -% even_odd: 1 - odd only -% 2 - even only -% anything else - either odd or even -% dbg - level of debug info to print -% - -function [h, status] = fir_min_order(n, f, a, d, even_odd, a_min, dbg) - if nargin < 4, - error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... - ' a_min, dbg)']); - end; - - if nargin < 5 || isempty(even_odd), - even_odd = 0; - end; - switch (even_odd) - case {1, 2} - otherwise - even_odd = 0; - end; - - if nargin < 6, - a_min = []; - end; - - if nargin < 7, - dbg = 0; - end; - - % Initialize best odd/even filters - % - hbest_odd = []; - hbest_even = []; - - % Get max odd/even num taps - % - n_odd_max = 2*floor((n-1)/2)+1; - n_even_max = 2*floor(n/2); - - if dbg >= 2, - filt_fig = figure; - end; - % Test odd filters first - % - if even_odd ~= 2, - n_bot = 1; - n_top = (n_odd_max+1)/2; - n_cur = n_top; - if (dbg) - fprintf(1, 'Testing odd length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = (n_cur * 2 - 1); - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_pm(n_tap, f, a, d, a_min, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_odd = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - if (dbg >= 2) - figure(filt_fig); - clf; - hold on; - plot_spec(f,a,d); - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - plot(freq,real(H)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - % Test even filters now - % - if even_odd ~= 1, - n_bot = 1; - if isempty(hbest_odd), - n_top = n_even_max/2; - n_cur = n_top; - else - n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); - n_cur = n_top; - end; - if (dbg) - fprintf(1, 'Testing even length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = n_cur * 2; - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_pm(n_tap, f, a, d, a_min, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_even = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - if (dbg >= 2) - figure(filt_fig); - clf; - hold on; - plot_spec(f,a,d); - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - plot(freq,real(H)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - if isempty(hbest_odd) && isempty(hbest_even), - status = 'Failed'; - h = []; - if dbg, - fprintf(1,'\nFailed to achieve specs\n'); - end; - else - status = 'Solved'; - if length(hbest_odd) > length(hbest_even), - h = hbest_odd; - else - h = hbest_even; - end; - if dbg, - fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); - end; - end; - diff --git a/RF_pulses/spectral_spatial/fir_min_order_linprog.m b/RF_pulses/spectral_spatial/fir_min_order_linprog.m deleted file mode 100644 index 40f7e28..0000000 --- a/RF_pulses/spectral_spatial/fir_min_order_linprog.m +++ /dev/null @@ -1,226 +0,0 @@ -% Based on -% "FIR Filter Design via Spectral Factorization and Convex Optimization" -% by S.-P. Wu, S. Boyd, and L. Vandenberghe -% -% function [h, status] = fir_min_order_linprog(n, f, a, d, even_odd, dbg) -% -% Bisection search calling fir_linprog to determine minimum order -% filter that meets linear phase requirements. By default it will check both -% odd and even length filters. If a non-zero point exists at +/- 1, it will -% only check odd filters. Only odd or even filters can be specified by the -% parameter odd_even. -% -% Inputs: -% n - number of taps -% f - frequency bands -% a - amplitudes at band edges -% d - ripple in bands -% even_odd: 1 - odd only -% 2 - even only -% x - either odd or even -% dbg - level of debug info to print -% -% function [h, status] = fir_min_order_linprog(n, f, a, d, dbg) -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_min_order_linprog.m,v 1.5 2013/08/15 15:56:12 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - -function [h, status] = fir_min_order_linprog(n, f, a, d, even_odd, dbg) - if nargin < 4, - error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... - ' dbg)']); - end; - - status = 'Failed'; - h = []; - - if nargin < 5 || isempty(even_odd), - even_odd = 0; - end; - switch (even_odd) - case {1, 2} - otherwise - even_odd = 0; - end; - - if nargin < 6, - dbg = 0; - end; - - % Initialize best odd/even filters - % - hbest_odd = []; - hbest_even = []; - - % Get max odd/even num taps - % - n_odd_max = 2*floor((n-1)/2)+1; - n_even_max = 2*floor(n/2); - - if dbg >= 2, - filt_fig = figure; - end; - % Test odd filters first - % - if even_odd ~= 2, - n_bot = 1; - n_top = (n_odd_max+1)/2; - n_cur = n_top; - if (dbg) - fprintf(1, 'Testing odd length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = (n_cur * 2 - 1); - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_linprog(n_tap, f, a, d, hbest_odd, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_odd = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - if (dbg >= 2) - figure(filt_fig); - clf; - hold on; - plot_spec(f,a,d); - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - plot(freq,real(H)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - % Test even filters now - % - if even_odd ~= 1, - n_bot = 1; - if isempty(hbest_odd), - n_top = n_even_max/2; - n_cur = n_top; - else - n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); - n_cur = n_top; - end; - if (dbg) - fprintf(1, 'Testing even length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = n_cur * 2; - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_linprog(n_tap, f, a, d, hbest_even, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_even = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - if (dbg >= 2) - figure(filt_fig); - clf; - hold on; - plot_spec(f,a,d); - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - plot(freq,real(H)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - if isempty(hbest_odd) && isempty(hbest_even), - status = 'Failed'; - h = []; - if dbg, - fprintf(1,'\nFailed to achieve specs\n'); - end; - else - status = 'Solved'; - if (isempty(hbest_odd)) - h = hbest_even; - elseif (isempty(hbest_even)) - h = hbest_odd; - elseif (length(hbest_odd) < length(hbest_even)) - h = hbest_odd; - else - h = hbest_even; - end; - - if dbg, - fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); - end; - end; - diff --git a/RF_pulses/spectral_spatial/fir_min_order_qprog.m b/RF_pulses/spectral_spatial/fir_min_order_qprog.m deleted file mode 100644 index b603453..0000000 --- a/RF_pulses/spectral_spatial/fir_min_order_qprog.m +++ /dev/null @@ -1,228 +0,0 @@ -% Based on -% "FIR Filter Design via Spectral Factorization and Convex Optimization" -% by S.-P. Wu, S. Boyd, and L. Vandenberghe -% -% Bisection search calling fir_qprog to determine minimum order -% filter that meets linear phase requirements. By default it will check both -% odd and even length filters. If a non-zero point exists at +/- 1, it will -% only check odd filters. Only odd or even filters can be specified by the -% parameter odd_even. -% -% function [h, status] = fir_min_order_qprog(n, f, a, d, even_odd, dbg) -% -% Inputs: -% n - number of taps -% f - frequency bands -% a - amplitudes at band edges -% d - ripple in bands -% even_odd: 1 - odd only -% 2 - even only -% x - either odd or even -% dbg - level of debug info to print -% -% Also constrains H(f) > max(0, min(a(1:2:end)-d), min(a(2:2:end)-d)) -% Also minimizes sum(|H(f)|^2) in transition bands. -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_min_order_qprog.m,v 1.1 2013/08/15 15:53:38 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% - -function [h, status] = fir_min_order_qprog(n, f, a, d, even_odd, dbg) - if nargin < 4, - error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... - ' dbg)']); - end; - - status = 'Failed'; - h = []; - - if nargin < 5 || isempty(even_odd), - even_odd = 0; - end; - switch (even_odd) - case {1, 2} - otherwise - even_odd = 0; - end; - - if nargin < 6, - dbg = 0; - end; - - % Initialize best odd/even filters - % - hbest_odd = []; - hbest_even = []; - - % Get max odd/even num taps - % - n_odd_max = 2*floor((n-1)/2)+1; - n_even_max = 2*floor(n/2); - - if dbg >= 2, - filt_fig = figure; - end; - % Test odd filters first - % - if even_odd ~= 2, - n_bot = 1; - n_top = (n_odd_max+1)/2; - n_cur = n_top; - if (dbg) - fprintf(1, 'Testing odd length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = (n_cur * 2 - 1); - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_qprog(n_tap, f, a, d, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_odd = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - if (dbg >= 2) - figure(filt_fig); - clf; - hold on; - plot_spec(f,a,d); - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - plot(freq,real(H)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - % Test even filters now - % - if even_odd ~= 1, - n_bot = 1; - if isempty(hbest_odd), - n_top = n_even_max/2; - n_cur = n_top; - else - n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); - n_cur = n_top; - end; - if (dbg) - fprintf(1, 'Testing even length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = n_cur * 2; - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_qprog(n_tap, f, a, d, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_even = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - if (dbg >= 2) - figure(filt_fig); - clf; - hold on; - plot_spec(f,a,d); - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - plot(freq,real(H)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - if isempty(hbest_odd) && isempty(hbest_even), - status = 'Failed'; - h = []; - if dbg, - fprintf(1,'\nFailed to achieve specs\n'); - end; - else - status = 'Solved'; - if (isempty(hbest_odd)) - h = hbest_even; - elseif (isempty(hbest_even)) - h = hbest_odd; - elseif (length(hbest_odd) < length(hbest_even)) - h = hbest_odd; - else - h = hbest_even; - end; - - if dbg, - fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); - end; - end; - diff --git a/RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m b/RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m deleted file mode 100644 index 1c0019c..0000000 --- a/RF_pulses/spectral_spatial/fir_min_order_qprog_phs.m +++ /dev/null @@ -1,213 +0,0 @@ -% Based on -% "FIR Filter Design via Spectral Factorization and Convex Optimization" -% by S.-P. Wu, S. Boyd, and L. Vandenberghe -% -% Determines minimum-order linear-phase filter that meets -% amplitude/ripple specifications. -% -% function [h, status] = fir_min_order(n, f, a, d, dbg) -% -% Inputs: --- similar to cfirpm -% n: max number of taps to try -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_min_order_qprog_phs.m,v 1.2 2012/06/27 16:49:53 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% -% Bisection search calling fir_qprog to determine minimum order -% filter that meets linear phase requirements. By default it will check both -% odd and even length filters. If a non-zero point exists at +/- 1, it will -% only check odd filters. Only odd or even filters can be specified by the -% parameter odd_even. -% -% Inputs: -% n - number of taps -% f - frequency bands -% a - amplitudes at band edges -% even_odd: 1 - odd only -% 2 - even only -% x - either odd or even -% dbg - level of debug info to print -% - -function [h, status] = fir_min_order_qprog_phs(n, f, a, d, even_odd, dbg) - if nargin < 4, - error(['Usage: function [h, status] = fir_min_order(n, f, a, d, even_odd,' ... - ' dbg)']); - end; - - status = 'Failed'; - h = []; - - if nargin < 5 || isempty(even_odd), - even_odd = 0; - end; - switch (even_odd) - case {1, 2} - otherwise - even_odd = 0; - end; - - if nargin < 6, - dbg = 0; - end; - - % Initialize best odd/even filters - % - hbest_odd = []; - hbest_even = []; - - % Get max odd/even num taps - % - n_odd_max = 2*floor((n-1)/2)+1; - n_even_max = 2*floor(n/2); - - % Test odd filters first - % - if even_odd ~= 2, - n_bot = 1; - n_top = (n_odd_max+1)/2; - n_cur = n_top; - if (dbg) - fprintf(1, 'Testing odd length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = (n_cur * 2 - 1); - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_qprog_phs(n_tap, f, a, d, hbest_odd, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_odd = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - % Test even filters now - % - if even_odd ~= 1, - n_bot = 1; - if isempty(hbest_odd), - n_top = n_even_max/2; - n_cur = n_top; - else - n_top = min(n_even_max/2, (length(hbest_odd)+1)/2); - n_cur = n_top; - end; - if (dbg) - fprintf(1, 'Testing even length filters...\n'); - end; - while (n_top - n_bot > 1), - n_tap = n_cur * 2; - if (dbg) - fprintf(1, '%4d taps: ...', n_tap) - end; - [h, status] = fir_qprog_phs(n_tap, f, a, d, hbest_even, dbg); - if strcmp(status, 'Solved') - % feasible - hbest_even = h; - if dbg, - fprintf(1,'Feasible\n'); - end; - n_top = n_cur; - if n_top == n_bot+1, - n_cur = n_bot; - else - n_cur = ceil((n_top + n_bot)/2); - end; - else - if dbg, - fprintf(1,'Infeasible\n'); - end; - n_bot = n_cur; - n_cur = ceil((n_bot+n_top)/2); - end; - end; - end - - if isempty(hbest_odd) && isempty(hbest_even), - status = 'Failed'; - h = []; - if dbg, - fprintf(1,'\nFailed to achieve specs\n'); - end; - else - status = 'Solved'; - if (isempty(hbest_odd)) - h = hbest_even; - elseif (isempty(hbest_even)) - h = hbest_odd; - elseif (length(hbest_odd) < length(hbest_even)) - h = hbest_odd; - else - h = hbest_even; - end; - - % dbg = 2; - if (dbg >= 2) - filt_fig = figure; - - m = 512; - H = fftf(h, m); - freq = [-m/2:m/2-1]/m*2; - - % Correct H by half-sample offset if even number of taps - % - n_tap = length(h); - if bitget(n_tap,1) == 0, - H = H .* exp(-i*pi*freq(:)*0.5); - end; - - figure(filt_fig); - clf; - hold on; - plot_spec_phs(f,a,d,freq,H); - title('Frequency Response'); - xlabel('Normalized Frequency'); - fprintf(1,'Pausing...'); - pause; - fprintf(1,'\r \r'); - end; - - if dbg, - fprintf(1,'\nOptimum number of filter taps is: %d.\n',length(h)); - end; - end; - diff --git a/RF_pulses/spectral_spatial/fir_minphase.m b/RF_pulses/spectral_spatial/fir_minphase.m deleted file mode 100644 index 9627a49..0000000 --- a/RF_pulses/spectral_spatial/fir_minphase.m +++ /dev/null @@ -1,210 +0,0 @@ -% Determines minimum-order minimum-phase filter that has a magnitude -% response that meets the magnitude amplitude/ripple specifications. -% It will only return filters with an odd number of taps. -% -% function [h, status] = fir_minphase(n, f, a, d, use_max, dbg) -% -% Inputs: --- similar to cfirpm -% n: max number of taps to try -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% use_max: don't search for min order, use n taps -% dbg: flag to turn on debugging statements/plots -% - -% NOTE: why must spectral factorization accept odd number taps only? -% No chance to do even filters? -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_minphase.m,v 1.10 2012/06/08 21:35:02 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Calls fir_min_order to determine minimum-length odd filter that -% meets magnitude-squared response, then performs spectral -% factorization -% - -function [hn,status,fn,an,dn] = fir_minphase(n, f, a, d, use_max, dbg) - if nargin < 4, - error('Usage: function [h, status] = fir_minphase(n, f, a, d, use_max,dbg)'); - end; - - if nargin < 5, - use_max = 0; - end; - - if nargin < 6, - dbg = 0; - end; - - hn = []; - status = 'Failed'; - - % Get magnitude-squared spec - % - d2 = [d(:).'; d(:).']; - d2 = d2(:).'; - mxspec = (a+d2).^2; - mnspec = max(0,(a-d2)).^2; - - % Get "zero" threshold of 2% of lowest spec - % - ztol_perc = 2; - ztol = min(ztol_perc/100 * (mxspec-mnspec)); - - % Offset magnitude-squared spec by ztol, get n - % - mnspec = max(ztol,mnspec); - a_sqr = (mxspec + mnspec)/2; - d2_sqr = (mxspec-mnspec)/2; - d_sqr = d2_sqr(1:2:end); - n_max = 2*n - 1; - - % Get minimum-order linear-phase filter that meets - % magnitude response - % - odd_only = 1; - if ~use_max, - [r, status] = fir_min_order(n_max, f, a_sqr, d_sqr, odd_only, ztol, dbg); - else - [r, status] = fir_pm(n_max, f, a_sqr, d_sqr, ztol, dbg); - end; - if strcmp(status, 'Failed') - fprintf(1,'Failed to get filter\n'); - return; - end - - Rok = 0; - while ~Rok, - % Expand passband/transition regions to reduce - % transition ripple - % - [rn, fn, an, dn] = fir_expand(length(r), f, a_sqr, d_sqr, ztol, dbg); - - oversamp = 15; - m = 2 * oversamp * length(rn); - m2 = 2^ceil(log2(m)); - R = real(fftf(rn,m2)); - - % Check magnitude response to make sure that it is everywhere 0 - % - if dbg, - freq = [-m2/2:m2/2-1]/m2*2; - Ro = real(fftf(r,m2)); % Linear-phase must have real autocorrelation - figure; - plot(freq(:),real(Ro(:))); - hold on; - plot(freq(:),real(R(:)),'r'); - plot_spec(fn,an,dn,'g'); - plot_spec(f,a_sqr,d_sqr,'k'); - title('Squared Frequency Response of Autocorrelation Fcns'); - xlabel('Normalized Frequency'); - end; - - % Now use spectral factorization to get return filter - % --- first offset to make sure it's positive - if min(R) < 0, - min_stop = min(a_sqr + d2_sqr); - Rtol_perc = 0.1; % 10% stopband tolerance - Rtol = Rtol_perc * min_stop; % Rule of thumb - if min(R) < -Rtol, - fprintf(1, 'Autocorrelation has negative value\n'); - fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... - round(Rtol_perc*100), Rtol, -min(R)); - - % Test spectral factorization - % - rn = rn + Rtol; - hn = spectral_fact(rn); - hn = conj(hn(end:-1:1)); - - % Get squared frequency response and check against specs - % + Rtol - % - H = (fftf(hn, m2)); - freq = [-m2/2:m2/2-1]/m2*2; - H2 = abs(H).^2; % Squared-mag response (H is Min-Phase) - nband = length(f)/2; - atol = 0.05; - Rok = 1; - for band = 1:nband, - idx = find((freq >= f(band*2-1)) & (freq <= f(band*2))); - amax = (1+atol)*(a_sqr(band*2-1) + d_sqr(band) + Rtol); - amin = (1-atol)*(a_sqr(band*2-1) - d_sqr(band)); - fail = find((H2(idx) > amax) | ... - (H2(idx) < amin)); - if fail, - fprintf(1, ' Spectral factorization doesn''t meet specs\n'); - fprintf(1, ' Increase number of taps to: %d\n', ... - length(r)+2); - if (dbg) - fprintf(1,''); - figure; - plot_spec(f,a_sqr,d_sqr,'k'); - hold on; - plot(freq(:),H2(:)); - title('Squared Frequency Response of Factorized Filter'); - xlabel('Normalized Frequency'); - pause; - end; - fprintf(1,'\r \r'); - [r, stat] = fir_pm(length(r)+2, f, a_sqr, d_sqr, ztol, ... - dbg); - Rok = 0; - break; - end; - end; - else - if (dbg) - fprintf(1, 'Autocorrelation has negative value, but within tol\n'); - fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... - round(Rtol_perc*100), Rtol, -min(R)); - end; - rn = rn - min(R); - Rok = 1; - end; - else - if dbg, - fprintf(1,'Autocorrelation OK\n'); - end; - Rok = 1; - end; - end; - - % Spectral factorize and time reverse - % - h = spectral_fact(r); - h = conj(h(end:-1:1)); - - hn = spectral_fact(rn); - hn = conj(hn(end:-1:1)); - if dbg, - m = 512; - freq = [-m/2:m/2-1]/m*2; - H = abs(fftf(h,512)); - Hn = abs(fftf(hn,512)); - figure; - plot(freq,H); - hold on; - plot(freq,Hn,'r'); - plot_spec(f,a,d,'k'); - title('Frequency Response Factorized Filters'); - end; - diff --git a/RF_pulses/spectral_spatial/fir_minphase_power.m b/RF_pulses/spectral_spatial/fir_minphase_power.m deleted file mode 100644 index 99897a4..0000000 --- a/RF_pulses/spectral_spatial/fir_minphase_power.m +++ /dev/null @@ -1,211 +0,0 @@ -% Determines minimum-order minimum-phase filter that has a magnitude -% response that meets the magnitude amplitude/ripple specifications. -% It will only return filters with an odd number of taps. -% -% function [h, status] = fir_minphase_power(n, f, a, d, use_max, dbg) -% -% Inputs: --- similar to cfirpm -% n: max number of taps to try -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% use_max: don't search for min order, use n taps -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_minphase_power.m,v 1.7 2012/06/19 16:53:51 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Calls fir_min_order to determine minimum-length odd filter that -% meets magnitude-squared response, then performs spectral -% factorization -% - -function [hn,status] = fir_minphase_power(n, f, a, d, use_max, dbg) - if nargin < 4, - error('Usage: function [h, status] = fir_minphase_power(n, f, a, d, use_max,dbg)'); - end; - - if nargin < 5, - use_max = 0; - end; - - if nargin < 6, - dbg = 0; - end; - - hn = []; - status = 'Failed'; - - % Get magnitude-squared spec - % - d2 = [d(:).'; d(:).']; - d2 = d2(:).'; - mxspec = (a+d2).^2; - mnspec = max(0,(a-d2)).^2; - - % Get "zero" threshold of 2% of lowest spec - % - ztol_perc = 2; - ztol = min(ztol_perc/100 * (mxspec-mnspec)); - - % Offset magnitude-squared spec by ztol, get n - % - mnspec = max(ztol,mnspec); - a_sqr = (mxspec + mnspec)/2; - d2_sqr = (mxspec-mnspec)/2; - d_sqr = d2_sqr(1:2:end); - n_max = 2*n - 1; - - % Get minimum-order linear-phase filter that meets - % magnitude response - % - odd_only = 1; - if ~use_max, - [r, status] = fir_min_order(n_max, f, a_sqr, d_sqr, odd_only, ztol, dbg); - else - [r, status] = fir_pm(n_max, f, a_sqr, d_sqr, ztol, dbg); - end; - if strcmp(status, 'Failed') - fprintf(1,'Failed to get filter\n'); - return; - end - - Rok = 0; - while ~Rok, - % Get min power filter - % - [rn,status] = fir_pm_minpow(length(r), f, a_sqr, d_sqr, ztol, dbg); - - oversamp = 15; - m = 2 * oversamp * length(rn); - m2 = 2^ceil(log2(m)); - R = real(fftf(rn,m2)); - - % Check magnitude response to make sure that it is everywhere positive - % - if dbg, - freq = [-m2/2:m2/2-1]/m2*2; - Ro = real(fftf(r,m2)); % Linear-phase must have real autocorrelation - figure; - plot(freq(:),real(Ro(:))); - hold on; - plot(freq(:),real(R(:)),'r'); - plot_spec(f,a_sqr,d_sqr,'k'); - title('Squared Frequency Response of Autocorrelation Fcns'); - xlabel('Normalized Frequency'); - end; - - % Now use spectral factorization to get return filter - % --- first offset to make sure it's positive - if min(R) < 0, - min_stop = min(a_sqr + d2_sqr); - Rtol_perc = 0.1; % 10% stopband tolerance - Rtol = Rtol_perc * min_stop; % Rule of thumb - if min(R) < -Rtol, - fprintf(1, 'Autocorrelation has negative value\n'); - fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... - round(Rtol_perc*100), Rtol, -min(R)); - - % Test spectral factorization - % - rn = rn + Rtol; - hn = spectral_fact(rn); - hn = conj(hn(end:-1:1)); - - % Get squared frequency response and check against specs - % + Rtol - % - H = (fftf(hn, m2)); - freq = [-m2/2:m2/2-1]/m2*2; - H2 = abs(H).^2; % Squared-mag response (H is Min-Phase) - nband = length(f)/2; - atol = 0.05; - Rok = 1; - for band = 1:nband, - idx = find((freq >= f(band*2-1)) & (freq <= f(band*2))); - amax = (1+atol)*(a_sqr(band*2-1) + d_sqr(band) + Rtol); - amin = (1-atol)*(a_sqr(band*2-1) - d_sqr(band)); - fail = find((H2(idx) > amax) | ... - (H2(idx) < amin)); - if fail, - fprintf(1, ' Spectral factorization doesn''t meet specs\n'); - fprintf(1, ' Increase number of taps to: %d\n', ... - length(r)+2); - if dbg, - fprintf(1,''); - figure; - plot_spec(f,a_sqr,d_sqr,'k'); - hold on; - plot(freq(:),R(:),'r'); - plot(freq(:),H2(:)); - grid; - - title('Squared Frequency Response of Original and Factorized Filter'); - xlabel('Normalized Frequency'); - pause; - end - fprintf(1,'\r \r'); - [r, stat] = fir_pm_minpow(length(r)+2, f, a_sqr, d_sqr, ztol, ... - dbg); - Rok = 0; - break; - end; - end; - else - fprintf(1, 'Autocorrelation has negative value, but within tol\n'); - fprintf(1, ' Tol (%d%% stopband): %e Actual: %e\n', ... - round(Rtol_perc*100), Rtol, -min(R)); - rn = rn - min(R); - Rok = 1; - end; - elseif strcmp(status, 'Failed') - fprintf(1,'\r \r'); - [r, stat] = fir_pm_minpow(length(r)+2, f, a_sqr, d_sqr, ztol, ... - dbg); - Rok = 0; - - else - if dbg, - fprintf(1,'Autocorrelation OK\n'); - end; - Rok = 1; - end; - end; - - % Spectral factorize and time reverse - % - h = spectral_fact(r); - h = conj(h(end:-1:1)); - - hn = spectral_fact(rn); - hn = conj(hn(end:-1:1)); - if dbg, - m = 512; - freq = [-m/2:m/2-1]/m*2; - H = abs(fftf(h,512)); - Hn = abs(fftf(hn,512)); - figure; - plot(freq,H); - hold on; - plot(freq,Hn,'r'); - plot_spec(f,a,d,'k'); - title('Frequency Response Factorized Filters'); - end; - diff --git a/RF_pulses/spectral_spatial/fir_pm.m b/RF_pulses/spectral_spatial/fir_pm.m deleted file mode 100644 index 0010047..0000000 --- a/RF_pulses/spectral_spatial/fir_pm.m +++ /dev/null @@ -1,256 +0,0 @@ - -function [h, status] = fir_pm(n, f, a, d, a_min, dbg) -% FIR_LINPROG - FIR filter design using Parks-McLellan algs -% -% Design n-tap linear-phase filter that meets multiband frequency -% specification. -% -% function [h, status] = fir_pm(n, f, a, d, dbg) -% -% Inputs: -% n: number of taps returned -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% a_min: if not present, chooses min(0, min(a-d)) -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_pm.m,v 1.7 2012/02/01 00:41:22 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - % Default value for a_min - % - d2 = [d(:).'; d(:).']; - d2 = d2(:).'; - if (nargin < 5) || isempty(a_min), - a_min = min(0,min(a-d2)); - end; - - % Default value for dbg - % - if nargin < 6, - dbg = 0; - end; - - % Determine if real or complex coefficients - % - f = f * pi; % Scale to +/- pi - if min(f) < 0, - real_filter = 0; - else - real_filter = 1; - end; - - % Determine if filter has odd or even number of - % taps - % - if (bitget(n,1) == 1) - odd_filter = 1; - else - odd_filter = 0; - end; - - % If the frequency specification has a non-zero point - % at +/- 1, then the order must be even. A warning is - % printed and a failure returned if this is the case. - % - if (~odd_filter) - idx = find(abs(f) ~= 0); - if find(a(idx) ~= 0) - warning('n odd and frequency spec non-zero at fs/2'); - - status = 'Failed'; - h = []; - return; - end; - end; - - % Oversampling on frequency to determine transition bands - % - oversamp = 8; - - % Get first pass on w - % - if real_filter, - m = oversamp * n; - w = linspace(0,pi,m); - else - m = 2 * oversamp * n; - w = linspace(-pi,pi,m); - end; - - % Find bounds on transition regions and convert to amp/ripple - % - ub_tran = max(a + d2); - lb_tran = a_min; % Set to min amplitude spec - amp_tran = (ub_tran + lb_tran)/2; - ripple_tran = (ub_tran - lb_tran)/2; - - % Find indices of transition bands, build up new frequency spec - % - nband = length(f)/2; - ntran = nband+1; - fn = []; - an = []; - dn = []; - for tran = 1:ntran, - if tran == 1, - f_l = min(w); % This avoids sample at -pi - rband = tran; - f_r = f(rband*2-1); - elseif tran == ntran, - lband = tran-1; - f_l = f(lband*2); - f_r = pi; % This avoids sample at pi - else - lband = tran-1; - f_l = f(lband*2); - rband = tran; - f_r = f(rband*2-1); - end; - idx_tran = find((w > f_l) & (w < f_r)); - % cfirpm seems to choke sometimes---I hypothesize - % this is because the transition edges are too - % close to the actual passbands, so don't take - % the immediately adjacent points - % - nskip = 1; - if length(idx_tran) <= 1+2*nskip, - f_tran = []; - a_tran = []; - d_tran = []; - else - idx_tran = idx_tran(1+nskip:end-nskip); - f_tran = [min(w(idx_tran)) max(w(idx_tran))]; - a_tran = [amp_tran amp_tran]; - d_tran = [ripple_tran]; - end; - fn = [fn f_tran]; - an = [an a_tran]; - dn = [dn d_tran]; - if tran < ntran, - fn = [fn f(tran*2-1) f(tran*2)]; - an = [an a(tran*2-1) a(tran*2)]; - dn = [dn d(tran)]; - end; - end; - - % Determine error weights, then call firpm - % - w = max(dn) ./ dn; - lgrid = 31; % Oversample, default 25 - if 0 - % firpm has some instability but cfirpm seems ok... - % - if real_filter, - try - [h,d_opt,opt] = firpm(n-1,fn/pi,an,w,{lgrid}); - catch - h = []; - end; - else - [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,w,{lgrid}); - end; - end; - -% [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,w,{lgrid},'skip_stage2'); - try - [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,w,{lgrid}); - catch - h = []; - lsterr = lasterror; - fprintf(1,'Error caught in cfirpm: \n'); - fprintf(1,'%s\n', lsterr.message); - end; - - % Check frequency response at extremal frequencies - % that are within specified bands - % - resp_ok = 0; - if ~isempty(h) - resp_ok = check_response(f/pi, a, d, opt.fgrid, abs(opt.H)); - end; - - if (~resp_ok) - status = 'Failed'; - if dbg>=2, - plot_response(opt.fgrid, opt.H, fn/pi, an, dn); - title('Filter Response'); - pause(1); - end; - h = []; - else - if dbg>=2, - plot_response(opt.fgrid, opt.H, fn/pi, an, dn); - title('Filter Response'); - pause(1); - end; - - h = h(:); - status = 'Solved'; - end; -return; - - -function status = check_response(f,a,d,ftest,htest) -% CHECK_RESPONSE - Check magnitude response to see if it meets specs -% - nband = length(f)/2; - status = 1; - for band = 1:nband, - idx = find((ftest >= f(band*2-1)) & (ftest <= f(band*2))); - if isempty(idx) - break; - end; - - f_off = ftest(idx) - f(band*2-1); - a_test = a(band*2-1) + ... - (a(band*2)-a(band*2-1)) * f_off/(f(band*2)-f(band*2-1)); - - a_hi = a_test + d(band); - a_lo = a_test - d(band); - - if (find((htest(idx) > a_hi) | (htest(idx) < a_lo))) - status = 0; % Fails in at least one sample - return; - end; - end; - - return; - -function plot_response (freq,h,f,a,d) -% plot_response - Plot frequency specification and actual response -% - figure; - hold on; - nband = length(f)/2; - for band = 1:nband, - idx = [band*2-1:band*2]; - plot(f(idx), a(idx)+d(band), 'k--'); - if max(a(idx)-d(band)) > 0, - plot(f(idx), max(0,a(idx)-d(band)), 'k--'); - end; - end; - plot(freq, real(h)); - plot(freq, imag(h),'b--'); - xlabel('Frequency'); - ylabel('Filter Response'); - - return; diff --git a/RF_pulses/spectral_spatial/fir_pm_minpow.m b/RF_pulses/spectral_spatial/fir_pm_minpow.m deleted file mode 100644 index c1ce151..0000000 --- a/RF_pulses/spectral_spatial/fir_pm_minpow.m +++ /dev/null @@ -1,384 +0,0 @@ - -function [h, status] = fir_pm_minpow(n, f, a, d, a_min, dbg) -% FIR_PM_MINPOW - FIR filter design using Parks-McLellan algs, -% with attempt to minimize power -% -% Design n-tap linear-phase filter that meets multiband frequency -% specification. -% -% function [h, status] = fir_pm_minpow(n, f, a, d, a_min, dbg) -% -% Inputs: -% n: number of taps returned -% f: frequency bands -% a: amplitude at band edges -% d: ripple in bands -% a_min: if not present or [], chooses min(0, min(a-d)) -% dbg: flag to turn on debugging statements/plots -% -% First designs filter with PM algorithm, then uses result as -% a seed for the fir_linprog routine. fir_linprog() includes -% a minimimization of the sum transition band response---which -% is equal to power when operating on an autocorrelation filter -% since the frequency response is the power spectrum (real and all -% positive). When operating on the amplitude response, the -% transition frequency response can both be negative and is -% only proportional to the sqrt(power), so care should be taken -% when using it in this manner. -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_pm_minpow.m,v 1.6 2012/02/01 00:41:22 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - % Default value for a_min - % - d2 = [d(:).'; d(:).']; - d2 = d2(:).'; - if (nargin < 5) || isempty(a_min), - a_min = min(0,min(a-d2)); - end; - - % Default value for dbg - % - if nargin < 6, - dbg = 0; - end; - - % Determine if real or complex coefficients - % - f = f * pi; % Scale to +/- pi - if min(f) < 0, - real_filter = 0; - else - real_filter = 1; - end; - - % Determine if filter has odd or even number of - % taps - % - if (bitget(n,1) == 1) - odd_filter = 1; - else - odd_filter = 0; - end; - - % If the frequency specification has a non-zero point - % at +/- 1, then the order must be even. A warning is - % printed and a failure returned if this is the case. - % - if (~odd_filter) - idx = find(abs(f) ~= 0); - if find(a(idx) ~= 0) - warning('n odd and frequency spec non-zero at fs/2'); - - status = 'Failed'; - h = []; - return; - end; - end; - - % Oversampling on frequency to determine transition bands - % - oversamp = 16; - - % Get first pass on w - % - if real_filter, - m = oversamp * n; - w = linspace(0,pi,m); - else - m = 2 * oversamp * n; - w = linspace(-pi,pi,m); - end; - - % Find bounds on transition regions and convert to amp/ripple - % - ub_tran = max(a + d2); - lb_tran = a_min; % Set to min amplitude spec - amp_tran = (ub_tran + lb_tran)/2; - ripple_tran = (ub_tran - lb_tran)/2; - - % Find indices of transition bands, build up new frequency spec - % - nband = length(f)/2; - ntran = nband+1; - fn = []; - an = []; - dn = []; - for tran = 1:ntran, - if tran == 1, - f_l = min(w); % This avoids sample at -pi - rband = tran; - f_r = f(rband*2-1); - elseif tran == ntran, - lband = tran-1; - f_l = f(lband*2); - f_r = pi; % This avoids sample at pi - else - lband = tran-1; - f_l = f(lband*2); - rband = tran; - f_r = f(rband*2-1); - end; - idx_tran = find((w > f_l) & (w < f_r)); - % cfirpm seems to choke sometimes---I hypothesize - % this is because the transition edges are too - % close to the actual passbands, so don't take - % the immediately adjacent points - % - nskip = 1; - if length(idx_tran) <= 1+2*nskip, - f_tran = []; - a_tran = []; - d_tran = []; - else - idx_tran = idx_tran(1+nskip:end-nskip); - f_tran = [min(w(idx_tran)) max(w(idx_tran))]; - a_tran = [amp_tran amp_tran]; - d_tran = [ripple_tran]; - end; - fn = [fn f_tran]; - an = [an a_tran]; - dn = [dn d_tran]; - if tran < ntran, - fn = [fn f(tran*2-1) f(tran*2)]; - an = [an a(tran*2-1) a(tran*2)]; - dn = [dn d(tran)]; - end; - end; - - % Determine error weights, then call firpm - % - wt = max(dn) ./ dn; - lgrid = 31; % Oversample, default 25 - try - [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,wt,{lgrid}); - catch - h = []; - lsterr = lasterror; - fprintf(1,'Error caught in cfirpm: \n'); - fprintf(1,'%s\n', lsterr.message); - end; - - % Check frequency response at extremal frequencies - % that are within specified bands - % - resp_ok = 0; - if ~isempty(h) - resp_ok = check_response(fn/pi, an, dn, opt.fgrid, abs(opt.H)); - end; - - if (~resp_ok) - status = 'Failed'; - h = []; - return; - end; - - % Now call fir_linprog with designed filter as starting point. - % The frequency response of the returned filter will be used - % to refine our transition bands. - if (dbg) - fprintf(1,'Getting linear filter based on PM design\n'); - end; - hlin = fir_linprog(n, f/pi, a, d, h(:), dbg); - Hlin = freqz(hlin,1,w/pi,2); - - % Update transition bands - % - fn = []; - an = []; - dn = []; - for tran = 1:ntran, - if tran == 1, - f_l = min(w); % This avoids sample at -pi,0 - rband = tran; - f_r = f(rband*2-1); - elseif tran == ntran, - lband = tran-1; - f_l = f(lband*2); - f_r = pi; % This avoids sample at pi - else - lband = tran-1; - f_l = f(lband*2); - rband = tran; - f_r = f(rband*2-1); - end; - idx_tran = find((w > f_l) & (w < f_r)); - - % Break up this transition region into bands - % each with a max bound determined by the Hlin - % filter response - % - % cfirpm seems to choke sometimes---I hypothesize - % this is because bands are too close together, so - % keep at least "nskip" points between neighbours - % - nskip = 1; - ntran_pts = oversamp*2; - ntran_region = max(1,round((length(idx_tran)-nskip)/ntran_pts)); - ntran_pts = (length(idx_tran)-nskip)/ntran_region; - idx_region_st = nskip + 1 + round([0:ntran_region-1]*ntran_pts); - idx_region_end = [idx_region_st(2:end) (length(idx_tran)-nskip+1)]-1; - - for reg = 1:length(idx_region_st) - % Get frequency indices corresponding to this region - % - idx_tran_reg = idx_tran(idx_region_st(reg):idx_region_end(reg)); - if length(idx_tran_reg) == 0, - f_tran = []; - a_tran = []; - d_tran = []; - else - f_tran = [min(w(idx_tran_reg)) max(w(idx_tran_reg))]; - max_H = max(abs(Hlin(idx_tran_reg))); % Phase not removed - % from Hlin - tol_H = 0.01; - max_H = max_H + tol_H*max(a+d2); % Add some tolerance to bands - max_H = max(min(a+d2), max_H); % No tighter than stopband - min_H = a_min; - amp_tran = (max_H + min_H)/2; - ripple_tran = (max_H - min_H)/2; - a_tran = [amp_tran amp_tran]; - d_tran = [ripple_tran]; - end; - fn = [fn f_tran]; - an = [an a_tran]; - dn = [dn d_tran]; - end; - - if tran < ntran, - fn = [fn f(tran*2-1) f(tran*2)]; - an = [an a(tran*2-1) a(tran*2)]; - dn = [dn d(tran)]; - end; - end; - - % Plot new frequency specfication on top of linear filter response - % - if (dbg >= 2) - figure; - plot(w/pi, abs(Hlin)); - hold on; - plot(opt.fgrid, abs(opt.H),'r'); - nband = length(fn)/2; - for band = 1:nband, - idx = [band*2-1:band*2]; - plot(fn(idx)/pi, an(idx)+dn(band), 'g--'); - plot(fn(idx)/pi, an(idx)-dn(band), 'g--'); - end; - nband = length(f)/2; - for band = 1:nband, - idx = [band*2-1:band*2]; - plot(f(idx)/pi, a(idx)+d(band), 'k--'); - plot(f(idx)/pi, a(idx)-d(band), 'k--'); - end; - fprintf(1,'Pausing...\n'); - pause; - end; - - % Determine error weights, then call firpm - % - wt = max(dn) ./ dn; - lgrid = 31; % Oversample, default 25 - try - [h,d_opt,opt] = cfirpm(n-1,fn/pi,an,wt,{lgrid}); - catch - h = []; - lsterr = lasterror; - fprintf(1,'Error caught in cfirpm: \n'); - fprintf(1,'%s\n', lsterr.message); - end; - - if (dbg >= 2) - plot(opt.fgrid, abs(opt.H),'m'); - fprintf(1,'Pausing...\n'); - pause; - end; - - % Check frequency response at extremal frequencies - % that they are within specified bands - % - resp_ok = 0; - if ~isempty(h) - resp_ok = check_response(fn/pi, an, dn, opt.fgrid, abs(opt.H)); - end; - - if (~resp_ok) - fprintf(1,'*** Failed to get min energy pulse ***\n'); - status = 'Failed'; - h = []; - return; - else - if dbg>=2, - plot_response(opt.fgrid, opt.H, fn/pi, an, dn); - title('Filter Response'); - pause(1); - end; - - h = h(:); - status = 'Solved'; - end; -return; - - -function status = check_response(f,a,d,ftest,htest) -% CHECK_RESPONSE - Check magnitude response to see if it meets specs -% - nband = length(f)/2; - status = 1; - for band = 1:nband, - idx = find((ftest >= f(band*2-1)) & (ftest <= f(band*2))); - if isempty(idx) - break; - end; - - f_off = ftest(idx) - f(band*2-1); - a_test = a(band*2-1) + ... - (a(band*2)-a(band*2-1)) * f_off/(f(band*2)-f(band*2-1)); - - a_hi = a_test + d(band); - a_lo = a_test - d(band); - - if (find((htest(idx) > a_hi) | (htest(idx) < a_lo))) - status = 0; % Fails in at least one sample - return; - end; - end; - - return; - -function plot_response (freq,h,f,a,d) -% plot_response - Plot frequency specification and actual response -% - figure; - hold on; - nband = length(f)/2; - for band = 1:nband, - idx = [band*2-1:band*2]; - plot(f(idx), a(idx)+d(band), 'k--'); - if max(a(idx)-d(band)) > 0, - plot(f(idx), max(0,a(idx)-d(band)), 'k--'); - end; - end; - plot(freq, real(h)); - plot(freq, imag(h),'b--'); - xlabel('Frequency'); - ylabel('Filter Response'); - - return; diff --git a/RF_pulses/spectral_spatial/fir_qprog.m b/RF_pulses/spectral_spatial/fir_qprog.m deleted file mode 100644 index ca75ac3..0000000 --- a/RF_pulses/spectral_spatial/fir_qprog.m +++ /dev/null @@ -1,318 +0,0 @@ - -function [h, status] = fir_qprog(n, f, a, d, dbg) -% FIR_QPROG - FIR filter design using quadratic programming -% -% Design n-tap linear-phase filter that meets multiband frequency -% specification. -% -% Also constrain H(f) > max(0, min(a(1:2:end)-d), min(a(2:2:end)-d)) -% Also minimizes sum(|H(f)|^2) in transition bands. -% -% function [h, status] = fir_qprog(n, f, a, d, dbg) -% -% Inputs: --- similar to cfirpm -% n: number of taps returned -% f: frequency bands (-1->1) -% a: amplitude at band edges -% d: ripple in bands -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_qprog.m,v 1.2 2013/08/15 17:10:31 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - % Default value for dbg - % - if nargin < 5, - dbg = 0; - end; - - % Determine if real or complex coefficients - % - f = f * pi; % Scale to +/- pi - if min(f) < 0, - real_filter = 0; - else - real_filter = 1; - end; - - % Determine if filter has odd or even number of - % taps - % - if (bitget(n,1) == 1) - odd_filter = 1; - else - odd_filter = 0; - end; - - % If the frequency specification has a non-zero point - % at +/- 1, then the order must be even. A warning is - % printed and a failure returned if this is the case. - % - if (~odd_filter) - idx = find(abs(f) == pi); - if find(a(idx) == 1) - warning('n odd and frequency spec 1 at fs/2'); - - status = 'Failed'; - h = []; - return; - end; - end; - - % Determine number of optimization parameters - % - nhalf = ceil(n/2); % number of taps in half-side of - % filter - nx = nhalf; - if ~real_filter, - if odd_filter, - nx = 2*nhalf-1; - else - nx = 2*nhalf; - end; - end; - - % Create optimization arrays - % - oversamp = 15; - undersamp_tran = 1; % Undersampling factor for transition - % regions - % Get first pass on w - % - if real_filter, - m = oversamp * n; - w = linspace(0,pi,m); - else - m = 2 * oversamp * n; - w = linspace(-pi,pi,m); - end; - - % Add explicit samples to w at the edge of each specified band - % - w = sort([w f]); - - % Find indices to passbands/stopbands, and fill in upper/lower bounds - % - idx_band = []; U_band = []; L_band = []; - nband = length(f)/2; - for band = 1:nband, - idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); - % Get amplitude from linear interpolation on band - % - idx_band = [idx_band idx]; - if (f(band*2-1) == f(band*2)) - amp = a(band*2-1); - else - amp = a(band*2-1) + (a(band*2)-a(band*2-1)) * ... - ((w(idx) - f(band*2-1))/(f(band*2)-f(band*2-1))); - end; - U_band = [U_band (amp + d(band))]; - L_band = [L_band (amp - d(band))]; - end; - - % Get transition indices - % - idx_tmp = ones(1,length(w)); - idx_tmp(idx_band) = 0; - idx_tran = find(idx_tmp == 1); - - % Get average representation of response - % - lb_resp = size(w); - lb_resp(idx_band) = (U_band + L_band)/2; - lb_resp(idx_tran) = (max(U_band) + min(L_band))/2; - if real_filter, - lb_resp = [lb_resp(end:-1:1) lb_resp(2:end-1)]; - end; - if dbg >= 3, - if real_filter, - wplot = [-w(end:-1:1) w(2:end-1)]; - else - wplot = w; - end; - figure; - plot(wplot,lb_resp); - end; - - % Decimate w in transition regions - % - idx_tran = idx_tran(1:undersamp_tran:end); - - % Add transition band limits to be between the + max - % specification on each band and min of (0,min(L_band)) - % - if ~isempty(idx_tran) - U_amp_tran = max(U_band); - U_tran = U_amp_tran*ones(1,length(idx_tran)); - L_amp_tran = min(0, min(L_band)); - L_tran = L_amp_tran*ones(1,length(idx_tran)); - else - U_tran = []; - L_tran = []; - end; - - % Update w, idx_band - % - wband = w(idx_band); - idx_band = [1:length(wband)]; - wtran = w(idx_tran); - idx_tran = [1:length(wtran)] + length(wband); - w = [wband(:).' wtran(:).']; - m = size(w,2); - - if dbg >= 3, - figure; - plot(w(idx_band),U_band,'*'); - hold on; - plot(w(idx_band),L_band,'o'); - plot(w(idx_tran),U_tran,'r*'); - plot(w(idx_tran),L_tran,'ro'); - pause; - end; - - if real_filter - % create optimization matrices - % A is the matrix used to compute the power spectrum - % A(w,:) = [1 2*cos(w) 2*cos(2*w) ... 2*cos(n*w)] - if (odd_filter) - Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; - else - Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; - end; - Asin = []; - else - if (odd_filter) - Acos = [ones(m,1) 2*cos(kron(w',[1:nhalf-1]))]; - Asin = [2*sin(kron(w',[1:nhalf-1]))]; - else - Acos = [2*cos(kron(w',[0:nhalf-1]+0.5))]; - Asin = [2*sin(kron(w',[0:nhalf-1]+0.5))]; - end; - end; - - % Get subset of A matrix for current order - % - A = [Acos Asin]; - - % Build matrix for upper bound constraints - % - A_U = [A(idx_band,:); A(idx_tran,:)]; - U_b = [U_band U_tran]; - - % Build matrices for lower bound constraints - % - A_L = [A(idx_band, :); A(idx_tran,:)]; - L_b = [L_band L_tran]; - - % Combine matrices - % - A_b = [A_U; -A_L]; - b = [U_b -L_b]; - - % Set H to minimize total energy in filter - % Set fmin to 0 - H = eye(nx); - fmin = zeros(1,nx); - - % Call minimization routine - % - x0 = []; - if real_filter, - [x,fval,exitflag,output] = ... - quadprog(H, fmin, A_b, b, [],[],[],[],x0,... - optimset('Algorithm', 'interior-point-convex', ... - 'Display','off')); - else - [x,fval,exitflag,output] = ... - quadprog(H, fmin, A_b, b, [],[],[],[],x0,... - optimset('LargeScale','off', 'Algorithm', 'active-set', 'Display','off')); - end; - - if dbg >= 2, - fprintf(1,'Exitflag: %d\n', exitflag); - switch(exitflag) - case 1 - fprintf(1,'First order optimality conditions satisfied\n'); - case 0 - fprintf(1,'Maximum number of iterations exceeded\n'); - case -2 - fprintf(1,'No feasible point found\n'); - case -3 - fprintf(1,'Problem is unbounded\n'); - case -6 - fprintf(1,'Non-convex problem detected\n'); - case 3 - fprintf(1,'Change in objective function too small\n'); - case -4 - fprintf(1,['Current search direction is not a descent direction; ' ... - 'no further progress can be made.\n']); - case 4 - fprintf(1,'Local minimizer found\n'); - case -7 - fprintf(1,['Magnitude of search direction became too small; no ' ... - 'further progress can be made. The problem is ill-posed ' ... - 'or badly conditioned.\n']); - otherwise - fprintf(1,'Exitflag not recognized\n'); - end - - H = A * x; - figure; - plot_spec(f,a,d); - [wsort, sidx] = sort(w); - plot(w(sidx), H(sidx)); - hold on; - plot(w(sidx), H(sidx),'rx'); - title('Frequency response calculated with A'); - end; - - if (exitflag == 1) % feasible - h = fill_h(x,nhalf,real_filter, odd_filter,dbg); - status = 'Solved'; - else - h = []; - status = 'Failed'; - end; - return; - -function h = fill_h(x,nhalf,real_filter,odd_filter,dbg) -% Function to fill in filter taps from optimization parameters -% - x = x(:); - if real_filter, - if odd_filter, - h = x(1:end); - h = [x(end:-1:2); h]; - else - h = x(1:end); - h = [x(end:-1:1); h]; - end; - else - if odd_filter, - h = x(1:nhalf) + i * [0; x(nhalf+1:end)]; - h = [conj(h(end:-1:2)); h]; - else - h = x(1:nhalf) + i * x(nhalf+1:end); - h = [conj(h(end:-1:1)); h]; - end; - end; - - return; - diff --git a/RF_pulses/spectral_spatial/fir_qprog_phs.m b/RF_pulses/spectral_spatial/fir_qprog_phs.m deleted file mode 100644 index 3fb496f..0000000 --- a/RF_pulses/spectral_spatial/fir_qprog_phs.m +++ /dev/null @@ -1,400 +0,0 @@ -function [h, status] = fir_qprog_phs(n, f, ac, dc, x0, dbg) -% FIR_QPROG_PHS - FIR filter design using quadratic programming -% -% Design n-tap linear-phase filter that meets multiband frequency specification, -% including nominal phase in each band. -% -% function [h, status] = fir_qprog_phs(n, f, a, d, dbg) -% -% Inputs: --- similar to cfirpm -% n: number of taps returned -% f: frequency bands (-1->1) -% a: amplitude for each band - complex NOTE: does NOT support sloped -% bands -% - magnitude describes target magnitude for band -% - phase describes target phase for band -% d: ripple in bands - complex -% - magnitude describes +/- magnitude ripple for band -% - phase describes +/- phase ripple for band -% dbg: flag to turn on debugging statements/plots -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2013 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/fir_qprog_phs.m,v 1.6 2013/08/15 03:18:58 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - % Default value for dbg - % - if nargin < 6, - dbg = 0; - end; - - % Find how many bands - % - nband = length(f)/2; - - % Make sure specification doesn't include sloped bands - % - for band = 1:nband, - if (ac(band*2-1) ~= ac(band*2)) - error('Does not support sloped bands'); - end - end - - % Decimate ac so it is just nband elements - % - a = ac(1:2:end); - - % Get magnitudes / phase - a = abs(a); - aphs = angle(a); - d = abs(dc); - dphs = angle(dc); - - - % Check input parameters, informing user that any stopband (e.g. a - % band where magnitude + ripple specs straddle 0 cannot have a - % phase target or ripple associated with it) - % - for band = 1:nband - if ((a(band) + d(band)) * (a(band) - d(band)) < 0) - if (a(band) ~= 0) || (dphs(band) ~= 0) - error('Bands straddling 0 must have a = 0, angle(d) = 0'); - end - end - end - - % Check phase spec / magnitudes to see if approximation of concave - % surface by linear segment is imposing too much error - % - err_tol = 0.05; - for band = 1:nband - bandwarn = 0; - if a(band) ~= 0 - magerr_inner = (a(band) - d(band)) * (sec(dphs(band)) - 1); - if (magerr_inner >= 2 * d(band)) - warning('Reducing phase ripple to that feasible'); - dphs(band) = 0.99*acos((a(band) - d(band)) / (a(band)+d(band))); - elseif ((magerr_inner > err_tol * 2 * d(band)) && (dbg > 0)) - warning(sprintf(['Band: %d, Linear approximation to magnitude spec ' ... - 'decreasing mag ripple by %3.1f%%'], band, 100*magerr_inner/(2*d(band)))); - end - end - end - - % Work out phases of endpoints to use for upper magnitude piecewise - % linear segments approximation - % - n_phs_tran = ceil(2 * pi / acos(1-err_tol)); - amax = max(a + d); % Max magnitude for filter - phs_tran = [0:n_phs_tran]/n_phs_tran * 2 * pi; - for band = 1:nband - if (a(band) == 0) - phs_band{band} = [0:n_phs_tran]/n_phs_tran * 2 * pi; - else - phs_tol = acos(1 - (err_tol * 2 * d(band))); - n_phs = ceil(2 * dphs(band) / phs_tol); - phs_band{band} = ([0:n_phs]/n_phs * 2 - 1) * dphs(band) + ... - aphs(band); - - % Add phase points from each band to transition band pwl segments - % if band is near max magnitude - % - if ( (a(band) + d(band)) >= amax * (1-err_tol) ) - phs_tran = [phs_tran (aphs(band)-dphs(band)) (aphs(band)+ ... - dphs(band))]; - end - end - end - - % Prune and sort phase points in phs_tran - % - phs_tran = mod(phs_tran, 2 * pi); - phs_tran = unique([phs_tran 0 2*pi]); % Between 0 and 2pi - - % Plot PWL segments for debug purposes - % - if (dbg > 0) - figure; - plot([0 (1+i)*1e-9]); - hold on; - - % Plot transition limits first - % - tran_pts = amax * exp(i*phs_tran); - plot(tran_pts,'k--'); - - % Now plot bands - % - band_cmap = jet(nband); - - for band = 1:nband - % Plot ideal magnitude specs - if a(band) ~= 0, - phs = aphs(band) + (([0:50]/50) * 2 - 1) * angle(dc(band)); - else - phs = aphs(band) + (([0:50]/50) * 2 - 1) * pi; - end - plot((a(band)+d(band)) * exp(i*phs), '--',... - 'Color', band_cmap(band,:)); - plot((a(band)-d(band)) * exp(i*phs), '--',... - 'Color', band_cmap(band,:)); - - % Upper magnitude is PWL approximation - % - plot((a(band)+d(band)) * exp(i*phs_band{band}), ... - 'Color', band_cmap(band,:)); - - % Lower magnitude is single line - % - if (a(band) ~= 0) - pts_real = (a(band) - d(band)) * ones(1,51); - phs = (([0:50]/50) * 2 - 1) * dphs(band); - pts_imag = (a(band) - d(band)) * tan(phs); - pts = (pts_real + i *pts_imag) * exp(i*aphs(band)); - plot(pts, 'Color', band_cmap(band,:)); - end - end - drawnow; - end - - % Scale f to -pi .. pi - % - f = f * pi; - - % Determine if filter has odd or even number of - % taps - % - if (bitget(n,1) == 1) - odd_filter = 1; - else - odd_filter = 0; - end; - - % If the frequency specification has a non-zero point - % at +/- pi, then the order must be even. A warning is - % printed and a failure returned if this is the case. - % - if (~odd_filter) - idx = find(abs(f) == pi); - if find(abs(ac(idx)) ~= 0) - warning('n odd and frequency spec non-zero at fs/2'); - - status = 'Failed'; - h = []; - return; - end; - end; - - % Determine number of optimization parameters - % - nhalf = ceil(n/2); % number of taps in half-side of - % filter - - nx = 2 * n; % Number of optimization parameters - - % Create optimization arrays - % - oversamp = 15; - undersamp_tran = 1; % Undersampling factor for transition - % regions - % Get first pass on w - % - m = 2 * oversamp * n; - w = linspace(-pi,pi,m); - - % Add explicit samples to w at the edge of each specified band - % - w = sort([w f]); - - % Create W matrix representing DFT - % - if (odd_filter) - W = exp (-i* kron(w', [-(nhalf-1):nhalf-1])); - else - W = exp (-i* kron(w', [-nhalf:nhalf-1]+0.5)); - end - - % Find indices to passbands/stopbands, and fill in upper/lower bounds - % - idx_band = []; - Au = []; Bu = []; - Al = []; Bl = []; - for band = 1:nband, - idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); - idx_band = [idx_band idx]; - - % Build up upper magnitude constraints - % - phs_diff = angle(exp(i*phs_band{band}(2)) * ... - exp(-i*phs_band{band}(1))); - a_mid = (a(band) + d(band)) * cos(phs_diff/2); - for phs_idx = 1:(length(phs_band{band})-1) - phs_mid = phs_band{band}(phs_idx) + phs_diff/2; - Wtmp = W(idx,:) * exp(-i*phs_mid); - - Au = [Au; real(Wtmp) -imag(Wtmp)]; % in-phase part of Wtmp * x - Bu = [Bu; a_mid * ones(length(idx),1)]; - end - - % Build lower magnitude constraint for non-stopbands - % - if (a(band) ~= 0) - Wtmp = W(idx,:) * exp(-i*aphs(band)); - Al = [Al; real(Wtmp) -imag(Wtmp)]; % in-phase part of Wtmp * x - Bl = [Bl; (a(band)-d(band)) * ones(length(idx),1)]; - - % Build upper phase constraint - % - Wtmp = W(idx,:) * exp(-i*phs_band{band}(end)); - Au = [Au; imag(Wtmp) real(Wtmp)]; % quadrature part of Wtmp * x - Bu = [Bu; zeros(length(idx),1)]; - - % Build lower phase constraint - % - Wtmp = W(idx,:) * exp(-i*phs_band{band}(1)); - Al = [Al; imag(Wtmp) real(Wtmp)]; % quadrature part of Wtmp * x - Bl = [Bl; zeros(length(idx),1)]; - end - end - - % Get transition indices - % - idx_tmp = ones(1,length(w)); - idx_tmp(idx_band) = 0; - idx_tran = find(idx_tmp == 1); - - % Decimate w in transition regions - % - idx_tran = idx_tran(1:undersamp_tran:end); - - % Find weighting - % - wband_mtx = w(idx_band)' * ones(1,length(idx_tran)); - w_mtx = ones(length(idx_band),1) * w(idx_tran); - dtmp = abs(angle(exp(i*(wband_mtx - w_mtx)))); - dtmp = min(dtmp); - wt_tran_energy = min(4*pi/n, dtmp) / (4*pi/n); - - if dbg >= 3, - figure; - hold on; - plot(w(idx_band),ones(length(idx_band),1),'*'); - plot(w(idx_tran), wt_tran_energy, 'g+'); - drawnow; - end; - - % Build up transition band magnitude constraints - % - limit_tran = 1; - if limit_tran - for idx = 1:(length(phs_tran)-1) - phs_diff = phs_tran(idx+1)-phs_tran(idx); - phs_mid = phs_tran(idx)+phs_diff/2; - Wtmp = W(idx_tran,:) * exp(-i*phs_mid); - - Au = [Au; real(Wtmp) -imag(Wtmp)]; % in-phase part of Wtmp * x - Bu = [Bu; amax * cos(phs_diff/2) * ones(length(idx_tran),1)]; - end - end - - % Combine matrices - % - A = [Au; -Al]; - B = [Bu; -Bl]; - - % Build matrix H to minimize energy of filter - % - minimize_total_energy = 1; - if minimize_total_energy - H = eye(nx); % Minimize total energy - H = sparse(H); - else - Ar_tran = [real(W(idx_tran,:)) -imag(W(idx_tran,:))]; - Ai_tran = [imag(W(idx_tran,:)) real(W(idx_tran,:))]; - Ari_tran = diag([sqrt(wt_tran_energy) sqrt(wt_tran_energy)]) * [Ar_tran; Ai_tran]; - H = Ari_tran' * Ari_tran; - end - - fmin = zeros(1,nx); - - % Call minimization routine - % - x0 = []; - [x,fval,exitflag,output] = ... - quadprog(H, fmin, A, B, [],[],[],[],x0,... - optimset('Algorithm', 'interior-point-convex', ... - 'Display','off')); - % optimset('Algorithm', 'active-set', 'Display','iter', ... - % 'MaxIter', 500)); - - - % exitflag - - if dbg >= 2, - fprintf(1,'Exitflag: %d\n', exitflag); - switch(exitflag) - case 1 - fprintf(1,'First order optimality conditions satisfied\n'); - case 0 - fprintf(1,'Maximum number of iterations exceeded\n'); - case -2 - fprintf(1,'No feasible point found\n'); - case -3 - fprintf(1,'Problem is unbounded\n'); - case -6 - fprintf(1,'Non-convex problem detected\n'); - case 3 - fprintf(1,'Change in objective function too small\n'); - case -4 - fprintf(1,['Current search direction is not a descent direction; ' ... - 'no further progress can be made.\n']); - case 4 - fprintf(1,'Local minimizer found\n'); - case -7 - fprintf(1,['Magnitude of search direction became too small; no ' ... - 'further progress can be made. The problem is ill-posed ' ... - 'or badly conditioned.\n']); - otherwise - fprintf(1,'Exitflag not recognized\n'); - end - h = x(1:n) + i * x(n+1:end); - H = W * h; - [wsort, sidx] = sort(w); - hsort = H(sidx); - figure; - plot_spec_phs(f,ac,dc,wsort,hsort); - title('Frequency response calculated with W'); - figure; - plot(abs(h)); - drawnow; - end; - - if (exitflag == 1) % feasible - h = x(1:n) + i * x(n+1:end); - status = 'Solved'; - else - h = []; - status = 'Failed'; - end; - - return; - - - - diff --git a/RF_pulses/spectral_spatial/grad_min_bridge.m b/RF_pulses/spectral_spatial/grad_min_bridge.m deleted file mode 100644 index 654e040..0000000 --- a/RF_pulses/spectral_spatial/grad_min_bridge.m +++ /dev/null @@ -1,117 +0,0 @@ -function [g, g1, g2, g3] = grad_min_bridge(m0, f, mxg, mxs, ts) -% GRAD_MIN_BRIDGE - Determine gradient trapezoid that gives required area from middle "bridge" section -% -% [g, g1, g2, g3] = grad_min_bridge (m0, f, mxg, mxs, ts) -% -% m0 - target zeroth moment (G/cm * s) -% f - fraction of ramp to include in bridge [0..1] -% mxg - maximum amplitude (G/cm) -% mxs - maximum slew rate (G/cm/ms) -% ts - sample time in s -% -% g - Gradient -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/grad_min_bridge.m,v 1.5 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -if (m0 < 0) - s = -1; - m0 = -m0; -else - s = 1; -end; - -% Convert mxs to G/cm/s -% -mxs = mxs * 1e3; - -% Determine trapezoid parameters -% -% na - number of constant samples -% nb - number ramp samples -% nc - number samples of ramp in bridge -% A - trapezoid amplitude -% - -dg = mxs * ts; % Max delta in one sample - -% Assume triangle at first and see if max amp requirements met -% -- quadratic with aq, bq, cq coeffs -% -if (f ~= 0) - aq = (2-f)*f; - bq = f; - cq = -m0/(dg*ts); - nb = (-bq + sqrt(bq^2 - 4*aq*cq))/(2*aq); - - nb = ceil(nb); - nc = max(1,ceil(nb*f)); -else - A = m0 / (2*ts); - nb = ceil(A / dg); - nc = 1; -end; - -% Test result -% -dg_test = m0 / ((2*nb-nc+1)*nc*ts); -A = nb * dg_test; -if (A <= mxg) && (dg_test < dg), % This works! - g1 = s*[1:(nb-nc)] * dg_test; - g2 = s*[[(nb-nc+1):nb] [nb:-1:(nb-nc+1)]] * dg_test; - g3 = s*[(nb-nc):-1:0] * dg_test; - g = [g1 g2 g3]; - if abs((sum(g2)*ts) - s*m0) > 10*eps, - fprintf(1,'Area Spec: %f Actual: %f\n', m0, sum(g)*ts); - error('grad_min_bridge: Area not calculated correctly'); - end; -else %% Must be trapezoid - % Subtract area of ramps - % - nb = ceil(mxg/dg); - nc = max(1,ceil(nb*f)); - dg_test = mxg/nb; - a_ramps = (2*nb-nc+1)*nc * dg_test * ts; - - % get number of const samples - % - a_const = m0 - a_ramps; - na = ceil(a_const/ts/mxg); - - % Get correct amplitude now - % - dg_test = m0 / ( ((2*nb-nc+1)*nc + nb*na) *ts); - A = nb * dg_test; - if ((A > mxg) || (dg_test > dg)), - error('Amp/Slew being exceeded'); - end; - g1 = s* [1:(nb-nc)] * dg_test; - g2 = s* [[(nb-nc+1):nb] nb*ones(1,na) [nb:-1:(nb-nc+1)]] * dg_test; - g3 = s* [(nb-nc):-1:0] * dg_test; - g = [g1 g2 g3]; - if abs((sum(g2)*ts) - s*m0) > 10*eps, - error('grad_min_bridge: Area not calculated correctly'); - end; - -end; - -return; - - diff --git a/RF_pulses/spectral_spatial/grad_mintrap.m b/RF_pulses/spectral_spatial/grad_mintrap.m deleted file mode 100644 index ed508bc..0000000 --- a/RF_pulses/spectral_spatial/grad_mintrap.m +++ /dev/null @@ -1,70 +0,0 @@ -function [g] = grad_mintrap (m0, mxg, mxs, ts) -% -% [g] = grad_mintrap (m0, mxg, mxs, ts) -% -% m0 - target zeroth moment (G/cm * s) -% mxg - maximum amplitude (G/cm) -% mxs - maximum slew rate (G/cm/ms) -% ts - sample time in s -% -% g - Gradient -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/grad_mintrap.m,v 1.4 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -if (m0 < 0) - s = -1; - m0 = -m0; -else - s = 1; -end; - -% Convert mxs to G/cm/s -% -mxs = mxs * 1e3; - -% Determine trapezoid parameters -% -% na - number of constant samples -% nb - number ramp samples -% A - trapezoid amplitude -% - -dg = mxs * ts; % Max delta in one sample -nb = ceil(sqrt (m0 / dg / ts)); -A = m0/(nb*ts); -if (A <= mxg), - na = 0; - dg_act = A/nb; -else - nb = ceil (mxg / dg); - dg_act = mxg / nb; - na = ceil((m0 - (nb^2 * dg_act * ts))/mxg/ts); - dg_act = m0 / (nb^2 + na*nb)/ts; - A = nb * dg_act; -end; - -% Construct discrete trapezoid --- always end with a zero value -% -g = s * [[1:nb]*dg_act ones(1,na)*A [nb-1:-1:0]*dg_act]; - -return; - - diff --git a/RF_pulses/spectral_spatial/grad_ss.m b/RF_pulses/spectral_spatial/grad_ss.m deleted file mode 100644 index 61a39bc..0000000 --- a/RF_pulses/spectral_spatial/grad_ss.m +++ /dev/null @@ -1,185 +0,0 @@ -function [gpos,gneg,g1,g2,g3] = grad_ss(m0, n, f, mxg, mxs, ts, equal) -% GRAD_SS - Calculate spectral-spatial bipolar pulse -% -% [gpos, gneg, g1, g2, g3] = grad_ss (m0, n, f, mxg, mxs, ts, equal) -% -% m0 - target zeroth moment (G/cm * s) of one lobe -% n - total number of samples to use if not [] -% f - fraction of ramp to include in bridge [0..1] -% mxg - maximum amplitude (G/cm) -% mxs - maximum slew rate (G/cm/ms) -% ts - sample time in s -% equal - boolean if pos/neg lobes should be same -% -% gpos - Positive lobe gradient -% gneg - Negative lobe gradient -% g1, g2, g3 - Ramp up, bridge, ramp down gradients -% in positive lobe - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/grad_ss.m,v 1.9 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -m0 = abs(m0); % Must be positive - -% Check n is even if equal lobes called for -% -if equal, - if bitget(n,1) ~= 0, - error('equal lobes specified, but n not even'); - end; -end; - -% Convert mxs to G/cm/s -% -mxs_s = mxs * 1e3; -dg = mxs_s * ts; % Max delta in one sample - -% Determine trapezoid parameters -% -% na - number of constant samples -% nb - number ramp samples -% nc - number samples of ramp in bridge -% A - trapezoid amplitude -% - -% Do different things if number of samples is specified -% -[gp_tmp, g1_tmp, g2_tmp, g3_tmp] = grad_min_bridge(m0, f, mxg, mxs, ts); -if equal, - gn_tmp = -gp_tmp; -else - m0_pos = sum(gp_tmp) * ts; - gn_tmp = grad_mintrap(-m0_pos, mxg, mxs, ts); -end; - -if isempty(n), - gpos = gp_tmp; - g1 = g1_tmp; - g2 = g2_tmp; - g3 = g3_tmp; - gneg = gn_tmp; -else - if (length([gp_tmp gn_tmp]) > n) - error('grad_ss: Solution not obtained in spec num samples'); - end; - - % Save known solution - % - gp_save = gp_tmp; - g1_save = g1_tmp; - g2_save = g2_tmp; - g3_save = g3_tmp; - gn_save = -gp_save; - - nb_save = find(diff(gp_save) == 0, 1, 'first'); - - % Now keep decreasing number of ramp samples in - % positive lobe until "n" exceeded - % - spec_met = 1; - while (spec_met && (nb_save > 1)) - % Get area in ramps - % - nb = nb_save - 1; - nc = max(1,ceil(nb*f)); - a_ramps = (2*nb-nc+1)*nc * dg * ts; - - % Get number of constant samples - % - a_const = m0 - a_ramps; - na = max(0,ceil(a_const/(nb*dg*ts))); - - % Get correct amplitude, gradients now - % - dg_test = m0 / ( ((2*nb-nc+1)*nc + nb*na) *ts); - A = nb * dg_test; - if ((A > mxg) || (dg_test > dg)), - spec_met = 0; - continue; - end; - g1 = [1:(nb-nc)] * dg_test; - g2 = [[(nb-nc+1):nb] nb*ones(1,na) [nb:-1:(nb-nc+1)]] * dg_test; - g3 = [(nb-nc):-1:0] * dg_test; - gp = [g1 g2 g3]; - if abs((sum(g2)*ts) - m0) > 10*eps, - error('grad_ss: Area not calculated correctly'); - end; - - if (equal) - gn = -gp; - else - gn = grad_mintrap(-sum(gp)*ts, mxg, mxs, ts); - end; - - % See if spec still met - % - if length([gp gn]) < n, - spec_met = 1; - - gp_save = gp; - g1_save = g1; - g2_save = g2; - g3_save = g3; - gn_save = gn; - nb_save = nb; - else - spec_met = 0; - end; - end; - - % Fix up result to have "exactly" n samples in it! - % - if ~equal - na = n - length(gn_save) - (2 * nb_save + 1); - else - na = (n - 2*(2 * nb_save + 1))/2; - end; - nb = nb_save; - nc = max(1,ceil(nb*f)); - - % Get correct amplitude, gradients now - % - dg_test = m0 / ( ((2*nb-nc+1)*nc + nb*na) *ts); - A = nb * dg_test; - if ((A >= 1.001 * mxg) || (dg_test > 1.001 * dg)), - error('Amp/Slew being exceeded'); - end; - g1 = [1:(nb-nc)] * dg_test; - g2 = [[(nb-nc+1):nb] nb*ones(1,na) [nb:-1:(nb-nc+1)]] * dg_test; - g3 = [(nb-nc):-1:0] * dg_test; - gpos = [g1 g2 g3]; - if abs((sum(g2)*ts) - m0) > 10*eps, - error('grad_ss: Area not calculated correctly'); - end; - - if (~equal) - ratio = sum(-gn_save)/sum(gpos); - if (ratio < 1-10*eps) - % warning('grad_ss: Improbable ratio'); % fix problem here - end; - gneg = gn_save / ratio; - else - gneg = -gpos; - end; -end; - - -return; - - diff --git a/RF_pulses/spectral_spatial/plot_spec.m b/RF_pulses/spectral_spatial/plot_spec.m deleted file mode 100644 index c1373f4..0000000 --- a/RF_pulses/spectral_spatial/plot_spec.m +++ /dev/null @@ -1,35 +0,0 @@ -function plot_spec(f, a, d, type) -% PLOT_SPEC - Utility to plot frequency specifications -% -% plot_spec(f, a, d, type) -% -% f - frequency band edges -% a - band amplitudes -% d - band ripple specs -% type - line/plotting type (see S in 'help plot') - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -if nargin < 4, - type = 'k--'; -end; -nband = length(f)/2; -for band = 1:nband, - idx = [band*2-1:band*2]; - plot(f(idx), a(idx)+d(band)*ones(1,2), sprintf('%s',type)); - hold on; - plot(f(idx), a(idx)-d(band)*ones(1,2), sprintf('%s',type)); -end; diff --git a/RF_pulses/spectral_spatial/plot_spec_phs.m b/RF_pulses/spectral_spatial/plot_spec_phs.m deleted file mode 100644 index ef1aba4..0000000 --- a/RF_pulses/spectral_spatial/plot_spec_phs.m +++ /dev/null @@ -1,49 +0,0 @@ -function plot_spec_phs(f, a, d, w, h, type) -% PLOT_SPEC - Utility to plot frequency specifications -% -% plot_spec(f, a, d, type) -% -% f - frequency band edges -% a - band amplitudes -% d - band ripple specs -% type - line/plotting type (see S in 'help plot') - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -if nargin < 6, - type = 'k--'; -end; -nband = length(f)/2; -subplot(211) -for band = 1:nband, - idx = [band*2-1 band*2]; - plot(f(idx), abs(a(band))+abs(d(band))*ones(1,2), sprintf('%s',type)); - hold on; - plot(f(idx), abs(a(band))-abs(d(band))*ones(1,2), sprintf('%s',type)); -end; -plot(w,abs(h)); - -subplot(212) -for band = 1:nband, - idx = [band*2-1 band*2]; - if abs(a(band)) == 0 - continue; - end - plot(f(idx), angle(a(band))+angle(d(band))*ones(1,2), sprintf('%s',type)); - hold on; - plot(f(idx), angle(a(band))-angle(d(band))*ones(1,2), sprintf('%s',type)); -end; -plot(w,angle(h)); diff --git a/RF_pulses/spectral_spatial/rf_ripple.m b/RF_pulses/spectral_spatial/rf_ripple.m deleted file mode 100644 index bea08ba..0000000 --- a/RF_pulses/spectral_spatial/rf_ripple.m +++ /dev/null @@ -1,119 +0,0 @@ - function [d, a, ang] = rf_ripple(de, a, ang, type) -% RF_RIPPLE - Compute polynomial ripple required for various pulse types -% -% Input -% - de - vector of ripples required -% - a - vector of amplitudes in bands -% - ang - angle of excitation -% - excitation type: 'ex', 'se', 'sat', 'inv' -% -% Output -% - d: ripples for filter design -% - a: band amplitudes for filter design -% - ang: angle of excitation - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -nband = length(de); -for band = 1:nband, - db = de(band); - ab = a(band); - switch (type ) - case 'ex' - % Determine B ripple originating from mxy ripple, - % find which is most significant, then use this - % to set the ripple - % - mxy_mid = sin(2*asin(sin(ang/2)*ab)); - mxy_pos = max(-1,min(1,db + mxy_mid)); - mxy_neg = max(-1,min(1,-db + mxy_mid)); - - B_mid = sin(ang/2) * ab; - B_pos = sin(asin(mxy_pos)/2); - B_neg = sin(asin(mxy_neg)/2); - - d(band) = max(abs(B_pos-B_mid), abs(B_neg-B_mid))/sin(ang/2); - case 'se' - mxy_mid = (sin(ang/2)*ab)^2; - mxy_pos = max(0,min(1,db + mxy_mid)); - mxy_neg = max(0,min(1,-db + mxy_mid)); - - % check for ripples that will result in B > 1 and scale back - % a if necessary - if (mxy_pos >= 1) || (mxy_neg >= 1) - ab = sqrt(1 - abs(db)) / sin(ang/2); - mxy_mid = (sin(ang/2)*ab)^2; - mxy_pos = max(0,min(1,db + mxy_mid)); - mxy_neg = max(0,min(1,-db + mxy_mid)); - a(band) = ab; - end - - B_mid = sin(ang/2) * ab; - B_pos = sqrt(mxy_pos); - B_neg = sqrt(mxy_neg); - - d(band) = max(abs(B_pos-B_mid), abs(B_neg-B_mid))/sin(ang/2); -% if a(band) == 1, -% d(band) = de(band)/4; -% else -% d(band) = sqrt(de(band)); -% end; - case {'inv','sat'} - mz_mid = 1 - 2* (sin(ang/2)*ab)^2; - mz_pos = max(-1,min(1,db + mz_mid)); - mz_neg = max(-1,min(1,-db + mz_mid)); - - % check for ripples that will result in B > 1 and scale back - % a if necessary - if (mz_neg <= -1) || (mz_pos <= -1) - ab = sqrt(1 - abs(db)/2) / sin(ang/2); - mz_mid = 1 - 2* (sin(ang/2)*ab)^2; - mz_pos = max(-1,min(1,db + mz_mid)); - mz_neg = max(-1,min(1,-db + mz_mid)); - a(band) = ab; - end - - B_mid = sin(ang/2) * ab; - B_pos = sin(acos(mz_pos)/2); - B_neg = sin(acos(mz_neg)/2); -% B_pos = sqrt((1-mz_pos)/2); % same as above -% B_neg = sqrt((1-mz_neg)/2); - - d(band) = max(abs(B_pos-B_mid), abs(B_neg-B_mid))/sin(ang/2); -% if a(band) == 1, -% d(band) = de(band)/8; -% else -% d(band) = sqrt(de(band)/2); -% end; -% case 'sat' -% if a(band) == 1, -% d(band) = de(band)/2; -% else -% d(band) = sqrt(de(band)); -% end; - - end; -end; - - -% scale a if the peak angle has been reduced -if max(a) ~= 1 - max_a = max(a); - a = a / max_a; - ang = 2*asin(sin(ang/2)*max_a); - d = d / max_a; -end \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/signa.m b/RF_pulses/spectral_spatial/signa.m deleted file mode 100644 index 483eb52..0000000 --- a/RF_pulses/spectral_spatial/signa.m +++ /dev/null @@ -1,63 +0,0 @@ -function signa(wav,fn,s) - -% -% signa(waveform, filename [,scale]); -% -% writes the waveform out as short integers with the low -% bit masked off. -% -% Inputs: -% waveform -- vector, may be complex -% filename -- string, if wavefrom is complex '.r' and '.i' are appended, -% and two files are written. -% scale -- optional scale. If unspecified, the waveform is scaled to -% full scale integer 32766. If specified, the output is -% waveform*scale*32766 -% - -% -% Written by John Pauly, Dec. 5, 1994 -% (c) Leland Stanford Jr. University -% - -wmax = hex2dec('7ffe'); - -% if no scale is specified, use as much dynamic range as possible -if nargin == 2, - s = 1/max(max(abs(real(wav)),abs(imag(wav)))); -end; - -% scale up to fit in a short integer -wav = wav*s*wmax; - -% mask off low bit, since it would be an EOS otherwise -wav = 2*round(wav/2); - -% if the imaginary component is zero, supress it -if sum(abs(imag(wav))) == 0, - wav = real(wav); -end; - -if isreal(wav), - fip = fopen(fn,'wb','b'); - if fip == -1, - disp(sprintf('Error opening %s for write',fn)); - return; - end; - fwrite(fip,wav,'short'); -else - fip = fopen([fn,'.r'],'wb','b'); - if fip == -1, - disp(sprintf('Error opening %s for write',[fn,'.r'])); - return; - end; - fwrite(fip,real(wav),'short'); - fclose(fip); - fip = fopen([fn,'.i'],'wb','b'); - if fip == -1, - disp(sprintf('Error opening %s for write',[fn,'.i'])); - return; - end; - fwrite(fip,imag(wav),'short'); - fclose(fip); -end; diff --git a/RF_pulses/spectral_spatial/spec_interp.m b/RF_pulses/spectral_spatial/spec_interp.m deleted file mode 100644 index 07a3d88..0000000 --- a/RF_pulses/spectral_spatial/spec_interp.m +++ /dev/null @@ -1,130 +0,0 @@ -function hi = spec_interp(h, ni, off, f, dbg) -% SPEC_INTERP - Interpolate filter keeping spectral response consistent -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - - N = length(h); - mult_factor = 15; - w = linspace(-pi, pi, 2*mult_factor*N); - - % Try weighting samples that are in frequency band - % more heavily - % - f = f * pi; - idx_band = []; - nband = length(f)/2; - for band = 1:nband, - idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); - idx_band = [idx_band idx]; - end; - wt_band = 10; - wt = ones(length(w),1); - wt(idx_band) = wt_band; - - % Get reference transform - % - t_ref = [0:N-1]; - Wref = exp(-i*kron(w', t_ref)); - Fref = Wref * h(:); - Fref_wt = wt .* Fref; - - if (dbg >= 2), - filt_fig = figure; - end; - - - ni_2 = floor(ni/2); - for idx = 1:ni - % Get actual sampling positions - % - t_act = t_ref + off + (idx-1)/ni; - - if (dbg >= 2) - figure(filt_fig); - subplot(411); - stem([t_ref.' t_act.'], ones(length(t_ref),2)); - legend('Reference', 'Actual'); - title('Sampling Locations'); - end; - - % Get actual, add weights - % - Wact = exp(-i*kron(w', t_act)); - Wact_wt = repmat(wt,1,length(t_act)) .* Wact; - - % Get new filter - % - hi(idx,:) = pinv(Wact_wt)*Fref_wt; - - if ( (dbg >= 2) && (rem(idx,4)==0) ), - plot_db = 0; - figure(filt_fig); - - Fact = Wact * h(:); - Fact_fix = Wact * hi(idx,:).'; - - subplot(4,1,2); - hold off; - plot(abs(h)); - hold on; - plot(abs(hi(idx)), 'r--'); - title('Beta Polynomials'); - - subplot(4,1,3); - if plot_db, - hold off; - plot(w/pi,20*log10(abs(Fref)),'b-'); - hold on; - plot(w/pi, 20*log10(abs(Fact)), 'g--'); - plot(w/pi, 20*log10(abs(Fact_fix)), 'r--'); - ylabel('DB Scale'); - else - hold off; - plot(w/pi,abs(Fref),'b-'); - hold on; - plot(w/pi, abs(Fact), 'g--'); - plot(w/pi, abs(Fact_fix), 'r--'); - ylabel('Linear Scale'); - end; - - title('Magnitude Response'); - - subplot(4,1,4); - hold off; - plot(w/pi,angle(Fref),'b-'); - hold on; - plot(w/pi,angle(Fact),'g--'); - plot(w/pi,angle(Fact_fix),'r--'); - title('Phase Response'); - - fprintf(1,'Offset: %f -- Hit any key to continue\n', off + (idx-1)/ni); - pause; - end; - - - end; - - hi = hi(:); - - return; - - - - - diff --git a/RF_pulses/spectral_spatial/spec_interp_nonuniform.m b/RF_pulses/spectral_spatial/spec_interp_nonuniform.m deleted file mode 100644 index 4410296..0000000 --- a/RF_pulses/spectral_spatial/spec_interp_nonuniform.m +++ /dev/null @@ -1,137 +0,0 @@ -function [hi, t_all] = spec_interp_nonuniform(h, ni, off, f, dbg) -% SPEC_INTERP_NONUNIFORM - Interpolate filter to nonuniform taps while -% keeping spectral response consistent -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -if isempty(off) - off = 0.5; -end - - N = length(h); - mult_factor = 15; - w = linspace(-pi, pi, 2*mult_factor*N); - - % Try weighting samples that are in frequency band - % more heavily - % - f = f * pi; - idx_band = []; - nband = length(f)/2; - for band = 1:nband, - idx = find( (w >= f(band*2-1)) & (w <= f(band*2)) ); - idx_band = [idx_band idx]; - end; - wt_band = 10; - wt = ones(length(w),1); - wt(idx_band) = wt_band; - - % Get reference transform - % - t_ref = [0:N-1]; - Wref = exp(-i*kron(w', t_ref)); - Fref = Wref * h(:); - Fref_wt = wt .* Fref; - - if (dbg >= 2), - filt_fig = figure; - end; - - t_off = ([1:ni]-(ni+1)/2)/(ni-1)*2*off; - t_all = zeros(ni, N); - - for idx = [1:ni] - % Get actual sampling positions - % - t_all(idx,:) = t_ref + t_off(idx)* (-1).^[0:N-1]; - t_act = t_all(idx,:); - - if (dbg >= 2) - figure(filt_fig); - subplot(411); - stem([t_ref.' t_act.'], ones(length(t_ref),2)); - legend('Reference', 'Actual'); - title('Sampling Locations'); - end; - - % Get actual, add weights - % - Wact = exp(-i*kron(w', t_act)); - Wact_wt = repmat(wt,1,length(t_act)) .* Wact; - - % Get new filter - % - hi(idx,:) = pinv(Wact_wt)*Fref_wt; - - if ( (dbg >= 2) && (rem(idx,5)==0) ), - plot_db = 0; - figure(filt_fig); - - Fact = Wact * h(:); - Fact_fix = Wact * hi(idx,:).'; - - subplot(4,1,2); - hold off; - plot(abs(h)); - hold on; - plot(abs(hi(idx)), 'r--'); - title('Beta Polynomials'); - - subplot(4,1,3); - if plot_db, - hold off; - plot(w/pi,20*log10(abs(Fref)),'b-'); - hold on; - plot(w/pi, 20*log10(abs(Fact)), 'g--'); - plot(w/pi, 20*log10(abs(Fact_fix)), 'r--'); - ylabel('DB Scale'); - else - hold off; - plot(w/pi,abs(Fref),'b-'); - hold on; - plot(w/pi, abs(Fact), 'g--'); - plot(w/pi, abs(Fact_fix), 'r--'); - ylabel('Linear Scale'); - end; - - title('Magnitude Response'); - - subplot(4,1,4); - hold off; - plot(w/pi,angle(Fref),'b-'); - hold on; - plot(w/pi,angle(Fact),'g--'); - plot(w/pi,angle(Fact_fix),'r--'); - title('Phase Response'); - - fprintf(1,'Offset: %f -- Hit any key to continue\n', t_off(idx)); - pause; - end; - - - end; - - hi = hi(:); - t_all = t_all(:); - - return; - - - - - diff --git a/RF_pulses/spectral_spatial/spectral_fact.m b/RF_pulses/spectral_spatial/spectral_fact.m deleted file mode 100644 index 4282eb3..0000000 --- a/RF_pulses/spectral_spatial/spectral_fact.m +++ /dev/null @@ -1,64 +0,0 @@ -% h = spectral_fact(r) -% -% Spectral factorization using Kolmogorov 1939 approach -% (code follows pp. 232-233, Signal Analysis, by A. Papoulis) -% -% Computes the minimum-phase impulse response which satisfies -% given auto-correlation. -% -% Input: -% r: auto-correlation coefficients should be passed in -% as a column vector, odd length -% Output -% h: impulse response that gives the desired auto-correlation - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -function h = spectral_fact(r) - -% length of the impulse response sequence -nr = length(r); -n = (nr+1)/2; - -% over-sampling factor -mult_factor = 30; % should have mult_factor*(n) >> n -m = mult_factor*n; - -% computation method: -% H(exp(jTw)) = alpha(w) + j*phi(w) -% where alpha(w) = 1/2*ln(R(w)) and phi(w) = Hilbert_trans(alpha(w)) - -% compute 1/2*ln(R(w)) -w = 2*pi*[0:m-1]/m; -R = exp( -j*kron(w',[-(n-1):n-1]) )*r; -R = abs(real(R)); % remove numerical noise from the imaginary part -alpha = 1/2*log(R); - -% find the Hilbert transform -alphatmp = fft(alpha); -alphatmp(floor(m/2)+1:m) = -alphatmp(floor(m/2)+1:m); -alphatmp(1) = 0; -alphatmp(floor(m/2)+1) = 0; -phi = real(ifft(j*alphatmp)); - -% now retrieve the original sampling -index = find(rem([0:m-1],mult_factor)==0); -alpha1 = alpha(index); -phi1 = phi(index); - -% compute the impulse response (inverse Fourier transform) -h = ifft(exp(alpha1+j*phi1),n); diff --git a/RF_pulses/spectral_spatial/ss_alias.m b/RF_pulses/spectral_spatial/ss_alias.m deleted file mode 100644 index 0902174..0000000 --- a/RF_pulses/spectral_spatial/ss_alias.m +++ /dev/null @@ -1,385 +0,0 @@ -function [f_a, a_a, d_a, f_off] = ss_alias(f, a, d, f_off, fs, sym, fig, threshold_edge) -% SS_ALIAS - Alias filter specifications into effective bandwidth -% -% function [f_a, a_a, d_a, f_off] = ss_alias(f, a, d, f_off, fs, sym, fig, threshold_edge) -% -% Inputs: -% f - frequency band edges, in Hz, each band monotonically increasing, -% length(f) = 2 * number of bands -% a - amplitude for each band [0..1] -% d - ripple weighting for each band -% f_off - offset frequency in Hz (if [], then will be -% set to include as many passbands within one sampling -% interval as possible -% fs - sampling frequency (bandwidth), in Hz -% sym - flag indicating whether frequency response should be symmetric -% threshold_edge - [optional], threshold of the min distance to the -% normalized spectrum edge [-1,1], usually 0.15-0.2 -% fig - [optional], figure to plot -% -% Outputs: -% f_a - Aliased frequency band edges into normalized freq [-1..1] -% a_a - amplitude of aliased bands -% d_a - ripple weighting of aliased bands -% f_off - offset frequency in Hz -% -% Modification by Hong Shang, June 2013 -% 1 Display the aliased filter spec if with one more input, fig, plot -% normalized band before and after aliasing and compatible flag, to help -% visualize the choice of BW -% 2 the choice of f_off when sym=0, for both including as many bands in the -% main spectrum and getting rid of bands at spectrum edge. -% 3 ripple can be different if overlap -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_alias.m,v 1.12 2014/05/22 20:43:59 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % check input parameters - % - if nargin < 6, - error('Usage: [f_a, a_a, d_a, f_off] = ss_alias(f, a, d, f_off, fs, sym)\n'); - elseif nargin == 6 - threshold_edge = 0.15; - display_flag = 0; - elseif nargin == 7 - if ishandle(fig) - display_flag = 1; - threshold_edge = 0.15; - else - display_flag = 0; - threshold_edge = fig; - end; - elseif nargin == 8 - display_flag = 1; - end; - - if mod(length(f), 2) ~= 0, - error('Frequency vector (f) of band pairs must be even length'); - end; - - nf = length(f)/2; - if length(d) ~= nf, - error('Ripple vector incorrect length'); - end; - if length(a) ~= nf, - error('Amplitude vector incorrect length'); - end; - - df = diff(f); - if (min(df(1:2:end)) <= 0) - error('Frequency bands must be monotonic increasing'); - end; - - if (max(df(1:2:end)) >= fs) % there is one band longer than bandwidth, impossible to design such filter - f_a = []; a_a = []; d_a = []; f_off = 0; - return; - end; - - % If sym flag then either set or check f_off - if (sym), - if ~isempty(f_off), - % Check specified frequency offset to make sure it is < midpoint - % of first band or > than midpoint of top band - if ((f_off > (f(2)-f(1))/2) && (f_off < (f(end) - f(end-1))/2) ) - error('f_off not at band edges'); - end; - else - % Set f_off to left band edge - f_off = (f(2)+f(1))/2; - end; - else - % Set f_off to include as many bands as possible in one sampling interval - if isempty(f_off) - if (max(f) - min(f)) <= fs, % all band can exist in the center spectrum - f_off = (max(f) + min(f))/2; - else - % Find how many bands are in -fs/2..fs/2 -% f_l = f(1:2:end); -% f_u = f(2:2:end); -% f_off_test = linspace(min(f)+fs/2, max(f)-fs/2, 100); -% band_in = zeros(length(f_off_test),length(f_l)); -% nband = zeros(1,length(f_off_test)); -% for off_idx = 1:length(f_off_test), -% f_off = f_off_test(off_idx); -% band_in(off_idx,:) = ((f_l >= f_off-fs/2) & (f_l <= f_off+fs/2) & (f_u >= f_off-fs/2) & (f_u <= f_off+fs/2)); -% nband(off_idx) = sum(band_in(off_idx,:)); -% end; -% [~, off_idx] = max(nband); -% in_idx = find(band_in(off_idx,:)); -% f_off = (f(in_idx(1)*2-1) + f(in_idx(end)*2))/2; - - % modification of choosing f_off - f_l = f(1:2:end); - f_u = f(2:2:end); - f_off_test = linspace(min(f), max(f), 500); % Hz - band_in = zeros(length(f_off_test),length(f_l)); - nband = zeros(1,length(f_off_test)); - edge_distance = zeros(1,length(f_off_test)); - split_flag = zeros(1,length(f_off_test)); - for off_idx = 1:length(f_off_test), - f_off = f_off_test(off_idx); - band_in(off_idx,:) = ((f_l >= f_off-fs/2) & (f_l <= f_off+fs/2) & (f_u >= f_off-fs/2) & (f_u <= f_off+fs/2)); - nband(off_idx) = sum(band_in(off_idx,:)); - - % pre-calculation of Normalized and aliased frequency - fnorm_pre = zeros(size(f)); - for idx = 1:nf - % Normalized frequencies - fa1 = (f(idx*2-1) - f_off) / (fs/2); - fa2 = (f(idx*2) - f_off) / (fs/2); - % Get aliased frequencies - fa1 = mod(fa1+1,2)-1; - fa2 = mod(fa2+1,2)-1; - % get rid of confusing about whether at -1, or 1 - if (fa2 < fa1) && (fa2 == -1) - fa2 = 1; - end; - if (fa2 < fa1) && (fa1 == 1) - fa1 = -1; - end; - % check whether a band is split - if fa2 < fa1 - split_flag(off_idx) = 1; - end - fnorm_pre(idx*2-1) = fa1; - fnorm_pre(idx*2) = fa2; - end - edge_distance(off_idx) = min( [min(fnorm_pre(1:2:end)+1), min(1-fnorm_pre(2:2:end))] ); - if split_flag(off_idx) > 0.5; edge_distance(off_idx) = 0; end; - end; - % figure; - % subplot(3,1,1); plot(f_off_test,edge_distance,'b.'); xlabel('offset frequency, Hz'); title('min distance to the edge'); axis tight; set(gca,'ylim',[-0.1 0.7]); - % subplot(3,1,2); plot(f_off_test,split_flag,'b.'); xlabel('offset frequency, Hz'); title('whether some bands are split'); axis tight; set(gca,'ylim',[0 1.5]); - % subplot(3,1,3); plot(f_off_test,nband,'b.'); xlabel('offset frequency, Hz'); title('how many bands in the main spectrum'); axis tight; set(gca,'ylim',[0 nf]); - - % find the optimal f_off - idx_1 = find( split_flag < 0.5 ); - f_off_test = f_off_test(idx_1); edge_distance = edge_distance(idx_1); nband = nband(idx_1); - idx_2 = find( nband == max(nband) ); - [value_3,idx_3] = max(edge_distance(idx_2)); - if value_3 > threshold_edge - f_off = f_off_test(idx_2(idx_3)); - else - idx_4 = find( nband >= (max(nband)-1) ); - [~,idx_5] = max(edge_distance(idx_4)); - f_off = f_off_test(idx_4(idx_5)); - end; - end; - end; - end; - - % If symmetric frequency response, then construct mirrored response, update number of bands - if (sym) - f_h = f - f_off; - f = [-f_h(end:-1:1) f_h] + f_off; - a = [a(end:-1:1) a]; - d = [d(end:-1:1) d]; - nf = length(f)/2; - end; - - % Go through each band pair, determine aliased frequencies - % in normalized space, and split if necessary - new_idx = 1; - fnorm = zeros(size(f)); - for idx = 1:nf, - % Normalize frequencies - fnorm(idx*2-1) = (f(idx*2-1) - f_off) / (fs/2); - fnorm(idx*2) = (f(idx*2) - f_off) / (fs/2); - - % Get aliased frequencies - fa1 = mod(fnorm(idx*2-1)+1,2)-1; - fa2 = mod(fnorm(idx*2)+1,2)-1; - - % in case one band is interrupted into two ends of main spectrum - % Check to see if endpoints can be shifted to form one single band - if (fa2 < fa1) && (fa2 == -1) - fa2 = 1; - end; - if (fa2 < fa1) && (fa1 == 1) - fa1 = -1; - end; - - if (fa2 < fa1), % if still split, then create a new band - f_a(new_idx*2-1) = -1; - f_a(new_idx*2) = fa2; - a_a(new_idx) = a(idx); - d_a(new_idx) = d(idx); - new_idx = new_idx + 1; - - f_a(new_idx*2-1) = fa1; - f_a(new_idx*2) = 1; - a_a(new_idx) = a(idx); - d_a(new_idx) = d(idx); - new_idx = new_idx + 1; - else - f_a(new_idx*2-1) = fa1; - f_a(new_idx*2) = fa2; - a_a(new_idx) = a(idx); - d_a(new_idx) = d(idx); - new_idx = new_idx + 1; - end; - end; - - % additional display - if display_flag == 1 - clf(fig); figure(fig); - subplot(2,1,1); hold on; - for i = 1:length(a) - f_sub = [fnorm(2*i-1),fnorm(2*i)]; - bound_down = (a(i) - d(i))*ones(size(f_sub)) ; - bound_up = (a(i) + d(i))*ones(size(f_sub)); - plot(f_sub,bound_down,'r-',f_sub,bound_up,'r-'); - end; - hold off; xlabel('normalized frequency'); title(['filter spec before aliasing at fs = ',num2str(fs),'Hz']); set(gca,'xlim',[min(fnorm)-0.1,max(fnorm)+0.1]); set(gca,'ylim',[0,max(a)+max(d)+3e-2]); - - figure(fig); subplot(2,1,2); hold on; - for i = 1:length(a_a) - f_sub = [f_a(2*i-1),f_a(2*i)]; - bound_down = (a_a(i) - d_a(i))*ones(size(f_sub)) ; - bound_up = (a_a(i) + d_a(i))*ones(size(f_sub)); - plot(f_sub,bound_down,'r-',f_sub,bound_up,'r-'); - end; - hold off; xlabel('normalized frequency'); title(['filter spec after aliasing at fs = ',num2str(fs),'Hz']); set(gca,'xlim',[-1,1]); set(gca,'ylim',[0,max(a_a)+max(d_a)+3e-2]); - end - - % Check for overlaps - % -- a little complicated - overlap_found = 1; - incompatible_overlap = 0; - while (overlap_found && ~incompatible_overlap && length(f_a)/2 > 1) - % Check each frequency band for overlap - nf = length(f_a)/2; - f_tmp = []; - a_tmp = []; - d_tmp = []; - for chk_idx = 1:nf, - % Copy frequency, ripple, amplitude - f_tmp(chk_idx*2-1) = f_a(chk_idx*2-1); - f_tmp(chk_idx*2) = f_a(chk_idx*2); - d_tmp(chk_idx) = d_a(chk_idx); - a_tmp(chk_idx) = a_a(chk_idx); - - % Check current band edges with all remaining bands for overlap - fl_1 = f_a(chk_idx*2-1); - fu_1 = f_a(chk_idx*2); - for rem_idx = chk_idx+1:nf, - % Initialize flags - overlap_ok = 0; - overlap_found = 0; - - % Check to see if overlap would be compatible i.e. same ripple, same amplitude - % if ((d_a(chk_idx) == d_a(rem_idx)) && (a_a(chk_idx) == a_a(rem_idx))); overlap_ok = 1; end; - % only amplitude need to be consistent, ripple can be - % different, use the smaller ripple if overlap - if ( a_a(chk_idx) == a_a(rem_idx) ); overlap_ok = 1; end; - - % Check if band edges overlap - fl_2 = f_a(rem_idx*2-1); - fu_2 = f_a(rem_idx*2); - if (fl_1 <= fl_2) && (fu_1 >= fl_2) - % Fix overlapping band - f_tmp(chk_idx*2-1) = fl_1; - f_tmp(chk_idx*2) = max(fu_1, fu_2); - d_tmp(chk_idx) = min([d_a(chk_idx),d_a(rem_idx)]); - - % Copy other bands - for cp_idx = (chk_idx+1):nf, - if cp_idx ~= rem_idx, - f_tmp = [f_tmp f_a(cp_idx*2-1) f_a(cp_idx*2)]; - a_tmp = [a_tmp a_a(cp_idx)]; - d_tmp = [d_tmp d_a(cp_idx)]; - end; - end; - overlap_found = 1; - break; % Start over - elseif (fu_1 >= fu_2) && (fl_1 <= fu_2) - % Fix overlapping bands - f_tmp(chk_idx*2-1) = min(fl_1, fl_2); - f_tmp(chk_idx*2) = fu_1; - d_tmp(chk_idx) = min([d_a(chk_idx),d_a(rem_idx)]); - - % Copy other bands - for cp_idx = (chk_idx+1):nf, - if cp_idx ~= rem_idx, - f_tmp = [f_tmp f_a(cp_idx*2-1) f_a(cp_idx*2)]; - a_tmp = [a_tmp a_a(cp_idx)]; - d_tmp = [d_tmp d_a(cp_idx)]; - end; - end; - overlap_found = 1; - break; % Start over - elseif (fl_1 >= fl_2) && (fu_1 <= fu_2) - % Fix overlapping bands - f_tmp(chk_idx*2-1) = fl_2; - f_tmp(chk_idx*2) = fu_2; - d_tmp(chk_idx) = min([d_a(chk_idx),d_a(rem_idx)]); - - % Copy other bands - for cp_idx = (chk_idx+1):nf, - if cp_idx ~= rem_idx, - f_tmp = [f_tmp f_a(cp_idx*2-1) f_a(cp_idx*2)]; - a_tmp = [a_tmp a_a(cp_idx)]; - d_tmp = [d_tmp d_a(cp_idx)]; - end; - end; - overlap_found = 1; - break; % Start over - end; - end; - if overlap_found, - incompatible_overlap = ~overlap_ok; - f_a = f_tmp; - d_a = d_tmp; - a_a = a_tmp; - break; % Start over from beginning - end; - end; - end; - - % If incompatible overlap, then return empty matrices - if incompatible_overlap, - f_a = []; d_a = []; a_a = []; - if display_flag == 1 %modification with additional display - figure(fig); subplot(2,1,2); legend('incompatible overlap'); - end - return; - end; - - % Sort frequencies into ascending order - [f_a, idx_sort] = sort(f_a); - a_a = a_a(idx_sort(2:2:end)/2); - d_a = d_a(idx_sort(2:2:end)/2); - - % If symmetric response then return only positive bands - if (sym) - % Find right band edges that are positive, and fix return variables - idx_pos = find(f_a(2:2:end) > 0); - f_tmp = []; - for idx = 1:length(idx_pos), - f_tmp(idx*2-1) = f_a(idx_pos(idx)*2-1); - f_tmp(idx*2) = f_a(idx_pos(idx)*2); - end; - f_a = max(0,f_tmp); - a_a = a_a(idx_pos); - d_a = d_a(idx_pos); - end; - - return; - - diff --git a/RF_pulses/spectral_spatial/ss_b1verse.m b/RF_pulses/spectral_spatial/ss_b1verse.m deleted file mode 100644 index 3ad99bf..0000000 --- a/RF_pulses/spectral_spatial/ss_b1verse.m +++ /dev/null @@ -1,238 +0,0 @@ -function [rfv, gv] = ss_b1verse(g, rf, b1max, gmax, smax, ts, gamma, slew_penalty, dbg); -% [rfv, gv] = ss_b1verse(g, rf, b1max, gmax, smax, ts, gamma, slew_penalty, dbg) -% -% Use VERSE to reduce maximum RF amplitude while retaining an -% identical pulse duration. -% Input RF and gradient must correspond (ie RF should be once VERSE'd if -% gradient is varying). -% A slew rate penalty that reduces the allowable slew rate for larger RF -% amplitudes is also implemented with the slew_penalty variable that -% determines the degree of this penalty. -% -% INPUTS: -% g - gradient in G/cm -% rf - scaled as per rftools (sum(rf) = flip) -% b1max - max RF -% gmax - max gradient, in G/cm -% smax - max slew rate, in G/cm/ms -% ts - sampling interval, in sec -% gamma - gyromagnetic ratio, in Hz/G -% slew_penalty (optional) - degree of slew rate reduction -% default is 0 (no penalty) -% dbg (optional) - indicates debug level -% -% OUTPUTS: -% rfv - versed RF -% gv - new gradient - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% TODO: -% - allow negative gradients - -if nargin < 8 - slew_penalty = 0; -end - -if nargin < 9 - dbg = 0; -end - -if length(g) == 1 - g = g*ones(size(rf)); -end - -if length(b1max) == 1 - b1max = b1max*ones(size(rf)); -end - -dt = ts*ones(size(rf)); -t_unif = ([0:length(rf)-1] + 0.5) * ts; -dt_unif = dt; - -S_rfg = 1 / (2*pi*gamma*ts); - -% convert to Gauss -if dbg >= 2 - rfg = rf *S_rfg; - fprintf('Initial Max RF fraction: %f\n', max(abs(rfg) ./ b1max)); -end - -T = sum(dt); - -notdone = 1; - -% maxiter may not be necessary because -% the routine should either fail or succeed at some point -niter = 0; -maxiter = 100; - -%area = sum(g); - -while (niter < maxiter) - niter = niter + 1; - - Imaxed = zeros(size(rf)); - Islewed = zeros(size(rf)); - % fix points with zero gradient - Islewed(find(g==0)) = 1; - % fix endpoints - Islewed([1,end]) = 1; - - if dbg >= 2 - figure(99) - subplot(311) - plot(cumsum(dt),g) - subplot(312) - plot(cumsum(dt),abs(rf) / (2*pi*gamma*ts)) - subplot(313) - plot(cumsum(dt),diff(g) ./ ((dt(1:end-1) + dt(2:end))/2)) - pause - end - - b = ones(1,5)/5; - b =firls(8, [0 .03 .06 1], [1 1 0 0]); - rffilt = filtfilt(b, 1, abs(rf)) / (sum(b)^2); - rffilt = max(abs(rf), rffilt); -% rffilt = abs(rf); - filtmax = max( max(abs(rffilt)), max(b1max)/S_rfg); - s_mod = (1 - 0.999*rffilt/filtmax) .^slew_penalty; -% s_mod = (1 - 0.999*abs(rf)/max(abs(rf))) .^slew_penalty; - -% s_mod = (tanh((slew_penalty(1) - rffilt/filtmax) * slew_penalty(2)) + 1 ) / 2; - smax_mod = smax*1e3 * s_mod; - - % Go through gradient forward looking for slew-rate violations - for k = 2:length(rf) - slew = (g(k) - g(k-1)) / (dt(k) + dt(k-1)) / 0.5; - - if 1 - smaxk = smax*1e3 * ... - (1 - (abs(rffilt(k)) + abs(rffilt(k-1)))*S_rfg / (b1max(k)+b1max(k-1)) )^slew_penalty; - else - smaxk = smax_mod(k); - end - if (slew > smaxk ) - gh = g(k); gl = g(k-1); - dth = dt(k); dtl = dt(k-1); - - a = smax_mod(k) * dth; - b = smax_mod(k) * dtl + 2*gl; - c = -2*gh; - - scale = (-b + sqrt(b^2-4*a*c))/(2*a); - - rf(k) = rf(k) / scale; - g(k) = g(k) / scale; - dt(k) = dt(k) * scale; - Islewed(k) = 1; - end - - end - - % Go through gradient in reverse looking for slew-rate violations - for k = length(rf)-1:-1:1 - slew = (g(k) - g(k+1)) / (dt(k) + dt(k+1)) / 0.5; - - if 1 - smaxk = smax*1e3 * ... - (1 - (abs(rffilt(k)) + abs(rffilt(k+1)))*S_rfg / (b1max(k) + b1max(k+1)) )^slew_penalty; - else - smaxk = smax_mod(k); - end - if (slew > smaxk) - gh = g(k); gl = g(k+1); - dth = dt(k); dtl = dt(k+1); - - a = smax_mod(k) * dth; - b = smax_mod(k) * dtl + 2*gl; - c = -2*gh; - - scale = (-b + sqrt(b^2-4*a*c))/(2*a); - - rf(k) = rf(k) / scale; - g(k) = g(k) / scale; - dt(k) = dt(k) * scale; - Islewed(k) = 1; - end - - end - - - % Check for violoations of max RF - for k = 1:length(rf) - rfscale = abs(rf(k)) * S_rfg / (b1max(k)*.999); - - if (rfscale > 1) - rf(k) = rf(k) / rfscale; - g(k) = g(k) / rfscale; - dt(k) = dt(k) * rfscale; - - Imaxed(k) = 1; - end - end - - - % compensate for time expansion in removing max RF and slew - % rate violations by shrinking other time samples and increasing - % RF and gradient correspondingly - Ifixed = find(Imaxed | Islewed); - Ishrink = find(~(Imaxed | Islewed)); - shrink_scale = (T - sum(dt(Ifixed))) / sum(dt(Ishrink)); - - % Check if pulse exceeds length requirement - if shrink_scale < 0 - % error('ss_verse: RF pulse unrealizeable'); - rfv = []; - gv = []; - return; - elseif (abs(shrink_scale-1) < 1e-14) || (isempty(Imaxed) && isempty(Islewed)) - % DONE! - notdone = 0; - else - rf(Ishrink) = rf(Ishrink) / shrink_scale; - g(Ishrink) = g(Ishrink) / shrink_scale ; - dt(Ishrink) = dt(Ishrink) * shrink_scale; - - % timepoints at center of little hard pulses - t = cumsum([0, dt(1:end-1)]) + dt/2; - - rf = interp1(t, rf, t_unif, 'spline', 'extrap'); - g = interp1(t, g, t_unif, 'spline', 'extrap'); -% g = g/sum(g) * area; - dt = dt_unif; - end - - niter = niter + 1; - -end - -% check if gradient limits exceeded -gscale = abs(g) / gmax; -if max(gscale) > 1 - %error('ss_verse: RF pulse unrealizeable'); - rfv = []; - gv = []; - return; -end - -rfv = rf; -gv = g; - -if dbg >= 2 - rfvg = rfv*S_rfg; - fprintf('Final Max RF fraction: %f\n', max(abs(rfvg) ./ b1max)); -end diff --git a/RF_pulses/spectral_spatial/ss_band_plot.m b/RF_pulses/spectral_spatial/ss_band_plot.m deleted file mode 100644 index cc46d4f..0000000 --- a/RF_pulses/spectral_spatial/ss_band_plot.m +++ /dev/null @@ -1,99 +0,0 @@ -function ss_band_plot(f, a, d, fo, fs, f1, f2, sym) -% SS_BAND_PLOT - Plot filter specification -% -% Inputs: -% f - frequency band edges in normalized frequency [-1..1] -% a - amplitude of bands -% d - ripple weighting -% fo - offset absolute frequency -% fs - sampling frequency -% f1, f2 - upper lower absolute frequencies to plot -% sym - flag whether response is symmetric -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_band_plot.m,v 1.6 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % Exit if frequency vector is empty - % - if isempty(f), - fprintf(1,'No frequency bands to plot\n'); - return; - end; - - if sym, - fmod = f; - f = [-fmod(end:-1:1) fmod]; - a = [a(end:-1:1) a]; - d = [d(end:-1:1) d]; - end; - - % Plot unaliased frequency bands - % - nf = length(f)/2; - figure; - subplot(211); - hold on; - for idx = 1:nf, - plot(f((idx*2-1):(idx*2))*fs/2+fo, [a(idx) a(idx)]); - plot(f((idx*2-1):(idx*2))*fs/2+fo, [a(idx) a(idx)] + d(idx), '--'); - plot(f((idx*2-1):(idx*2))*fs/2+fo, [a(idx) a(idx)] - d(idx), ... - '--'); - end; - grid; - title('Unaliased Filter Specification'); - xlabel('Frequency'); - ylabel('Amplitude Response'); - - % Plot absolute frequency response - % - subplot(212); - hold on; - - % Find what repeating responses need to be considered - % - low_mult = ceil(((fo-f1)-fs/2) / fs); - hi_mult = ceil(((f2-fo)-fs/2) / fs); - for mult = -low_mult:hi_mult, - foff = fo + fs*mult; - for idx = 1:nf, - % Get repeating band edge - % - f_l = (f(idx*2-1) * fs/2) + foff; - f_u = (f(idx*2) * fs/2) + foff; - - % Plot if in bounds - % - f_l = min(max(f_l, f1), f2); - f_u = min(max(f_u, f1), f2); - if (f_l ~= f_u), - plot([f_l f_u], [a(idx) a(idx)]); - plot([f_l f_u], [a(idx) a(idx)] + d(idx), '--'); - plot([f_l f_u], [a(idx) a(idx)] - d(idx), '--'); - end; - end; - end; - grid; - title(sprintf('Filter Specification - Fs: %6.1f Hz', fs)); - xlabel('Frequency'); - ylabel('Amplitude Response'); - - - - diff --git a/RF_pulses/spectral_spatial/ss_band_plot_phs.m b/RF_pulses/spectral_spatial/ss_band_plot_phs.m deleted file mode 100644 index c3412b7..0000000 --- a/RF_pulses/spectral_spatial/ss_band_plot_phs.m +++ /dev/null @@ -1,99 +0,0 @@ -function ss_band_plot_phs(f, a, d, fo, fs, f1, f2, sym) -% SS_BAND_PLOT - Plot filter specification -% -% Inputs: -% f - frequency band edges in normalized frequency [-1..1] -% a - amplitude of bands -% d - ripple weighting -% fo - offset absolute frequency -% fs - sampling frequency -% f1, f2 - upper lower absolute frequencies to plot -% sym - flag whether response is symmetric -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_band_plot_phs.m,v 1.2 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % Exit if frequency vector is empty - % - if isempty(f), - fprintf(1,'No frequency bands to plot\n'); - return; - end; - - if sym, - fmod = f; - f = [-fmod(end:-1:1) fmod]; - a = [a(end:-1:1) a]; - d = [d(end:-1:1) d]; - end; - - % Plot unaliased frequency bands - % - nf = length(f)/2; - figure; - subplot(211); - hold on; - for idx = 1:nf, - plot(f((idx*2-1):(idx*2))*fs/2+fo, abs([a(idx) a(idx)])); - plot(f((idx*2-1):(idx*2))*fs/2+fo, abs([a(idx) a(idx)]) + abs(d(idx)), '--'); - plot(f((idx*2-1):(idx*2))*fs/2+fo, abs([a(idx) a(idx)]) - abs(d(idx)), ... - '--'); - end; - grid; - title('Unaliased Filter Specification'); - xlabel('Frequency'); - ylabel('Amplitude Response'); - - % Plot absolute frequency response - % - subplot(212); - hold on; - - % Find what repeating responses need to be considered - % - low_mult = ceil(((fo-f1)-fs/2) / fs); - hi_mult = ceil(((f2-fo)-fs/2) / fs); - for mult = -low_mult:hi_mult, - foff = fo + fs*mult; - for idx = 1:nf, - % Get repeating band edge - % - f_l = (f(idx*2-1) * fs/2) + foff; - f_u = (f(idx*2) * fs/2) + foff; - - % Plot if in bounds - % - f_l = min(max(f_l, f1), f2); - f_u = min(max(f_u, f1), f2); - if (f_l ~= f_u), - plot([f_l f_u], abs([a(idx) a(idx)])); - plot([f_l f_u], abs([a(idx) a(idx)]) + abs(d(idx)), '--'); - plot([f_l f_u], abs([a(idx) a(idx)]) - abs(d(idx)), '--'); - end; - end; - end; - grid; - title(sprintf('Filter Specification - Fs: %6.1f Hz', fs)); - xlabel('Frequency'); - ylabel('Amplitude Response'); - - - - diff --git a/RF_pulses/spectral_spatial/ss_design.m b/RF_pulses/spectral_spatial/ss_design.m deleted file mode 100644 index b8bc6e6..0000000 --- a/RF_pulses/spectral_spatial/ss_design.m +++ /dev/null @@ -1,492 +0,0 @@ -function [g, rf, fs_best, z_plot, f_plot, m_plot] = ... - ss_design(z_thk, z_tb, z_de, f, a_angs, de,... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg, no_plot); - - -% SS_DESIGN - Design spectral-spatial pulse -% -% [g, rf, fs_best, z_plot, f_plot, m_plot] = ... -% ss_design(z_thk, z_tb, z_de, f, a_angs, de,... -% ptype, z_ftype, s_ftype, ss_type, ... -% f_off, dbg, no_plot) -% -% INPUTS -% z_thk - slice thickness (cm) -% z_tb - spatial time-bandwidth -% z_de - spatial ripples, [pass_ripple, stop_ripple] -% f - spectral band edge specification (Hz) -% a_ang - spectral band flip angle specification (radians) -% de - spectral band ripples -% ptype - spatial pulse type: 'ex' (default), 'se', 'sat', 'inv' -% z_ftype - spatial filter type: 'ms', 'ls', 'pm' (default), 'min', 'max' -% s_ftype - spectral filter type: 'min' (default), 'max', 'lin' -% ss_type - spectral-spatial type: 'Flyback Whole' (default), -% 'Flyback Half', 'EP Whole', 'EP Half', -% 'EP Whole Opp-Null', 'EP Half Opp-Null' -% f_off - center frequency (empty to let ss_design choose) -% dbg - print debug messages: 0-none (default), 1-some, 2-more -% no_plot - set to 1 to turn off plotting -% -% OUTPUTS -% g - gradient (G/cm) -% rf - RF (G) -% fs_best - spectral sampling frequency (Hz) -% z_plot, f_plot, m_plot - ss_plot() outputs, ranges and values in figure -% -% See scripts in examples/ folder demonstrations of how to use this -% function. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% -% $Header: /home/adam/cvsroot/src/ss/ss_design.m,v 1.33 2014/05/22 22:44:36 peder Exp $ -% -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Check all inputs - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - if (nargin < 6), - error(['Usage: ss_design(z_thk, z_tb, z_d, f, a_angs, d,' ... - 'ptype, z_fttype, s_ftype, ss_type, foff)']); - end; - - % Check ptype - % - if (nargin < 7) || isempty(ptype), - ptype = 'ex'; - else - switch ptype, - case {'ex', 'se', 'sat', 'inv'} - otherwise - error(sprintf(['Spatial pulse type (ptype) of: %s not' ... - ' recognized'], ptype)); - end; - end; - - % Check z_ftype - % - if (nargin < 8) || isempty(z_ftype), - z_ftype = 'pm'; - else - switch z_ftype, - case {'ms', 'ls', 'pm', 'min', 'max'} - otherwise - error(sprintf(['Spatial filter type (z_ftype) of: %s not' ... - ' recognized'], z_ftype)); - end; - end; - - % Check s_ftype - % - if (nargin < 9) || isempty(s_ftype), - s_ftype = 'min'; - else - switch s_ftype, - case {'min', 'max', 'lin'} - otherwise - error(sprintf(['Spectral filter type (s_ftype) of: %s not' ... - ' recognized'], s_ftype)); - end; - end; - - % Check ss_type - % - if (nargin < 10) || isempty(ss_type), - ss_type = 'Flyback Whole'; - else - switch ss_type, - case {'Flyback Whole', 'Flyback Half', ... - 'EP Whole', 'EP Half', 'EP Whole Opp-Null', ... - 'EP Half Opp-Null'} - otherwise - error(sprintf(['Spectral-spatial type (ss_type) of: %s not' ... - ' recognized'], ss_type)); - end; - end; - - % Check f_off - % - if (nargin < 11) || isempty(f_off), - f_off = []; - end; - - % Check dbg - % - if (nargin < 12) || isempty(dbg), - dbg = 0; - end; - - if (nargin < 13) || isempty(no_plot), - no_plot = 0; - end; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Initialize globals - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Convert "a_angs" to Beta polynomial "a" - % Convert effective ripples to polynomial ripples - % depending on pulse type - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ang = max(a_angs); - - if SS_SLR_FLAG, - a = sin(a_angs/2)/sin(ang/2); - %a = asin(sin(ang)*a)/ang; - else - a = a_angs/ang; - end - - [d,a,ang] = rf_ripple(de, a, ang, ptype); - z_d = rf_ripple(z_de, [1 0], ang, ptype); - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Calculate gradient lobe required to achieve spatial - % prescription - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % Calculate cycles/cm required - % - kz_max = z_tb / z_thk; % cycles/cm - kz_area = kz_max / SS_GAMMA; % G/cm * s - - % Note: If ss_type is EP, then SS_EQUAL_LOBES must be 1 - % - if strfind(ss_type, 'EP') - SS_EQUAL_LOBES = 1; - else; - SS_EQUAL_LOBES = 0; - end; - - % Get SS gradient lobes that gives this area with - % the desired fraction of sloped gradient included - % (this is to limit amount of versing required) - % - [gpos, gneg, g1, g2, g3] = ... - grad_ss(kz_area, [], SS_VERSE_FRAC, SS_MXG, SS_MXS, ... - SS_TS, SS_EQUAL_LOBES); - - % Calculate maximum spectral sampling frequency - % - lobe = [gpos gneg]; - t_poslobe = length(gpos) * SS_TS; - t_lobe = length(lobe) * SS_TS; - fs_scale = 1; - if strfind(ss_type, 'EP') - fs_max = 2/t_lobe; - if ~strfind(ss_type, 'Opp-Null') - fs_scale = 1/2; % If true null, make sure - end; % aliasing check is for half-frequency - else - fs_max = 1/t_lobe; - end; - - % Estimate sampling frequencies that won't cause - % incompatible aliasing of stopbands/passbands - % - switch ss_type, - case {'Flyback Half', 'EP Half', 'EP Half Opp-Null'}, - sym_flag = 1; - otherwise - sym_flag = 0; - end; - - fdiff = diff(f); - fwidths = sort(fdiff(1:2:end), 2, 'descend'); - fs_min = sum(fwidths(1:2))/2; % Loose estimate on lower bound - df = (fs_max-fs_min)/(SS_NUM_FS_TEST-1); - for idx = 1:SS_NUM_FS_TEST, - fs_test(idx) = fs_min + (idx-1)*df; - % Make sure fs_cur is integer number of samples - % - nsamp = ceil(1/(fs_test(idx)*SS_TS)); - fs_test(idx) = 1/(nsamp*SS_TS); - - % Test aliasing of frequencies into operating BW - % - [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_test(idx)*fs_scale,sym_flag); - if (isempty(f_a)), - fs_ok(idx) = 0; - else - fs_ok(idx) = 1; - end; - end; - if (dbg >= 2) - figure; - plot(fs_test, fs_ok, '*'); - title('Feasible Spectral Sampling Frequencies'); - xlabel('Frequency [Hz]'); - ylabel('Flag (1=OK, 0=No Good)'); - drawnow; - pause(1); - end; - - if (~any(fs_ok == 1)), - fs_over = fs_test(end); - while isempty(f_a) - fs_over = fs_over + df; - [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_over*fs_scale,sym_flag); - end; - - fprintf(1,'ss_design: Incompatible aliasing of frequency spec\n'); - fprintf(1,'at all tested frequencies. \n'); - fprintf(1,'Current max sampling is: %6.1f\n', fs_max); - fprintf(1,'Estimated required sampling is: %6.1f\n', fs_over); - fprintf(1, 'Try any of the following to incr:\n'); - fprintf(1,' - Decrease spatial TBW\n'); - fprintf(1,' - Increase slice thickness\n'); - fprintf(1,' - Increase VERSE fraction\n'); - fprintf(1,' - Decrease frequency band widths\n'); - switch (ss_type), - case {'Flyback Whole', 'Flyback Half'} - fprintf(1,' - Try EPI type SS\n'); - end; - error('No good fs'); - end; - fs_bands_left = find(diff([0 fs_ok]) == 1); - fs_bands_right = find(diff([fs_ok 0]) == -1); - fs_bands = [fs_bands_left; fs_bands_right]; - fs_bands = fs_bands(:)'; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Iterate on lobe width trying to meet B1 requirements - % with minimum-time pulse - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - nsolutions = 0; - - if (SS_NUM_LOBE_ITERS == 1), - fs_top = fs_bands(end); - fs_best = fs_test(fs_top); - - % Call design script for SS that calculates rf, g that meets - % sampling requirements - % - - if strfind(ss_type, 'Flyback') - [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - - if ~isempty(rf), - b1_best = max(abs(rf)); - dur_best = length(rf) * SS_TS; - pow_best = sum(abs(rf).^2) * SS_TS; - nsolutions = 1; - fprintf(1,'Solution(s) exists!\n'); - fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); - else - fprintf(1, 'Fs: %6.1f *** No Soln ***\n', fs_best); - - end; - else - fprintf(1, 'Iterating on spectral sampling frequency to reduce B1\n'); - - % Keep iterating on pulse design until B1 requirement is - % met with highest sampling rate possible - % - dur_best = inf; - b1_best = inf; - nbands = length(fs_bands)/2; - for band = nbands:-1:1, - % Try each band - % - fs_bot = fs_bands(band*2-1); - fs_top = fs_bands(band*2); - d_idx = floor((fs_top - fs_bot + 1)/(SS_NUM_LOBE_ITERS-1)); - d_idx = max(1,d_idx); - niter = ceil((fs_top-fs_bot+1)/d_idx); - for iter = niter:-1:1, - idx = fs_bot + (iter-1)*d_idx; - if iter == niter, - idx = fs_top; - end; - fs = fs_test(idx); - - % Call design script for SS that calculates rf, g that meets - % sampling requirements - % - if strfind(ss_type, 'Flyback') - [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d, fs, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d, fs, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - if isempty(rf), - fprintf(1, 'Band: %d/%d Iter: %d/%d Fs: %6.1f *** No Soln ***\n', ... - nbands-band+1, nbands, niter-iter+1, niter, fs); - continue; - end; - - nsolutions = nsolutions+1; - - rfall{nsolutions} = rf; - gall{nsolutions} = g; - fsall(nsolutions) = fs; - - b1 = max(abs(rf)); - dur = length(rf) * SS_TS; - pow = sum(abs(rf).^2) * SS_TS; - - infoall{nsolutions} = sprintf('Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms', ... - fs, b1, pow, dur*1e3); - fprintf(1, 'Band: %d/%d Iter: %d/%d %s\n', nbands-band+1, nbands, niter-iter+1, niter, infoall{nsolutions}); - - - if ((b1 <= SS_MAX_B1) && (dur < dur_best)) - b1_best = b1; - dur_best = dur; - - Ibest = nsolutions; - elseif ((b1_best > SS_MAX_B1) && (b1 < b1_best)) - b1_best = b1; - dur_best = dur; - - Ibest = nsolutions; - end - end; - end; - - % Choose desired solution - % - if nsolutions > 0 - fprintf(1, '\n'); - fprintf(1,'Solution(s) exists!\n'); - for n=1:nsolutions - fprintf(1, '%d) %s\n', n, infoall{n}); - end - if nsolutions > 1 - Isolution = input('Which pulse would you like to use? (leave empty for shortest pulse) '); - if isempty(Isolution) || Isolution < 1 || Isolution > nsolutions - Isolution = Ibest; - end - fprintf(1, 'Returning %s\n', infoall{Isolution}); - else - Isolution = 1; - end - rf = rfall{Isolution}; - g = gall{Isolution}; - fs_best = fsall(Isolution); - end - - end; - - - - if isempty(rf) - fprintf(1,'No solution found! Trying to increase band ripples to determine limiting\n frequency specifications...\n') - - orig_min_order = SS_MIN_ORDER; - SS_MIN_ORDER = 0; - fs_top = fs_bands(end); - fs_best = fs_test(fs_top); - - d_max = 1*ones(size(d)); - d_min = d; - tol_factor = 4; - - for Id = 1:length(d) - % trying bisection search with increased ripple in each band to - % determine which portion of frequency spec is limiting - d_test = d; - - while (d_max(Id) - d_min(Id)) > d(Id)/tol_factor - d_test(Id) = (d_max(Id) + d_min(Id))/2; - - if strfind(ss_type, 'Flyback') - [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - % update min/max ripple values - if ~isempty(rf), - d_max(Id) = d_test(Id); - else - d_min(Id) = d_test(Id); - end; - end - end - - % find ripple values that create solutions - Ifix = find(d_max < 1); - if ~isempty(Ifix) - [tempmin Imin] = min(d_max - d); - d_fix = d; d_fix(Imin) = d_max(Imin); - fprintf(1,'Solution found by increasing ripples in bands %s\n', int2str(Ifix)); - fprintf(1,'Returning pulse with increased ripple in band %d (%.1f to %.1f Hz):\n', Imin, f(2*Imin-1), f(2*Imin)); - - if strfind(ss_type, 'Flyback') - [rf, g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - b1_best = max(abs(rf)); - dur_best = length(rf) * SS_TS; - pow_best = sum(abs(rf).^2) * SS_TS; - fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); - - fprintf(1,'\nPulse specs should be modified by reducing bandwidths or increasing ripple in bands %s\n', int2str(Ifix)); - fprintf(1,'Increasing the max pulse duration or slice thickness may also help\n'); - - - else - error('No solution found! Try reducing bandwidths, increasing ripple, increasing max duration, increasing slice thickness...') - end - - - SS_MIN_ORDER = orig_min_order; - end; - - if (no_plot==0) - % Test RF - % - fmid = (f(1:2:end) + f(2:2:end))/2; - bw = [min([f,-fs_best/2]) max([f,fs_best/2])]; - [f_plot,z_plot,m_plot] = ss_plot(g,rf,SS_TS, ptype,z_thk*2,bw,... - SS_GAMMA, fmid); - end - - - \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_design_phs.m b/RF_pulses/spectral_spatial/ss_design_phs.m deleted file mode 100644 index 9c20363..0000000 --- a/RF_pulses/spectral_spatial/ss_design_phs.m +++ /dev/null @@ -1,495 +0,0 @@ -function [g, rf, fs_best, z_plot, f_plot, m_plot, isodelay] = ... - ss_design_phs(z_thk, z_tb, z_de, f, a_angs, de, a_phs, d_phs, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - - -% SS_DESIGN - Design spectral-spatial pulse -% -% [g, rf, fs_best, z_plot, f_plot, m_plot] = ... -% ss_design(z_thk, z_tb, z_de, f, a_angs, de,... -% ptype, z_ftype, s_ftype, ss_type, ... -% f_off, dbg) -% -% INPUTS -% z_thk - slice thickness (cm) -% z_tb - spatial time-bandswidth -% z_de - spatial ripples, [pass_ripple, stop_ripple] -% f - spectral band edge specification (Hz) -% a_ang - spectral band flip angle specification (radians) -% de - spectral band ripples - inphase -% a_phs - spectral band phase specification (radians) -% d_phs - spectral band ripples - phase - (radians) -% ptype - spatial pulse type: 'ex' (default), 'se', 'sat', 'inv' -% z_ftype - spatial filter type: 'ms', 'ls', 'pm' (default), 'min', 'max' -% s_ftype - spectral filter type: 'min' (default), 'max', 'lin' -% ss_type - spectral-spatial type: 'Flyback Whole' (default), -% 'Flyback Half', 'EP Whole', 'EP Half', -% 'EP Whole Opp-Null', 'EP Half Opp-Null' -% f_off - center frequency (empty to let ss_design choose) -% dbg - print debug messages: 0-none (default), 1-some, 2-more -% -% OUTPUTS -% g - gradient (G/cm) -% rf - RF (G) -% fs_best - spectral sampling frequency (Hz) -% z_plot, f_plot, m_plot - ss_plot() outputs, ranges and values in figure -% isodelay - time from effective tipdown to end of pulse -% -% See scripts in examples/ folder demonstrations of how to use this -% function. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% -% $Header: /home/adam/cvsroot/src/ss/ss_design_phs.m,v 1.5 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Check all inputs - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - if (nargin < 8), - error(['Usage: ss_design(z_thk, z_tb, z_d, f, a_angs, d, a_phs, d_quad' ... - 'ptype, z_fttype, s_ftype, ss_type, foff)']); - end; - - % Check ptype - % - if (nargin < 9) || isempty(ptype), - ptype = 'ex'; - else - switch ptype, - case {'ex', 'se', 'sat', 'inv'} - otherwise - error(sprintf(['Spatial pulse type (ptype) of: %s not' ... - ' recognized'], ptype)); - end; - end; - - % Check z_ftype - % - if (nargin < 10) || isempty(z_ftype), - z_ftype = 'pm'; - else - switch z_ftype, - case {'ms', 'ls', 'pm', 'min', 'max'} - otherwise - error(sprintf(['Spatial filter type (z_ftype) of: %s not' ... - ' recognized'], z_ftype)); - end; - end; - - % Check s_ftype - % - if (nargin < 11) || isempty(s_ftype), - s_ftype = 'min'; - else - switch s_ftype, - case {'min', 'max', 'lin', 'min_power'} - otherwise - error(sprintf(['Spectral filter type (s_ftype) of: %s not' ... - ' recognized'], s_ftype)); - end; - end; - - % Check ss_type - % - if (nargin < 12) || isempty(ss_type), - ss_type = 'Flyback Whole'; - else - switch ss_type, - case {'Flyback Whole', 'Flyback Half', ... - 'EP Whole', 'EP Half', 'EP Whole Opp-Null', ... - 'EP Half Opp-Null'} - otherwise - error(sprintf(['Spectral-spatial type (ss_type) of: %s not' ... - ' recognized'], ss_type)); - end; - end; - - % Check f_off - % - if (nargin < 13) || isempty(f_off), - f_off = []; - end; - - % Check dbg - % - if (nargin < 14) || isempty(dbg), - dbg = 0; - end; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Initialize globals - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Convert "a_angs" to Beta polynomial "a" - % Convert effective ripples to polynomial ripples - % depending on pulse type - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ang = max(a_angs); - - if SS_SLR_FLAG, - a = sin(a_angs/2)/sin(ang/2); - %a = asin(sin(ang)*a)/ang; - else - a = a_angs/ang; - end - - z_d = rf_ripple(z_de, [1 0], ang, ptype); - [d,a,ang] = rf_ripple(de, a, ang, ptype); - - % Update d, a to be complex to include phase specification - % - d = d .* exp(i*d_phs); - a = a .* exp(i*a_phs); - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Calculate gradient lobe required to achieve spatial - % prescription - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % Calculate cycles/cm required - % - kz_max = z_tb / z_thk; % cycles/cm - kz_area = kz_max / SS_GAMMA; % G/cm * s - - % Note: If ss_type is EP, then SS_EQUAL_LOBES must be 1 - % - if strfind(ss_type, 'EP') - SS_EQUAL_LOBES = 1; - else; - SS_EQUAL_LOBES = 0; - end; - - % Get SS gradient lobes that gives this area with - % the desired fraction of sloped gradient included - % (this is to limit amount of versing required) - % - [gpos, gneg, g1, g2, g3] = ... - grad_ss(kz_area, [], SS_VERSE_FRAC, SS_MXG, SS_MXS, ... - SS_TS, SS_EQUAL_LOBES); - - % Calculate maximum spectral sampling frequency - % - lobe = [gpos gneg]; - t_poslobe = length(gpos) * SS_TS; - t_lobe = length(lobe) * SS_TS; - fs_scale = 1; - if strfind(ss_type, 'EP') - fs_max = 2/t_lobe; - if ~strfind(ss_type, 'Opp-Null') - fs_scale = 1/2; % If true null, make sure - end; % aliasing check is for half-frequency - else - fs_max = 1/t_lobe; - end; - - % Estimate sampling frequencies that won't cause - % incompatible aliasing of stopbands/passbands - % - switch ss_type, - case {'Flyback Half', 'EP Half', 'EP Half Opp-Null'}, - sym_flag = 1; - otherwise - sym_flag = 0; - end; - - fdiff = diff(f); - fwidths = sort(fdiff(1:2:end), 2, 'descend'); - fs_min = sum(fwidths(1:2))/2; % Loose estimate on lower bound - df = (fs_max-fs_min)/(SS_NUM_FS_TEST-1); - for idx = 1:SS_NUM_FS_TEST, - fs_test(idx) = fs_min + (idx-1)*df; - % Make sure fs_cur is integer number of samples - % - nsamp = ceil(1/(fs_test(idx)*SS_TS)); - fs_test(idx) = 1/(nsamp*SS_TS); - - % Test aliasing of frequencies into operating BW - % - [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_test(idx)*fs_scale,sym_flag); - if (isempty(f_a)), - fs_ok(idx) = 0; - else - fs_ok(idx) = 1; - end; - end; - if (dbg >= 2) - figure; - plot(fs_test, fs_ok, '*'); - title('Feasible Spectral Sampling Frequencies'); - xlabel('Frequency [Hz]'); - ylabel('Flag (1=OK, 0=No Good)'); - drawnow; - pause(1); - end; - - if (~any(fs_ok == 1)), - fs_over = fs_test(end); - while isempty(f_a) - fs_over = fs_over + df; - [f_a, a_a, d_a, fo] = ss_alias(f,a,d,f_off,fs_over*fs_scale,sym_flag); - end; - - fprintf(1,'ss_design: Incompatible aliasing of frequency spec\n'); - fprintf(1,'at all tested frequencies. \n'); - fprintf(1,'Current max sampling is: %6.1f\n', fs_max); - fprintf(1,'Estimated required sampling is: %6.1f\n', fs_over); - fprintf(1, 'Try any of the following to incr:\n'); - fprintf(1,' - Decrease spatial TBW\n'); - fprintf(1,' - Increase slice thickness\n'); - fprintf(1,' - Increase VERSE fraction\n'); - fprintf(1,' - Decrease frequency band widths\n'); - switch (ss_type), - case {'Flyback Whole', 'Flyback Half'} - fprintf(1,' - Try EPI type SS\n'); - end; - error('No good fs'); - end; - fs_bands_left = find(diff([0 fs_ok]) == 1); - fs_bands_right = find(diff([fs_ok 0]) == -1); - fs_bands = [fs_bands_left; fs_bands_right]; - fs_bands = fs_bands(:)'; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Iterate on lobe width trying to meet B1 requirements - % with minimum-time pulse - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - nsolutions = 0; - - if (SS_NUM_LOBE_ITERS == 1), - fs_top = fs_bands(end); - fs_best = fs_test(fs_top); - - % Call design script for SS that calculates rf, g that meets - % sampling requirements - % - - if strfind(ss_type, 'Flyback') - [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - - if ~isempty(rf), - b1_best = max(abs(rf)); - dur_best = length(rf) * SS_TS; - pow_best = sum(abs(rf).^2) * SS_TS; - nsolutions = 1; - fprintf(1,'Solution(s) exists!\n'); - fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); - else - fprintf(1, 'Fs: %6.1f *** No Soln ***\n', fs_best); - - end; - else - fprintf(1, 'Iterating on spectral sampling frequency to reduce B1\n'); - - % Keep iterating on pulse design until B1 requirement is - % met with highest sampling rate possible - % - dur_best = inf; - b1_best = inf; - nbands = length(fs_bands)/2; - for band = nbands:-1:1, - % Try each band - % - fs_bot = fs_bands(band*2-1); - fs_top = fs_bands(band*2); - d_idx = floor((fs_top - fs_bot + 1)/(SS_NUM_LOBE_ITERS-1)); - d_idx = max(1,d_idx); - niter = ceil((fs_top-fs_bot+1)/d_idx); - for iter = niter:-1:1, - idx = fs_bot + (iter-1)*d_idx; - if iter == niter, - idx = fs_top; - end; - fs = fs_test(idx); - - % Call design script for SS that calculates rf, g that meets - % sampling requirements - % - if strfind(ss_type, 'Flyback') - [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - if isempty(rf), - fprintf(1, 'Band: %d/%d Iter: %d/%d Fs: %6.1f *** No Soln ***\n', ... - nbands-band+1, nbands, niter-iter+1, niter, fs); - continue; - end; - - nsolutions = nsolutions+1; - - rfall{nsolutions} = rf; - gall{nsolutions} = g; - fsall(nsolutions) = fs; - isodelayall(nsolutions) = isodelay; - - b1 = max(abs(rf)); - dur = length(rf) * SS_TS; - pow = sum(abs(rf).^2) * SS_TS; - - infoall{nsolutions} = sprintf('Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms', ... - fs, b1, pow, dur*1e3); - fprintf(1, 'Band: %d/%d Iter: %d/%d %s\n', nbands-band+1, nbands, niter-iter+1, niter, infoall{nsolutions}); - - - if ((b1 <= SS_MAX_B1) && (dur < dur_best)) - b1_best = b1; - dur_best = dur; - - Ibest = nsolutions; - elseif ((b1_best > SS_MAX_B1) && (b1 < b1_best)) - b1_best = b1; - dur_best = dur; - - Ibest = nsolutions; - end - end; - end; - - % Choose desired solution - % - if nsolutions > 0 - fprintf(1, '\n'); - fprintf(1,'Solution(s) exists!\n'); - for n=1:nsolutions - fprintf(1, '%d) %s\n', n, infoall{n}); - end - if nsolutions > 1 - Isolution = input('Which pulse would you like to use? (leave empty for shortest pulse) '); - if isempty(Isolution) || Isolution < 1 || Isolution > nsolutions - Isolution = Ibest; - end - fprintf(1, 'Returning %s\n', infoall{Isolution}); - else - Isolution = 1; - end - rf = rfall{Isolution}; - g = gall{Isolution}; - isodelay = isodelayall(Isolution); - fs_best = fsall(Isolution); - end - - end; - - - - if isempty(rf) - fprintf(1,'No solution found! Trying to increase band ripples to determine limiting\n frequency specifications...\n') - - orig_min_order = SS_MIN_ORDER; - SS_MIN_ORDER = 0; - fs_top = fs_bands(end); - fs_best = fs_test(fs_top); - - d_max = 1*ones(size(d)); - d_min = abs(d); - tol_factor = 4; - - for Id = 1:length(d) - % trying bisection search with increased ripple in each band to - % determine which portion of frequency spec is limiting - d_test = d; - - while (d_max(Id) - d_min(Id)) > abs(d(Id))/tol_factor - d_test(Id) = (d_max(Id) + d_min(Id))/2 * exp(i*angle(d(Id))); - - if strfind(ss_type, 'Flyback') - [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d_test, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - % update min/max ripple values - if ~isempty(rf), - d_max(Id) = abs(d_test(Id)); - else - d_min(Id) = abs(d_test(Id)); - end; - end - end - - % find ripple values that create solutions - Ifix = find(d_max < 1); - if ~isempty(Ifix) - [tempmin Imin] = min(d_max - abs(d)); - d_fix = d; d_fix(Imin) = d_max(Imin)*exp(i*angle(d(Imin))); - fprintf(1,'Solution found by increasing ripples in bands %s\n', int2str(Ifix)); - fprintf(1,'Returning pulse with increased ripple in band %d (%.1f to %.1f Hz):\n', Imin, f(2*Imin-1), f(2*Imin)); - - if strfind(ss_type, 'Flyback') - [rf, g, isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - else - [rf, g, isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d_fix, fs_best, ... - ptype, z_ftype, s_ftype, ss_type, ... - f_off, dbg); - end; - - b1_best = max(abs(rf)); - dur_best = length(rf) * SS_TS; - pow_best = sum(abs(rf).^2) * SS_TS; - fprintf(1, 'Fs: %6.1f B1: %5.3fG Power: %5.3e G^2 ms Dur: %4.1fms\n', fs_best, b1_best, pow_best, dur_best*1e3); - - fprintf(1,'\nPulse specs should be modified by reducing bandwidths or increasing ripple in bands %s\n', int2str(Ifix)); - fprintf(1,'Increasing the max pulse duration or slice thickness may also help\n'); - - - else - error('No solution found! Try reducing bandwidths, increasing ripple, increasing max duration, increasing slice thickness...') - end - - - SS_MIN_ORDER = orig_min_order; - end; - - % Test RF - % - fmid = (f(1:2:end) + f(2:2:end))/2; - bw = [-fs_best/2 fs_best/2]; - [f_plot,z_plot,m_plot] = ss_plot(g,rf,SS_TS, ptype,z_thk*2,bw,... - SS_GAMMA, fmid, isodelay); - - - - \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_ep.m b/RF_pulses/spectral_spatial/ss_ep.m deleted file mode 100644 index b52bc49..0000000 --- a/RF_pulses/spectral_spatial/ss_ep.m +++ /dev/null @@ -1,524 +0,0 @@ -function [rf,g] = ss_ep(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... - s_ftype, ss_type, f_off, dbg) -% SS_EP - Calculate echo-planar-type SS pulse -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_ep.m,v 1.16 2013/08/15 16:02:33 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - if strfind(ss_type,'Half') - sym_flag = 1; - else - sym_flag = 0; - end; - - [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); - if (isempty(f_a)) - error('Strange: this frequency should be ok'); - end; - if (dbg >= 3) - ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - end; - - % Calculate cycles/cm required - % - kz_max = z_tb / z_thk; % cycles/cm - kz_area = kz_max / SS_GAMMA; % G/cm * s - - % Calculate SS bipolars - % - nsamp = round(2/(fs*SS_TS)); - [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... - SS_MXS, SS_TS, 1); - ng1 = length(g1); - ng2 = length(g2); - ng3 = length(g3); - - % Determine max order that can be supported - % - t_lobe = length(gpos) * SS_TS; - max_lobe = floor(SS_MAX_DURATION / t_lobe); - - % Prepare amplitude description that is consistent - % with other fir design calls - a_dup = zeros(size(f_a)); - a_dup(1:2:end) = a_a; - a_dup(2:2:end) = a_a; - - % Call fir filter design based on spectral factorization - % and convex optimization - % - if SS_MIN_ORDER, - use_max = 0; - else - use_max = 1; - end; - switch (s_ftype) - case 'min' - [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, dbg); - case 'max' - [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, ... - dbg); - s_b = conj(s_b(end:-1:1)); - case 'lin' - if use_max, - % Make sure to use n_odd - % - if bitget(max_lobe,1) == 0, - max_lobe = max_lobe+1; - end; - [s_b,status] = fir_qprog(max_lobe, f_a, a_dup, d_a, dbg); - else - odd_or_even = 0; - [s_b,status] = fir_min_order_qprog(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); - end; - end; - if strcmp(status, 'Solved'); - nlobe = length(s_b); - if dbg >= 2, - ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - - figure; - cplot(s_b); - title(sprintf('Filter Taps - Fs: %6.1f', fs)); - xlabel('Tap'); - ylabel('Amplitude'); - drawnow; - pause(1); - - figure; - nf = 512; - h = fftshift(fft(s_b, nf)); - freqs = fs * [-nf/2:nf/2-1]/nf; - plot(freqs,abs(h)); - title(sprintf('Spectral response - Fs: %6.1f', fs)); - xlabel('Frequency'); - ylabel('Magnitude'); - grid; - drawnow; - pause(1); - end; - - % Get Z RF pulse - % - if (dbg) - fprintf(1,'Getting Z RF pulse\n'); - end; - z_np = length(g2); - z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... - z_d(1), z_d(2)); - - % Correct for non-linear effects with SLR if desired - % - if (SS_SLR_FLAG == 1), - % Calculate excitation profile assuming in small-tip regime - % - oversamp = 4; - nZ = oversamp * z_np; - nZ2 = 2^ceil(log2(nZ)); - Z_b = fftf(z_b, nZ2); % column transform, unit magnitude - - if SS_SPECT_CORRECT_FLAG, - fprintf(1,'Spectral Correction not supported for EP pulses with SLR\n'); - end - if 0 %SS_SPECT_CORRECT_FLAG - % Currently not working - % Interpolate spectral filter on a grid that's equal to - % the number of time samples of the gradient --- do this - % partly before calling b2rf and partly afterwards - % - Nper = length(gpos); - oversamp_slr = 16; % Increasing this helps... - Ntotal = Nper * (length(s_b)); - off = (z_np/2)/Nper; - - % For each Z position: - % - calculate nominal scaling of s_b - % - determine spectral taps through SLR - % - bsf = sin(ang/2) * Z_b; - - - % non-uniform spectral interpolation - % The sampling of the output is different than spec_interp - [s_bi_nu, t_nu] = spec_interp_nonuniform(s_b, oversamp_slr, off,f_a, dbg); - - s_rfm_nu = zeros(length(bsf),length(s_bi_nu)); - % Non-uniform SLR would be good here... - for zidx = 1:nZ2 - if 0 - % small-tip in spectral direction - s_rfm_nu(zidx,:) = ang*Z_b(zidx) * conj(s_bi_nu); % conj? - %s_rfm_nu(zidx,:) = 2*asin(abs(bsf(zidx))) * conj(s_bi_nu); % conj? - % s_rfm_nu(zidx,:) = ang*abs(Z_b(zidx)) * conj(s_bi_nu); - else - % SLR on uniformly spaced samples - [t_nu_sort, I_nu_sort] = sort(t_nu); - t_nu = t_nu_sort; - s_bi_nu = s_bi_nu(I_nu_sort); - for idx = 1:oversamp_slr - s_rfm_nu(zidx,idx:oversamp_slr:end) = ... - b2rf(bsf(zidx) * s_bi_nu(idx:oversamp_slr:end)); - end - - end - end - - % Now calculate new z beta polynomial by inverse FFT - z_bm_nu = fftr(sin(s_rfm_nu/2), z_np, 1); % Each row now scaled by - % tip-angle - - % SLR in Z to get RF - z_rf_nu = zeros(size(z_bm_nu)); - for idx = 1:size(z_bm_nu,2), - z_rf_nu(:,idx) = conj(b2rf(z_bm_nu(:,idx))); - end; - - % Now raster scan for actual sampling positions - z_rfm = []; - - for idx = 1:length(s_b) - for zidx = 1:z_np, - zi_off = (2*zidx - z_np-1) / (z_np-1) * off; - if (rem(idx,2) == 1) - idx_intrp = (idx-1) + zi_off; - else - idx_intrp = (idx-1) - zi_off; - end - tmp_z_rf(zidx) = interp1(t_nu, ... - z_rf_nu(zidx,:), idx_intrp, 'spline'); - end; - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - - - - else % no spectral correction - if (dbg) - fprintf(1,'Doing SLR in F...\n'); - end; - s_rfm = []; - bsf = sin(ang/2) * Z_b; - for idx = 1:nZ2, - tmp_s_rf = b2rf(bsf(idx) * s_b); - s_rfm = [s_rfm tmp_s_rf(:)]; - end; - - % Now calculate new z beta polynomial by inverse FFT, then use - % SLR to get RF - % - z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by - % tip-angle - z_rfm = []; - if (dbg) - fprintf(1,'Doing SLR in Z... \n'); - end; - for idx = 1:size(z_bm,1), - tmp_z_rf = conj(b2rf(z_bm(idx,:))); - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - end; %SS_SPECT_CORRECT_FLAG - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used - % - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - - nlobe = length(s_b); - rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - - % Additional VERSE with B1 restriction, maintaining duration - % - if 1 - % Verse based on largest RF amplitudes at each kz, then use same - % gradient lobe for each - % - z_rfmax = max(abs(z_rfm)); - else - % verse based on largest RF subpulse - [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); - z_rfmax = z_rfm(b1max_idx,:); - end - - z_rfvmax1 = ss_verse(g2, z_rfmax); - [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - - if (isempty(z_rfvmax)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - for idx = 1:nlobe, - if (rem(idx,2) == 1) - z_rfmod = z_rfm(idx,:) .* rfmod; - z_rfvmod = ss_verse(g2v, z_rfmod); - else - z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; - z_rfvmod = ss_verse(g2v(end:-1:1), z_rfmod); - end - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - - % update gradient - gpos = [g1, g2v, g3]; - gneg = [-g1, -g2v(end:-1:1), -g3]; - else - if (dbg) - fprintf(1,'Versing RF... \n'); - end; - for idx = 1:nlobe, - if (rem(idx,2) == 1) - z_rfmod = z_rfm(idx,:) .* rfmod; - else - z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; - end - if SS_VERSE_FRAC == 0, - z_rfvmod = z_rfmod; - else - z_rfvmod = ss_verse(g2, z_rfmod); - end; - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - end; - else % no SLR - % Correct spectral filter for non-uniform sampling - % in spectral dimension - % - Nper = length([gpos]); - Noff = -(ng2-1)/2:((ng2-1)/2); - bsf = sin(ang/2) * ones(size(Noff)); - if SS_SPECT_CORRECT_FLAG, - % s_b = [0; s_b]; % Can pad to keep from blowing up - - s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... - ptype, 'EP', SS_SLR_FLAG, dbg); - s_rfm = conj(s_rfm); - else - s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation - % here -- needed because of - % possible asymmetric frequency - % response - end; - - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used. - % - % NOTE: With an EP trajectory, we have to play the RF - % out in reverse. As as result, we should make sure to - % verse the RF pulse in both directions separately in case - % it is not symmetric. - % - % VERSE'ing in both forward and reverse directions has the effect of - % introducing significant distortions into the other bands, which is - % particularly bad in the stop bands. Not sure if there is a way around - % this, but only VERSEing in one direction and then using a reversed - % pulse seems to reduce this problem. - - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - fpass_mid = 0; - z_bmod_for = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - z_b_rev = z_b(end:-1:1); - z_bmod_rev = z_b_rev(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - % Additional VERSE with B1 restriction, maintaining duration - % account for scaling by the largest possible spectral weightings at - % each spatial sample - b1max_sc = max(abs(s_rfm), [], 1); - - z_bvmod1 = ss_verse(g2, z_bmod_for); - [z_bvmod_for, g2v_for] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - % not sure this is necessary, adds nice symmetry though - z_bvmod1 = ss_verse(g2, z_bmod_rev); - [z_bvmod_rev, g2v_rev] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc(end:-1:1), SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - if (isempty(z_bvmod_for) || isempty(z_bvmod_rev)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - g2v = min(g2v_for, g2v_rev(end:-1:1)); - - z_bvmod_for = ss_verse(g2v, z_bmod_for); - z_bvmod_rev = ss_verse(g2v(end:-1:1), z_bmod_rev); - - z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... - fpass_mid); - z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... - fpass_mid); - z_bv_rev = z_bv_for(end:-1:1); - - - % update gradient - gpos = [g1, g2v, g3]; - gneg = [-g1, -g2v(end:-1:1), -g3]; - else - - - % Do forward RF pulse - % - z_bvmod_for = ss_verse(g2, z_bmod_for); - - % Modulate back to 0 - % - z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - % Do reverse RF pulse - % - z_bvmod_rev = ss_verse(g2, z_bmod_rev); - z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - % More accurate to just reverse RF pulse - % reverse VERSE'ing doesn't work well with asymmetric RF pulses for - % some reason - z_bv_rev = z_bv_for(end:-1:1); - end - - % Build RF matrix - % - nlobe = length(s_b); - z_rfmv = zeros(nlobe, z_np); - for idx = 1:nlobe - if rem(idx,2) == 1 - z_rfmv(idx,:) = s_rfm(idx,:) .* z_bv_for; - else - z_rfmv(idx,:) = s_rfm(idx,end:-1:1) .* z_bv_rev; - end; - end - - end; % SLR - - - % Compile g, RF - % - rf = []; g = []; - for idx = 1:nlobe, - rf_lobe = z_rfmv(idx,:); - rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; - if rem(idx,2) == 1 - g = [g gpos]; - else - g = [g gneg]; - end; - end; - - % Offset RF - % - nrf = length(rf); - rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); - - % Convert amplitude to Gauss - % - rf = rf / (2 * pi * SS_GAMMA * SS_TS); - - % Calculate refocussing lobe - % - switch (ptype) - case{'ex', 'se'} - ; - otherwise - return; - end; - - % Step 1 - get passbands - % - fmid = (f(1:2:end) + f(2:2:end))/2; - idx_pass = find(a > 0); - fpass = fmid(idx_pass); - npass = length(fpass); - - % Step 2 - get spatial sample points - % - nz = 101; - dz = z_thk / (nz-1); - z = [-z_thk/2:dz:z_thk/2]; - - % Step 3 - get spatial profile - % - gzrot = 2 * pi * SS_GAMMA * SS_TS * g; - gfrot = 2 * pi * SS_TS * ones(size(g)); - rrot = 2 * pi * SS_GAMMA * SS_TS * rf; - switch (ptype) - case {'ex'} - mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); - case {'se'} - mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); - otherwise - end; - - % Step 4 - find best fit to phase ramp - % - zpass = z(:) * ones(1,npass); - zpass = zpass(:); - mxy_phs = unwrap(angle(mxy)); - mxy_phs_mid = mxy_phs((nz+1)/2,:); - mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); - mxy_phs = mxy_phs(:); - - p = polyfit(zpass,mxy_phs,1); - slope = p(1); - - % Step 5 - get area of gradient required - % - cyc_per_cm = slope/(2*pi); - m0 = cyc_per_cm / SS_GAMMA; - gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); - - rf = [rf zeros(size(gref))]; - g = [g gref]; - else - % No solution for this frequency - % - rf = []; - g = []; - end; - diff --git a/RF_pulses/spectral_spatial/ss_ep_phs.m b/RF_pulses/spectral_spatial/ss_ep_phs.m deleted file mode 100644 index 41bdbf0..0000000 --- a/RF_pulses/spectral_spatial/ss_ep_phs.m +++ /dev/null @@ -1,535 +0,0 @@ -function [rf,g,isodelay] = ss_ep_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... - s_ftype, ss_type, f_off, dbg) -% SS_EP - Calculate echo-planar-type SS pulse -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_ep_phs.m,v 1.2 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - if strfind(ss_type,'Half') - sym_flag = 1; - else - sym_flag = 0; - end; - - [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); - if (isempty(f_a)) - error('Strange: this frequency should be ok'); - end; - if (dbg >= 3) - ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - end; - - % Calculate cycles/cm required - % - kz_max = z_tb / z_thk; % cycles/cm - kz_area = kz_max / SS_GAMMA; % G/cm * s - - % Calculate SS bipolars - % - nsamp = round(2/(fs*SS_TS)); - [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... - SS_MXS, SS_TS, 1); - ng1 = length(g1); - ng2 = length(g2); - ng3 = length(g3); - - % Determine max order that can be supported - % - t_lobe = length(gpos) * SS_TS; - max_lobe = floor(SS_MAX_DURATION / t_lobe); - - % Prepare amplitude description that is consistent - % with other fir design calls - a_dup = zeros(size(f_a)); - a_dup(1:2:end) = a_a; - a_dup(2:2:end) = a_a; - - % Call fir filter design based on spectral factorization - % and convex optimization - % - if SS_MIN_ORDER, - use_max = 0; - else - use_max = 1; - end; - switch (s_ftype) - case 'min' - error('Min phase spectral filter not supported for complex band specification'); - case 'max' - error('Max phase spectral filter not supported for complex band specification'); - case 'lin' - if use_max, - % Make sure to use n_odd - % - if bitget(max_lobe,1) == 0, - max_lobe = max_lobe+1; - end; - [s_b,status] = fir_qprog_phs(max_lobe, f_a, a_dup, d_a, [], dbg); - else - odd_or_even = 0; - [s_b,status] = fir_min_order_qprog_phs(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); - end; - end; - if strcmp(status, 'Solved'); - nlobe = length(s_b); - if dbg >= 2, - ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - - figure; - cplot(s_b); - title(sprintf('Filter Taps - Fs: %6.1f', fs)); - xlabel('Tap'); - ylabel('Amplitude'); - drawnow; - pause(1); - - figure; - nf = 512; - h = fftshift(fft(s_b, nf)); - freqs = fs * [-nf/2:nf/2-1]/nf; - plot(freqs,abs(h)); - title(sprintf('Spectral response - Fs: %6.1f', fs)); - xlabel('Frequency'); - ylabel('Magnitude'); - grid; - drawnow; - pause(1); - end; - - % Get Z RF pulse - % - if (dbg) - fprintf(1,'Getting Z RF pulse\n'); - end; - z_np = length(g2); - z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... - z_d(1), z_d(2)); - - % Correct for non-linear effects with SLR if desired - % - if (SS_SLR_FLAG == 1), - % Calculate excitation profile assuming in small-tip regime - % - oversamp = 4; - nZ = oversamp * z_np; - nZ2 = 2^ceil(log2(nZ)); - Z_b = fftf(z_b, nZ2); % column transform, unit magnitude - - if SS_SPECT_CORRECT_FLAG, - fprintf(1,'Spectral Correction not supported for EP pulses with SLR\n'); - end - if 0 %SS_SPECT_CORRECT_FLAG - % Currently not working - % Interpolate spectral filter on a grid that's equal to - % the number of time samples of the gradient --- do this - % partly before calling b2rf and partly afterwards - % - Nper = length(gpos); - oversamp_slr = 16; % Increasing this helps... - Ntotal = Nper * (length(s_b)); - off = (z_np/2)/Nper; - - % For each Z position: - % - calculate nominal scaling of s_b - % - determine spectral taps through SLR - % - bsf = sin(ang/2) * Z_b; - - - % non-uniform spectral interpolation - % The sampling of the output is different than spec_interp - [s_bi_nu, t_nu] = spec_interp_nonuniform(s_b, oversamp_slr, off,f_a, dbg); - - s_rfm_nu = zeros(length(bsf),length(s_bi_nu)); - % Non-uniform SLR would be good here... - for zidx = 1:nZ2 - if 0 - % small-tip in spectral direction - s_rfm_nu(zidx,:) = ang*Z_b(zidx) * conj(s_bi_nu); % conj? - %s_rfm_nu(zidx,:) = 2*asin(abs(bsf(zidx))) * conj(s_bi_nu); % conj? - % s_rfm_nu(zidx,:) = ang*abs(Z_b(zidx)) * conj(s_bi_nu); - else - % SLR on uniformly spaced samples - [t_nu_sort, I_nu_sort] = sort(t_nu); - t_nu = t_nu_sort; - s_bi_nu = s_bi_nu(I_nu_sort); - for idx = 1:oversamp_slr - s_rfm_nu(zidx,idx:oversamp_slr:end) = ... - b2rf(bsf(zidx) * s_bi_nu(idx:oversamp_slr:end)); - end - - end - end - - % Now calculate new z beta polynomial by inverse FFT - z_bm_nu = fftr(sin(s_rfm_nu/2), z_np, 1); % Each row now scaled by - % tip-angle - - % SLR in Z to get RF - z_rf_nu = zeros(size(z_bm_nu)); - for idx = 1:size(z_bm_nu,2), - z_rf_nu(:,idx) = conj(b2rf(z_bm_nu(:,idx))); - end; - - % Now raster scan for actual sampling positions - z_rfm = []; - - for idx = 1:length(s_b) - for zidx = 1:z_np, - zi_off = (2*zidx - z_np-1) / (z_np-1) * off; - if (rem(idx,2) == 1) - idx_intrp = (idx-1) + zi_off; - else - idx_intrp = (idx-1) - zi_off; - end - tmp_z_rf(zidx) = interp1(t_nu, ... - z_rf_nu(zidx,:), idx_intrp, 'spline'); - end; - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - - - - else % no spectral correction - if (dbg) - fprintf(1,'Doing SLR in F...\n'); - end; - s_rfm = []; - bsf = sin(ang/2) * Z_b; - for idx = 1:nZ2, - tmp_s_rf = b2rf(bsf(idx) * s_b); - s_rfm = [s_rfm tmp_s_rf(:)]; - end; - - % Now calculate new z beta polynomial by inverse FFT, then use - % SLR to get RF - % - z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by - % tip-angle - z_rfm = []; - if (dbg) - fprintf(1,'Doing SLR in Z... \n'); - end; - for idx = 1:size(z_bm,1), - tmp_z_rf = conj(b2rf(z_bm(idx,:))); - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - end; %SS_SPECT_CORRECT_FLAG - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used - % - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - - nlobe = length(s_b); - rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - - % Additional VERSE with B1 restriction, maintaining duration - % - if 1 - % Verse based on largest RF amplitudes at each kz, then use same - % gradient lobe for each - % - z_rfmax = max(abs(z_rfm)); - else - % verse based on largest RF subpulse - [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); - z_rfmax = z_rfm(b1max_idx,:); - end - - z_rfvmax1 = ss_verse(g2, z_rfmax); - [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - - if (isempty(z_rfvmax)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - for idx = 1:nlobe, - if (rem(idx,2) == 1) - z_rfmod = z_rfm(idx,:) .* rfmod; - z_rfvmod = ss_verse(g2v, z_rfmod); - else - z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; - z_rfvmod = ss_verse(g2v(end:-1:1), z_rfmod); - end - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - - % update gradient - gpos = [g1, g2v, g3]; - gneg = [-g1, -g2v(end:-1:1), -g3]; - else - if (dbg) - fprintf(1,'Versing RF... \n'); - end; - for idx = 1:nlobe, - if (rem(idx,2) == 1) - z_rfmod = z_rfm(idx,:) .* rfmod; - else - z_rfmod = z_rfm(idx,end:-1:1) .* rfmod; - end - if SS_VERSE_FRAC == 0, - z_rfvmod = z_rfmod; - else - z_rfvmod = ss_verse(g2, z_rfmod); - end; - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - end; - else % no SLR - % Correct spectral filter for non-uniform sampling - % in spectral dimension - % - Nper = length([gpos]); - Noff = -(ng2-1)/2:((ng2-1)/2); - bsf = sin(ang/2) * ones(size(Noff)); - if SS_SPECT_CORRECT_FLAG, - % s_b = [0; s_b]; % Can pad to keep from blowing up - - s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... - ptype, 'EP', SS_SLR_FLAG, dbg); - s_rfm = conj(s_rfm); - else - s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation - % here -- needed because of - % possible asymmetric frequency - % response - end; - - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used. - % - % NOTE: With an EP trajectory, we have to play the RF - % out in reverse. As as result, we should make sure to - % verse the RF pulse in both directions separately in case - % it is not symmetric. - % - % VERSE'ing in both forward and reverse directions has the effect of - % introducing significant distortions into the other bands, which is - % particularly bad in the stop bands. Not sure if there is a way around - % this, but only VERSEing in one direction and then using a reversed - % pulse seems to reduce this problem. - - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - fpass_mid = 0; - z_bmod_for = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - z_b_rev = z_b(end:-1:1); - z_bmod_rev = z_b_rev(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - % Additional VERSE with B1 restriction, maintaining duration - % account for scaling by the largest possible spectral weightings at - % each spatial sample - b1max_sc = max(abs(s_rfm), [], 1); - - z_bvmod1 = ss_verse(g2, z_bmod_for); - [z_bvmod_for, g2v_for] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - % not sure this is necessary, adds nice symmetry though - z_bvmod1 = ss_verse(g2, z_bmod_rev); - [z_bvmod_rev, g2v_rev] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc(end:-1:1), SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - if (isempty(z_bvmod_for) || isempty(z_bvmod_rev)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - g2v = min(g2v_for, g2v_rev(end:-1:1)); - - z_bvmod_for = ss_verse(g2v, z_bmod_for); - z_bvmod_rev = ss_verse(g2v(end:-1:1), z_bmod_rev); - - z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... - fpass_mid); - z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... - fpass_mid); - z_bv_rev = z_bv_for(end:-1:1); - - - % update gradient - gpos = [g1, g2v, g3]; - gneg = [-g1, -g2v(end:-1:1), -g3]; - else - - - % Do forward RF pulse - % - z_bvmod_for = ss_verse(g2, z_bmod_for); - - % Modulate back to 0 - % - z_bv_for = z_bvmod_for(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - % Do reverse RF pulse - % - z_bvmod_rev = ss_verse(g2, z_bmod_rev); - z_bv_rev = z_bvmod_rev(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - % More accurate to do just reveres RF pulse - % reverse VERSE'ing doesn't work well with asymmetric RF pulses for - % some reason - z_bv_rev = z_bv_for(end:-1:1); - end - - % Build RF matrix - % - nlobe = length(s_b); - z_rfmv = zeros(nlobe, z_np); - for idx = 1:nlobe - if rem(idx,2) == 1 - z_rfmv(idx,:) = s_rfm(idx,:) .* z_bv_for; - else - z_rfmv(idx,:) = s_rfm(idx,end:-1:1) .* z_bv_rev; - end; - end - - end; % SLR - - - % Calculate isodelay --- since we only have linear phase pulses for - % this routine, it's easy... - % - if bitget(nlobe,1) == 1, - isodelay = ((nlobe+1)/2 * length(gpos) + (nlobe-1)/2 * length(gneg)) ... - * SS_TS; - else - isodelay = (nlobe/2 * length(gpos) + nlobe/2 * length(gneg)) ... - * SS_TS; - end - - % Compile g, RF - % - rf = []; g = []; - for idx = 1:nlobe, - rf_lobe = z_rfmv(idx,:); - rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; - if rem(idx,2) == 1 - g = [g gpos]; - else - g = [g gneg]; - end; - end; - - % Offset RF - % - nrf = length(rf); - rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); - - % Convert amplitude to Gauss - % - rf = rf / (2 * pi * SS_GAMMA * SS_TS); - - % Calculate refocussing lobe - % - switch (ptype) - case{'ex', 'se'} - ; - otherwise - return; - end; - - % Step 1 - get passbands - % - fmid = (f(1:2:end) + f(2:2:end))/2; - idx_pass = find(a > 0); - fpass = fmid(idx_pass); - npass = length(fpass); - - % Step 2 - get spatial sample points - % - nz = 101; - dz = z_thk / (nz-1); - z = [-z_thk/2:dz:z_thk/2]; - - % Step 3 - get spatial profile - % - gzrot = 2 * pi * SS_GAMMA * SS_TS * g; - gfrot = 2 * pi * SS_TS * ones(size(g)); - rrot = 2 * pi * SS_GAMMA * SS_TS * rf; - switch (ptype) - case {'ex'} - mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); - case {'se'} - mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); - otherwise - end; - - % Step 4 - find best fit to phase ramp - % - zpass = z(:) * ones(1,npass); - zpass = zpass(:); - mxy_phs = unwrap(angle(mxy)); - mxy_phs_mid = mxy_phs((nz+1)/2,:); - mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); - mxy_phs = mxy_phs(:); - - p = polyfit(zpass,mxy_phs,1); - slope = p(1); - - % Step 5 - get area of gradient required - % - cyc_per_cm = slope/(2*pi); - m0 = cyc_per_cm / SS_GAMMA; - gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); - - rf = [rf zeros(size(gref))]; - g = [g gref]; - isodelay = isodelay + length(gref) * SS_TS; - else - % No solution for this frequency - % - rf = []; - g = []; - isodelay = []; - end; - diff --git a/RF_pulses/spectral_spatial/ss_flyback.m b/RF_pulses/spectral_spatial/ss_flyback.m deleted file mode 100644 index 84366e0..0000000 --- a/RF_pulses/spectral_spatial/ss_flyback.m +++ /dev/null @@ -1,507 +0,0 @@ -function [rf,g] = ss_flyback(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... - s_ftype, ss_type, f_off, dbg) -% SS_FLYBACK - Calculate flyback-type SS pulse -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_flyback.m,v 1.30 2013/08/15 16:02:33 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - if strfind(ss_type,'Half') - sym_flag = 1; - else - sym_flag = 0; - end; - - [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); - if (isempty(f_a)) - error('Strange: this frequency should be ok'); - end; - if (dbg >= 2) - ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - end; - - % Calculate cycles/cm required - % - kz_max = z_tb / z_thk; % cycles/cm - kz_area = kz_max / SS_GAMMA; % G/cm * s - - nsamp = round(1/(fs*SS_TS)); - [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... - SS_MXS, SS_TS, SS_EQUAL_LOBES); - ng1 = length(g1); - ng2 = length(g2); - ng3 = length(g3); - - % Determine max order that can be supported - % - t_poslobe = length(gpos) * SS_TS; - t_lobe = length([gpos gneg]) * SS_TS; - max_lobe = floor((SS_MAX_DURATION - t_poslobe) / t_lobe) + 1; - - % Prepare amplitude description that is consistent - % with other fir design calls - a_dup = zeros(size(f_a)); - a_dup(1:2:end) = a_a; - a_dup(2:2:end) = a_a; - - % Call fir filter design based on spectral factorization - % and convex optimization - % - if SS_MIN_ORDER, - use_max = 0; - else - use_max = 1; - end; - - switch (s_ftype) - case 'min' - [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, dbg); - case 'max' - [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, ... - dbg); - s_b = conj(s_b(end:-1:1)); - case 'lin' - if use_max, - % Make sure to use n_odd - % - if bitget(max_lobe,1) == 0, - max_lobe = max_lobe+1; - end; - [s_b,status] = fir_qprog(max_lobe, f_a, a_dup, d_a, dbg); - else - odd_or_even = 0; - [s_b,status] = fir_min_order_qprog(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); - end; - end; - if strcmp(status, 'Solved'); - nlobe = length(s_b); - if dbg >= 2, - ss_band_plot(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - - figure; - cplot(s_b); - title(sprintf('Filter Taps - Fs: %6.1f', fs)); - xlabel('Tap'); - ylabel('Amplitude'); - drawnow; - pause(1); - end; - if dbg >= 1, - figure; - nf = 512; - h = fftf(s_b, nf); - freqs = fs * [-nf/2:nf/2-1]/nf; - plot(freqs,abs(h)); - title(sprintf('Spectral response - Fs: %6.1f', fs)); - xlabel('Frequency'); - ylabel('Magnitude'); - grid; - drawnow; - pause(1); - end; - - % Get Z RF pulse - % - if (dbg) - fprintf(1,'Getting Z RF pulse\n'); - end; - z_np = length(g2); - z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... - z_d(1), z_d(2)); - - % Correct for non-linear effects with SLR if desired - % - if (SS_SLR_FLAG == 1), - % Calculate excitation profile assuming in small-tip regime - % - oversamp = 4; - nZ = oversamp * z_np; - nZ2 = 2^ceil(log2(nZ)); - Z_b = fftf(z_b, nZ2); % column transform, unit magnitude - - if SS_SPECT_CORRECT_FLAG, - % Interpolate spectral filter on a grid that's equal to - % the number of time samples of the gradient --- do this - % partly before calling b2rf and partly afterwards - % - Nper = length([gpos gneg]); - oversamp_slr = 16; - Ntotal = Nper * (length(s_b)); -% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * ... -% (length(s_b))); - off = floor(z_np/2)/Nper; -% Ntotal = Nper * (length(s_b)); -% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * (length(s_b))); - % s_bi = length(s_b)/Ntotal * interpft(s_b,Ntotal); % Scale to keep - % tranform consistent - - % For each Z position: - % - calculate nominal scaling of s_b - % - determine spectral taps through SLR - % - bsf = sin(ang/2) * Z_b; - s_rfm = zeros(length(bsf),length(s_b)*oversamp_slr); - if 1 - s_bi = spec_interp(s_b, oversamp_slr,-off,f_a, dbg); - for idx = 1:nZ2, - for bidx = 1:oversamp_slr, - s_rfm(idx,bidx:oversamp_slr:end) = ... - b2rf(bsf(idx) * s_bi(bidx:oversamp_slr:end)); - end; - end; - else - s_bi = spec_interp2(s_b, oversamp_slr,-off); - for idx = 1:nZ2, - s_rfm(idx,:) = oversamp_slr * b2rf(bsf(idx) * s_bi); - end; - end; - - % Now calculate new z beta polynomial by inverse FFT, then use - % SLR to get RF - % - z_bm = fftr(sin(s_rfm/2), z_np, 1); % Each row now scaled by - % tip-angle - % Now do SLR in Z direction - % - if (dbg) - fprintf(1,'Doing SLR in Z... \n'); - end; - if 1 - z_rf = zeros(size(z_bm)); - for idx = 1:size(z_bm,2), - z_rf(:,idx) = conj(b2rf(z_bm(:,idx))); - end; - - % Now raster scan for actual sampling positions - % - z_rfm = []; - for idx = 1:length(s_b) - for zidx = 1:z_np, - % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); - idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); - tmp_z_rf(zidx) = interp1([1:size(z_rf,2)], z_rf(zidx,:), ... - idx_intrp, 'spline'); - end; - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - else - % Choose time samples corresponding to trajectory - % - z_rfm = []; - for idx = 1:length(s_b), - for zidx = 1:z_np, - % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); - idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); - tmp_z_bm(zidx) = ... - interp1([1:size(z_bm,2)], z_bm(zidx,:), ... - idx_intrp, 'spline'); - end; - tmp_z_rf = conj(b2rf(tmp_z_bm)); - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - end; - else % no spectral correction - if (dbg) - fprintf(1,'Doing SLR in F...\n'); - end; - s_rfm = []; - bsf = sin(ang/2) * Z_b; - for idx = 1:nZ2, - tmp_s_rf = b2rf(bsf(idx) * s_b); - s_rfm = [s_rfm tmp_s_rf(:)]; - end; - - % Now calculate new z beta polynomial by inverse FFT, then use - % SLR to get RF - % - z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by - % tip-angle - z_rfm = []; - if (dbg) - fprintf(1,'Doing SLR in Z... \n'); - end; - for idx = 1:size(z_bm,1), - tmp_z_rf = conj(b2rf(z_bm(idx,:))); - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - end; - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used - % - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - - nlobe = length(s_b); - rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - - % Additional VERSE with B1 restriction, maintaining duration - if 1 - % Verse based on largest RF amplitudes at each kz, then use same - % gradient lobe for each - % - z_rfmax = max(abs(z_rfm)); - else - % Verse largest RF pulse, then use same gradient lobe for - % each - [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); - z_rfmax = z_rfm(b1max_idx,:); - end - - z_rfvmax1 = ss_verse(g2, z_rfmax); - - % z_rfmod = z_rfm(b1max_idx,:) .* rfmod; - %z_rfvmod1 = ss_verse(g2, z_rfmod); - [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - if (isempty(z_rfvmax)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - if 0 - % experimental filtering: - % cutoff at x*125 kHz - b = firls(10, [0 .1 .2 1], [1 1 0 0]); - g2vs = sum(g2v); - g2v = filtfilt(b, 1, g2v); - g2v = g2v * g2vs / sum(g2v); - end - - for idx = 1:nlobe, - z_rfmod = z_rfm(idx,:) .* rfmod; - z_rfvmod = ss_verse(g2v, z_rfmod); - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - - % update gradient - gpos = [g1, g2v, g3]; - if SS_EQUAL_LOBES - gneg = -gpos; - end - else - if (dbg) - fprintf(1,'Versing RF... \n'); - end; - for idx = 1:nlobe, - z_rfmod = z_rfm(idx,:) .* rfmod; - if SS_VERSE_FRAC == 0, - z_rfvmod = z_rfmod; - else - z_rfvmod = ss_verse(g2, z_rfmod); - end; - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - end; - else % no SLR - if SS_SPECT_CORRECT_FLAG, - % Spectral correction needs to be applied to unaliased bands, - % therefore the raw frequency spec needs to be passed through. - % -% s_b = [0; s_b; 0]; % play with adding extra taps to make - % spectral correction easier - Nper = length([gpos gneg]); - st_off = -floor(ng2/2); - Noff = [st_off:st_off+ng2-1]; - bsf = sin(ang/2) * ones(size(Noff)); % This needs to be - % updated - if (dbg) - fprintf(1,'No SLR.. spectral correction...\n'); - end; -% s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... -% ptype, 'Flyback', SS_SLR_FLAG, dbg); - s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, f, ... - ptype, 'Flyback', SS_SLR_FLAG, dbg); - else - s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation - % here -- needed because of - % possible asymmetric frequency - % response - end - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used - % - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - z_bmod = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - % Additional VERSE with B1 restriction, maintaining duration - % account for scaling by the largest possible spectral weightings at - % each spatial sample - b1max_sc = max(abs(s_rfm)); - - z_bvmod1 = ss_verse(g2, z_bmod); - [z_bvmod, g2v] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - if (isempty(z_bvmod)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - if 0 - % experimental filtering: - % cutoff at x*125 kHz - b = firls(10, [0 .1 .2 1], [1 1 0 0]); - g2vs = sum(g2v); - g2v = filtfilt(b, 1, g2v); - g2v = g2v * g2vs / sum(g2v); - - z_bvmod = ss_verse(g2v, z_bmod); - end - - % update gradient - gpos = [g1, g2v, g3]; - if SS_EQUAL_LOBES - gneg = -gpos; - end - else - if (dbg) - fprintf(1,'Versing RF... \n'); - end; - if SS_VERSE_FRAC == 0, - z_bvmod = z_bmod; - else - z_bvmod = ss_verse(g2, z_bmod); - end; - end; - - % Modulate back - % - z_bv = z_bvmod(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... - fpass_mid); - - % Build RF matrix - % - nlobe = length(s_b); - z_rfmv = s_rfm .* (ones(nlobe,1) * z_bv); - end; - - % Compile g, RF - % - rf = []; g = []; - nneg = length(gneg); - for idx = 1:nlobe, - rf_lobe = z_rfmv(idx,:); - rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; - if idx < nlobe, - rf = [rf zeros(1,nneg)]; - g = [g gpos gneg]; - else - g = [g gpos]; - end; - end; - - % Offset RF - % - nrf = length(rf); - rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); - - % Convert amplitude to Gauss - % - rf = rf / (2 * pi * SS_GAMMA * SS_TS); - - % Calculate refocussing lobe - % - switch (ptype) - case{'ex', 'se'} - ; - otherwise - return; - end; - - % Step 1 - get passbands - % - fmid = (f(1:2:end) + f(2:2:end))/2; - idx_pass = find(a > 0); - fpass = fmid(idx_pass); - npass = length(fpass); - - % Step 2 - get spatial sample points - % - nz = 101; - dz = z_thk / (nz-1); - z = [-z_thk/2:dz:z_thk/2]; - - % Step 3 - get spatial profile - % - gzrot = 2 * pi * SS_GAMMA * SS_TS * g; - gfrot = 2 * pi * SS_TS * ones(size(g)); - rrot = 2 * pi * SS_GAMMA * SS_TS * rf; - switch (ptype) - case {'ex'} - mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); - case {'se'} - mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); - otherwise - end; - - % Step 4 - find best fit to phase ramp - % - zpass = z(:) * ones(1,npass); - zpass = zpass(:); - mxy_phs = unwrap(angle(mxy)); - mxy_phs_mid = mxy_phs((nz+1)/2,:); - mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); - mxy_phs = mxy_phs(:); - - p = polyfit(zpass,mxy_phs,1); - slope = p(1); - - % Step 5 - get area of gradient required - % - cyc_per_cm = slope/(2*pi); - m0 = cyc_per_cm / SS_GAMMA; - gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); - - rf = [rf zeros(size(gref))]; - g = [g gref]; - else - % No solution for this frequency - % - rf = []; - g = []; - end; - diff --git a/RF_pulses/spectral_spatial/ss_flyback_phs.m b/RF_pulses/spectral_spatial/ss_flyback_phs.m deleted file mode 100644 index b78b972..0000000 --- a/RF_pulses/spectral_spatial/ss_flyback_phs.m +++ /dev/null @@ -1,536 +0,0 @@ -function [rf,g,isodelay] = ss_flyback_phs(ang, z_thk, z_tb, z_d, f, a, d, fs, ptype, z_ftype, ... - s_ftype, ss_type, f_off, dbg) -% SS_FLYBACK - Calculate flyback-type SS pulse -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_flyback_phs.m,v 1.4 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - if strfind(ss_type,'Half') - sym_flag = 1; - else - sym_flag = 0; - end; - - % Check specification - % - [f_a, a_a, d_a, f_off] = ss_alias(f,a,d,f_off,fs,sym_flag); - if (isempty(f_a)) - error('Strange: this frequency should be ok'); - end; - if (dbg >= 2) - ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - end; - - % Calculate cycles/cm required - % - kz_max = z_tb / z_thk; % cycles/cm - kz_area = kz_max / SS_GAMMA; % G/cm * s - - nsamp = round(1/(fs*SS_TS)); - [gpos, gneg, g1, g2, g3] = grad_ss(kz_area, nsamp, SS_VERSE_FRAC, SS_MXG, ... - SS_MXS, SS_TS, SS_EQUAL_LOBES); - ng1 = length(g1); - ng2 = length(g2); - ng3 = length(g3); - - % Determine max order that can be supported - % - t_poslobe = length(gpos) * SS_TS; - t_lobe = length([gpos gneg]) * SS_TS; - max_lobe = floor((SS_MAX_DURATION - t_poslobe) / t_lobe) + 1; - - % Prepare amplitude description that is consistent - % with other fir design calls - a_dup = zeros(size(f_a)); - a_dup(1:2:end) = a_a; - a_dup(2:2:end) = a_a; - - % Call fir filter design based on spectral factorization - % and convex optimization - % - if SS_MIN_ORDER, - use_max = 0; - else - use_max = 1; - end; - - switch (s_ftype) - case 'min' - % [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, - % use_max, dbg); - error('min phase spectral filter not supported for complex band specification'); - case 'max' - % [s_b,status] = fir_minphase_power(max_lobe, f_a, a_dup, d_a, use_max, ... - % dbg); - % s_b = conj(s_b(end:-1:1)); - error('max phase spectral filter not supported for complex band specification'); - case 'lin' - if use_max, - % Make sure to use n_odd - WHY? - % - %if bitget(max_lobe,1) == 0, - % max_lobe = max_lobe+1; - % end; - [s_b,status] = fir_qprog_phs(max_lobe, f_a, a_dup, d_a, [], dbg); - else - odd_or_even = 0; - [s_b,status] = fir_min_order_qprog_phs(max_lobe, f_a, a_dup, d_a, odd_or_even, dbg); - end - case 'min_power' - if use_max, - % Make sure to use n_odd -- WHY? - % - % if bitget(max_lobe,1) == 0, - % max_lobe = max_lobe+1; - % end; - - % Iterate over attempting different phase profiles for spectral - % filter, choosing the one that minimizes the peak power - % - [s_b, a_dup_best, status] = fir_min_power_phs(max_lobe, f_a, a_dup, d_a, [], dbg); - else - error('Don''t handle case of minimum order, minimum peak power'); - end - a_a = a_dup_best(1:2:end); - end - if strcmp(status, 'Solved'); - nlobe = length(s_b); - if dbg >= 2, - ss_band_plot_phs(f_a, a_a, d_a, f_off, fs, min(f), max(f),sym_flag); - - figure; - cplot(s_b); - title(sprintf('Filter Taps - Fs: %6.1f', fs)); - xlabel('Tap'); - ylabel('Amplitude'); - drawnow; - pause(1); - end; - if dbg >= 1, - figure; - nf = 512; - h = fftf(s_b, nf); - freqs = fs * [-nf/2:nf/2-1]/nf; - plot(freqs,abs(h)); - title(sprintf('Spectral response - Fs: %6.1f', fs)); - xlabel('Frequency'); - ylabel('Magnitude'); - grid; - drawnow; - pause(1); - end; - - % Get Z RF pulse - % - if (dbg) - fprintf(1,'Getting Z RF pulse\n'); - end; - z_np = length(g2); - z_b = dzbeta(z_np, z_tb, 'st', z_ftype, ... - z_d(1), z_d(2)); - - % Correct for non-linear effects with SLR if desired - % - if (SS_SLR_FLAG == 1), - % Calculate excitation profile assuming in small-tip regime - % - oversamp = 4; - nZ = oversamp * z_np; - nZ2 = 2^ceil(log2(nZ)); - Z_b = fftf(z_b, nZ2); % column transform, unit magnitude - - if SS_SPECT_CORRECT_FLAG, - % Interpolate spectral filter on a grid that's equal to - % the number of time samples of the gradient --- do this - % partly before calling b2rf and partly afterwards - % - Nper = length([gpos gneg]); - oversamp_slr = 16; - Ntotal = Nper * (length(s_b)); -% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * ... -% (length(s_b))); - off = floor(z_np/2)/Nper; -% Ntotal = Nper * (length(s_b)); -% s_bi = 1/oversamp_slr * interpft([s_b], oversamp_slr * (length(s_b))); - % s_bi = length(s_b)/Ntotal * interpft(s_b,Ntotal); % Scale to keep - % tranform consistent - - % For each Z position: - % - calculate nominal scaling of s_b - % - determine spectral taps through SLR - % - bsf = sin(ang/2) * Z_b; - s_rfm = zeros(length(bsf),length(s_b)*oversamp_slr); - if 1 - s_bi = spec_interp(s_b, oversamp_slr,-off,f_a, dbg); - for idx = 1:nZ2, - for bidx = 1:oversamp_slr, - s_rfm(idx,bidx:oversamp_slr:end) = ... - b2rf(bsf(idx) * s_bi(bidx:oversamp_slr:end)); - end; - end; - else - s_bi = spec_interp2(s_b, oversamp_slr,-off); - for idx = 1:nZ2, - s_rfm(idx,:) = oversamp_slr * b2rf(bsf(idx) * s_bi); - end; - end; - - % Now calculate new z beta polynomial by inverse FFT, then use - % SLR to get RF - % - z_bm = fftr(sin(s_rfm/2), z_np, 1); % Each row now scaled by - % tip-angle - % Now do SLR in Z direction - % - if (dbg) - fprintf(1,'Doing SLR in Z... \n'); - end; - if 1 - z_rf = zeros(size(z_bm)); - for idx = 1:size(z_bm,2), - z_rf(:,idx) = conj(b2rf(z_bm(:,idx))); - end; - - % Now raster scan for actual sampling positions - % - z_rfm = []; - for idx = 1:length(s_b) - for zidx = 1:z_np, - % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); - idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); - tmp_z_rf(zidx) = interp1([1:size(z_rf,2)], z_rf(zidx,:), ... - idx_intrp, 'spline'); - end; - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - else - % Choose time samples corresponding to trajectory - % - z_rfm = []; - for idx = 1:length(s_b), - for zidx = 1:z_np, - % idx_intrp = (idx*Nper - round(z_np/2) + zidx-1)/Ntotal*length(s_bi); - idx_intrp = 1 + ((idx-1)*Nper + zidx-1)/Ntotal*length(s_bi); - tmp_z_bm(zidx) = ... - interp1([1:size(z_bm,2)], z_bm(zidx,:), ... - idx_intrp, 'spline'); - end; - tmp_z_rf = conj(b2rf(tmp_z_bm)); - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - end; - else % no spectral correction - if (dbg) - fprintf(1,'Doing SLR in F...\n'); - end; - s_rfm = []; - bsf = sin(ang/2) * Z_b; - for idx = 1:nZ2, - tmp_s_rf = b2rf(bsf(idx) * s_b); - s_rfm = [s_rfm tmp_s_rf(:)]; - end; - - % Now calculate new z beta polynomial by inverse FFT, then use - % SLR to get RF - % - z_bm = fftr(sin(s_rfm/2), z_np, 2); % Each row now scaled by - % tip-angle - z_rfm = []; - if (dbg) - fprintf(1,'Doing SLR in Z... \n'); - end; - for idx = 1:size(z_bm,1), - tmp_z_rf = conj(b2rf(z_bm(idx,:))); - z_rfm = [z_rfm; tmp_z_rf(:).']; - end; - end; - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used - % - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - - nlobe = length(s_b); - rfmod = exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - - % Additional VERSE with B1 restriction, maintaining duration - if 1 - % Verse based on largest RF amplitudes at each kz, then use same - % gradient lobe for each - % - z_rfmax = max(abs(z_rfm)); - else - % Verse largest RF pulse, then use same gradient lobe for - % each - [b1max_sc,b1max_idx] = max(max(abs(z_rfm),[],2)); - z_rfmax = z_rfm(b1max_idx,:); - end - - z_rfvmax1 = ss_verse(g2, z_rfmax); - - % z_rfmod = z_rfm(b1max_idx,:) .* rfmod; - %z_rfvmod1 = ss_verse(g2, z_rfmod); - [z_rfvmax, g2v] = ss_b1verse(g2, z_rfvmax1(:).', SS_MAX_B1, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - if (isempty(z_rfvmax)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - if 0 - % experimental filtering: - % cutoff at x*125 kHz - b = firls(10, [0 .1 .2 1], [1 1 0 0]); - g2vs = sum(g2v); - g2v = filtfilt(b, 1, g2v); - g2v = g2v * g2vs / sum(g2v); - end - - for idx = 1:nlobe, - z_rfmod = z_rfm(idx,:) .* rfmod; - z_rfvmod = ss_verse(g2v, z_rfmod); - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - - % update gradient - gpos = [g1, g2v, g3]; - if SS_EQUAL_LOBES - gneg = -gpos; - end - else - if (dbg) - fprintf(1,'Versing RF... \n'); - end; - for idx = 1:nlobe, - z_rfmod = z_rfm(idx,:) .* rfmod; - if SS_VERSE_FRAC == 0, - z_rfvmod = z_rfmod; - else - z_rfvmod = ss_verse(g2, z_rfmod); - end; - z_rfv = z_rfvmod(:).' .* conj(rfmod); - z_rfmv(idx,:) = z_rfv; - end; - end; - else % no SLR - if SS_SPECT_CORRECT_FLAG, - % Spectral correction needs to be applied to unaliased bands, - % therefore the raw frequency spec needs to be passed through. - % -% s_b = [0; s_b; 0]; % play with adding extra taps to make - % spectral correction easier - Nper = length([gpos gneg]); - st_off = -floor(ng2/2); - Noff = [st_off:st_off+ng2-1]; - bsf = sin(ang/2) * ones(size(Noff)); % This needs to be - % updated - if (dbg) - fprintf(1,'No SLR.. spectral correction...\n'); - end; -% s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, (f-f_off)/(fs/2), ... -% ptype, 'Flyback', SS_SLR_FLAG, dbg); - s_rfm = ss_spect_correct(s_b, bsf, Nper, Noff, f, ... - ptype, 'Flyback', SS_SLR_FLAG, dbg); - else - s_rfm = ang * conj(s_b(:)) * ones(1,ng2); % Intentional conjugation - % here -- needed because of - % possible asymmetric frequency - % response - end - - % Modulate rf to passband frequency BEFORE versing, then - % modulate back. This will make sure that the slice profile - % shows no blurring at the passband. In the case that - % multiple passbands are defined, then the midpoint of - % the first passband is used - % - pass_idx = find(a > 0, 1, 'first'); - fpass = [f(pass_idx*2-1) f(pass_idx*2)]; - fpass_mid = mean(fpass) - f_off; - z_bmod = z_b(:).' .* exp(i*2*pi*[0:(z_np-1)]*SS_TS*fpass_mid); - - if SS_VERSE_B1 - if (dbg) - fprintf(1,'Versing RF with B1 minimization... \n'); - end; - % Additional VERSE with B1 restriction, maintaining duration - % account for scaling by the largest possible spectral weightings at - % each spatial sample - b1max_sc = max(abs(s_rfm)); - - z_bvmod1 = ss_verse(g2, z_bmod); - [z_bvmod, g2v] = ss_b1verse(g2, z_bvmod1(:).', SS_MAX_B1 ./ b1max_sc, SS_MXG, ... - SS_MXS, SS_TS, SS_GAMMA, SS_SLEW_PENALTY, dbg); - - if (isempty(z_bvmod)) - % B1 condition cannot be met - rf = []; - g = []; - return; - end - - if 0 - % experimental filtering: - % cutoff at x*125 kHz - b = firls(10, [0 .1 .2 1], [1 1 0 0]); - g2vs = sum(g2v); - g2v = filtfilt(b, 1, g2v); - g2v = g2v * g2vs / sum(g2v); - - z_bvmod = ss_verse(g2v, z_bmod); - end - - % update gradient - gpos = [g1, g2v, g3]; - if SS_EQUAL_LOBES - gneg = -gpos; - end - else - if (dbg) - fprintf(1,'Versing RF... \n'); - end; - if SS_VERSE_FRAC == 0, - z_bvmod = z_bmod; - else - z_bvmod = ss_verse(g2, z_bmod); - end; - end; - - % Modulate back - % - z_bv = z_bvmod(:).' .* exp(-i*2*pi*[0:(z_np-1)]*SS_TS* ... - fpass_mid); - - % Build RF matrix - % - nlobe = length(s_b); - z_rfmv = s_rfm .* (ones(nlobe,1) * z_bv); - end; - - % Calculate isodelay --- since we only have linear phase pulses for - % this routine, it's easy... - % - isodelay = ((nlobe/2) * length(gpos) + (nlobe-1)/2*length(gneg)) ... - * SS_TS; - - % Compile g, RF - % - rf = []; g = []; - nneg = length(gneg); - for idx = 1:nlobe, - rf_lobe = z_rfmv(idx,:); - rf = [rf zeros(1,ng1) rf_lobe zeros(1,ng3)]; - if idx < nlobe, - rf = [rf zeros(1,nneg)]; - g = [g gpos gneg]; - else - g = [g gpos]; - end; - end; - - % Offset RF - % - nrf = length(rf); - rf = rf .* exp(-i*2*pi*[0:nrf-1]*SS_TS*f_off); - - % Convert amplitude to Gauss - % - rf = rf / (2 * pi * SS_GAMMA * SS_TS); - - % Calculate refocussing lobe - % - switch (ptype) - case{'ex', 'se'} - ; - otherwise - return; - end; - - % Step 1 - get passbands - % - fmid = (f(1:2:end) + f(2:2:end))/2; - idx_pass = find(a > 0); - fpass = fmid(idx_pass); - npass = length(fpass); - - % Step 2 - get spatial sample points - % - nz = 101; - dz = z_thk / (nz-1); - z = [-z_thk/2:dz:z_thk/2]; - - % Step 3 - get spatial profile - % - gzrot = 2 * pi * SS_GAMMA * SS_TS * g; - gfrot = 2 * pi * SS_TS * ones(size(g)); - rrot = 2 * pi * SS_GAMMA * SS_TS * rf; - switch (ptype) - case {'ex'} - mxy = ab2ex(abr(rrot, gzrot + i*gfrot, z, fpass)); - case {'se'} - mxy = ab2se(abr(rrot, gzrot + i*gfrot, z, fpass)); - otherwise - end; - - % Step 4 - find best fit to phase ramp - % - zpass = z(:) * ones(1,npass); - zpass = zpass(:); - mxy_phs = unwrap(angle(mxy)); - mxy_phs_mid = mxy_phs((nz+1)/2,:); - mxy_phs = mxy_phs - (ones(nz,1) * mxy_phs_mid); - mxy_phs = mxy_phs(:); - - p = polyfit(zpass,mxy_phs,1); - slope = p(1); - - % Step 5 - get area of gradient required - % - cyc_per_cm = slope/(2*pi); - m0 = cyc_per_cm / SS_GAMMA; - gref = grad_mintrap(m0, SS_MXG, SS_MXS, SS_TS); - - rf = [rf zeros(size(gref))]; - g = [g gref]; - isodelay = isodelay + length(gref) * SS_TS; - else - % No solution for this frequency - % - rf = []; - g = []; - isodelay = []; - end; - diff --git a/RF_pulses/spectral_spatial/ss_globals.m b/RF_pulses/spectral_spatial/ss_globals.m deleted file mode 100644 index af4f309..0000000 --- a/RF_pulses/spectral_spatial/ss_globals.m +++ /dev/null @@ -1,114 +0,0 @@ -% -% -% SS_GLOBALS -% -% Common global definitions for SS package -% -% Parameters -% NAME DESCRIPTION DEFAULT -% ---------- ------------------------------------------------------- --------- -% 'Nucleus' Nuclei of interest, possible values include 'Hydrogen' -% 'Hydrogen', 'Lithium', 'Carbon', 'Sodium', 'Phosphorous' -% 'Max Grad' Maximum Gradient Strength (G/cm) 5 -% 'Max Slew' Maximum Slew Rate (G/cm/ms) 20 -% 'Sample Time' Sampling Time (s) 4e-6 -% 'Max B1' Maximum B1 amplitude (G) 0.2 -% 'Max Duration' Maximum Pulse Duration (s) 20e-3 -% 'Num Lobe Iters' Spectral Sampling Frequency Iterations 10 -% 'Equal Lobes' Force Equal positive and negative gradient lobes 0 -% 'Verse Fraction' Fraction of ramps to use with VERSE 0.8 -% 'Num Fs Test' Spectral aliasing frequencys to test 100 -% 'Spect Correct' Spectral Correction with actual sampling 0 -% 'SLR' Shinnar-Le Roux Correction for large tip pulses 0 -% 'Min Order' Find minimum order FIR filter 1 -% 'B1 Verse' Apply B1-VERSE'ing for reduced peak power 0 -% 'Slew Penalty' In B1-VERSE, use slew-rate penalty to reduce delay sensitivity 0 -% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_globals.m,v 1.14 2014/05/22 20:43:59 peder Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -% Gamma definitions -- all in Hz/G -% -SS_GAMMA_HYDROGEN = 4257.6; -SS_GAMMA_LITHIUM = 1654.6; -SS_GAMMA_CARBON = 1070.5; -SS_GAMMA_SODIUM = 1126.2; -SS_GAMMA_PHOSPHOROUS = 1723.5; - -% Declare globals -% -global SS_INIT_DONE; - -% Nucleus info -% -global SS_NUCLEUS SS_GAMMA; - -% Gradient/timing parameters -% -global SS_MXG SS_MXS SS_TS; - -% RF parameters -% -global SS_MAX_B1 SS_MAX_DURATION; - -% Design tolerances, parameters -% -global SS_NUM_LOBE_ITERS SS_EQUAL_LOBES SS_VERSE_FRAC SS_NUM_FS_TEST; -global SS_SPECT_CORRECT_FLAG SS_SLR_FLAG; -global SS_VERSE_B1 SS_SLEW_PENALTY SS_MIN_ORDER; - -% Define globals if not already defined -% -if isempty(SS_INIT_DONE), - % Indicate init has been done - % - SS_INIT_DONE = 1; - - % Nucleus info - % - SS_NUCLEUS = 'Hydrogen'; - SS_GAMMA = SS_GAMMA_HYDROGEN; - - % Gradient/timing parameters - % - SS_MXG = 5.0; % G/cm - SS_MXS = 20; % G/cm/ms - SS_TS = 4e-6; % Sampling time (s) - - % RF parameters - % - SS_MAX_B1 = 0.2; % Gauss - SS_MAX_DURATION = 20e-3; % Max allowed duration - - - % Design tolerances, parameters - % - SS_NUM_LOBE_ITERS = 10; - SS_EQUAL_LOBES = 0; - SS_VERSE_FRAC = 0.8; - SS_NUM_FS_TEST = 100; - SS_SPECT_CORRECT_FLAG = 0; - SS_SLR_FLAG = 0; - SS_MIN_ORDER = 1; - SS_VERSE_B1 = 0; - SS_SLEW_PENALTY = 0; -end; diff --git a/RF_pulses/spectral_spatial/ss_opt.m b/RF_pulses/spectral_spatial/ss_opt.m deleted file mode 100644 index 3c8a07b..0000000 --- a/RF_pulses/spectral_spatial/ss_opt.m +++ /dev/null @@ -1,186 +0,0 @@ -function options = ss_opt(new_options) -% SS_OPT - Set options for spectral-spatial design -% -% function options = ss_opt(new_options) -% -% options - cell array of current options -% new_options - cell array of new options to set -% -% Pass new_options as [] to reset options -% -% See help ss_globals for options - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_opt.m,v 1.14 2013/08/15 14:41:09 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ss_globals; - - if (nargin < 1) - error('Usage: options = ss_opt(new_options)'); - end; - - if isempty(new_options) - SS_INIT_DONE = []; - ss_globals; - end; - - new_options = new_options.'; - new_options = new_options(:); - if (mod(length(new_options), 2) == 1), - error('Input parameter (new_options) must be of even length'); - end; - - nopt = length(new_options)/2; - for idx = 1:nopt, - opt = new_options{idx*2-1}; - optparm = new_options{idx*2}; - switch opt, - - case 'Nucleus' % Set nucleus and gamma - switch optparm, - case 'Hydrogen' - SS_NUCLEUS = optparm; - SS_GAMMA = SS_GAMMA_HYDROGEN; - case 'Lithium' - SS_NUCLEUS = optparm;; - SS_GAMMA = SS_GAMMA_LITHIUM; - case 'Carbon' - SS_NUCLEUS = optparm; - SS_GAMMA = SS_GAMMA_CARBON; - case 'Sodium' - SS_NUCLEUS = optparm; - SS_GAMMA = SS_GAMMA_SODIUM; - case 'Phosphorous' - SS_NUCLEUS = optparm; - SS_GAMMA = SS_GAMMA_PHOSPHOROUS; - otherwise - error(sprintf('Nucleus: %s not recognized', optparm)); - end; - - case 'Max Grad', - SS_MXG = optparm; - - case 'Max Slew', - SS_MXS = optparm; - - case 'Max B1', - SS_MAX_B1 = optparm; - - case 'Max Duration', - SS_MAX_DURATION = optparm; - - case 'Num Lobe Iters', - SS_NUM_LOBE_ITERS = optparm; - - case 'Equal Lobes', - SS_EQUAL_LOBES = optparm; - - case 'Verse Fraction', - SS_VERSE_FRAC = optparm; - - case 'Num Fs Test', - SS_NUM_FS_TEST = optparm; - - case 'Spect Correct', - SS_SPECT_CORRECT_FLAG = optparm; - - case 'SLR', - SS_SLR_FLAG = optparm; - - case 'Min Order', - SS_MIN_ORDER = optparm; - - case 'B1 Verse', - SS_VERSE_B1 = optparm; - - case 'Slew Penalty', - SS_SLEW_PENALTY = optparm; - - otherwise - SS_INIT_DONE = []; - ss_globals; - error(sprintf('Option: %s not recognized',opt)); - end; - end; - - % Fill in options to pass back - % - idx = 1; - - options{idx, 1} = 'Nucleus'; - options{idx, 2} = SS_NUCLEUS; - idx = idx+1; - - options{idx, 1} = 'Max Grad'; - options{idx, 2} = SS_MXG; - idx = idx+1; - - options{idx, 1} = 'Max Slew'; - options{idx, 2} = SS_MXS; - idx = idx+1; - - options{idx, 1} = 'Sample Time'; - options{idx, 2} = SS_TS; - idx = idx+1; - - options{idx, 1} = 'Max B1'; - options{idx, 2} = SS_MAX_B1; - idx = idx+1; - - options{idx, 1} = 'Max Duration'; - options{idx, 2} = SS_MAX_DURATION; - idx = idx+1; - - options{idx, 1} = 'Num Lobe Iters'; - options{idx, 2} = SS_NUM_LOBE_ITERS; - idx = idx+1; - - options{idx, 1} = 'Equal Lobes'; - options{idx, 2} = SS_EQUAL_LOBES; - idx = idx+1; - - options{idx, 1} = 'Verse Fraction'; - options{idx, 2} = SS_VERSE_FRAC; - idx = idx+1; - - options{idx, 1} = 'Num Fs Test'; - options{idx, 2} = SS_NUM_FS_TEST; - idx = idx+1; - - options{idx, 1} = 'Spect Correct'; - options{idx, 2} = SS_SPECT_CORRECT_FLAG; - idx = idx+1; - - options{idx, 1} = 'SLR'; - options{idx, 2} = SS_SLR_FLAG; - idx = idx+1; - - options{idx, 1} = 'Min Order'; - options{idx, 2} = SS_MIN_ORDER; - idx = idx+1; - - options{idx, 1} = 'B1 Verse'; - options{idx, 2} = SS_VERSE_B1; - idx = idx+1; - - options{idx, 1} = 'Slew Penalty'; - options{idx, 2} = SS_SLEW_PENALTY; - idx = idx+1; - - diff --git a/RF_pulses/spectral_spatial/ss_plot.m b/RF_pulses/spectral_spatial/ss_plot.m deleted file mode 100644 index 29a0e65..0000000 --- a/RF_pulses/spectral_spatial/ss_plot.m +++ /dev/null @@ -1,267 +0,0 @@ -function [f,z,m] = ss_plot(g, rf, samp, ptype, fov, bw, gamma, fplot, isodelay) -% SS_PLOT - Plot performance of spectral-spatial -% -% function [f,z,m] = ss_plot(g, rf, samp, [ptype], [fov], [bw], [gamma], -% [fplot], [isodelay]) -% -% INPUTS -% g - gradient in G/cm -% rf - RF in G -% samp - sample period in s -% [ptype] - pulse type: 'ex', 'se', 'sat', 'inv' -% [fov] - Spatial fov in cm to plot -% [bw] - Spectral bw in Hz to plot -% [gamma] - Gamma to be used, Default:4257 -% [fplot] - frequencies to plot spatial profiles -% [isodelay] - Unwind spectral phase shift for given isodelay - default: 0 -% -% OUTPUTS -% f - frequency points plotted (Hz) -% z - spatial points plotted (cm) -% m - simulated magnetization -% -% If optional parameters [] are set to empty matrices, -% it attempts to estimate reasonable values -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - % Some defines - % - NPLOT = 100; % Number plot points - - if nargin < 3, - error(['Usage: ss_plot(g, rf, samp, [ptype], [fov], [bw], [gamma],' ... - ' [fp], [fs])']); - end; - - if ~isreal(g), - error('Only works with 1-D gradient'); - end; - - if length(g) ~= length(rf), - error('RF and gradient must be same length'); - end; - g = g(:); - rf = rf(:); - - % Check ptype - if ( (nargin < 4) || isempty(ptype) ), - ptype = 'ex'; - else - switch ptype, - case {'ex', 'se', 'sat', 'inv'} - otherwise - error(sprintf(['SS_PLOT: pulse type (ptype) of: %s not' ... - ' recognized'], ptype)); - end; - end - - if ( (nargin < 5) || isempty(fov)) - fov = 4.0; - end - - if ( (nargin < 6) || isempty(bw) ), - % Take Fourier transform of gradient and find peak - % component - g_fft = fft(g); - res = length(g); - res_d2 = fix(res/2); - [mxval, idx] = max(abs(g_fft(1:res_d2))); - freq_peak = 1/samp * idx/length(g); - - % Plot will be from -bw/2:bw/2 - % - bwidth = round(4 * freq_peak / 100) * 100; - bw = [-bwidth/2 bwidth/2]; - elseif length(bw) == 1 - bw = [-bw/2 bw/2]; - end - - if ( (nargin < 5) || isempty(fov) ), - % Estimate FOV to plot from k-space swing - % - kz = cumsum(gamma * g * samp); - kz_peak = (max(kz) - min(kz))/2; - fov = ceil(16 / kz_peak); - end; - - if ( (nargin < 7) || isempty(gamma) ), - gamma = 4257; - end; - - if ( (nargin < 9) || isempty(isodelay) ), - isodelay = 0; - end; - - - - - % Get x and y vectors for abr - % - dbw = diff(bw) / (NPLOT-1); - f = [bw(1):dbw:bw(2)]; - - dfov = fov / (NPLOT-1); - z = [-fov/2:dfov:fov/2]; - - % Convert RF to a rotation in radians - % - rf_rot = 2 * pi * gamma * rf(:) * samp; - - % Build gradient that gives rotation - % in radians when scaled by "f" (off-resonance in Hz) - % - gf_rot = 2 * pi * samp * ones(size(g(:))); - - % Convert gradient to a rotation in radians - % when scaled by "z" - % - gz_rot = 2 * pi * gamma * g(:) * samp; - - % Add single samples at end of all waveforms to account for isodelay correction - % - rf_rot = [rf_rot;0]; - gf_rot = [gf_rot;(-2 * pi * isodelay)]; - gz_rot = [gz_rot;0]; - - % Get Mxy now - % - m = calc_mag(rf_rot, gz_rot+i*gf_rot, z, f, ptype); - - % Make plots now - % - figure; - - % RF - % - t = [0:length(g)-1] * samp * 1e3; - subplot(411); - plot(t,abs(rf), 'r-'); - hold on; - plot(t,real(rf),'b--'); - hold on; - plot(t,imag(rf), 'g--'); - title('RF Envelope - I/Q'); - ylabel('(Gauss)'); - xlabel('Time [ms]'); - - % Gradient - % - subplot(412); - plot(t,g,'b-'); - title('Excitation Gradient'); - ylabel('[G/cm]'); - xlabel('Time [ms]'); - - switch ptype - case {'ex', 'se'} - % abs(Mxy) - % - subplot(4,3,7); - imagesc(f,z,abs(m)); - colormap(gray) - xlabel('Frequency [Hz]'); - ylabel('Position [cm]'); - title('Magnitude M_{xy}') - - % Angle(Mxy) - % - subplot(4,3,8); - imagesc(f,z,angle(m)); - xlabel('Frequency [Hz]'); - ylabel('Position [cm]'); - title('Phase M_{xy}'); - case {'inv', 'sat'} - % Mz - subplot(4,3,[7,8]); - imagesc(f,z,m); - colormap(gray) - xlabel('Frequency [Hz]'); - ylabel('Position [cm]'); - title('M_{z}') - end - - % Spectral plot at z = 0 - % - subplot(4,3,9); - dbw_fine = diff(bw)/499; - f_fine = [bw(1):dbw_fine:bw(2)]; - m_center = calc_mag(rf_rot,gz_rot+i*gf_rot, 0, f_fine,ptype); - plot_mag(f_fine, m_center, ptype); - xlabel('Frequency [Hz]'); - title(sprintf('Spectral Profile - Z = 0')); - - - % Passband/Stopband plots - % - if (nargin < 8) || isempty(f), - % Sort frequency from 0 out - [tmp idx] = sort(abs(f)); - fsort = f(idx); - - % Get spectral profile - m_z0 = calc_mag(rf_rot,gz_rot+i*gf_rot, 0, fsort,ptype); - - % Find maximum closest to 0 frequency - [mval idx] = max(abs(m_z0)); - fplot = fsort(idx); - end; - - nplot = length(fplot); - for idx = 1:nplot, - subplot(4,nplot,3*nplot + idx); - m_f = calc_mag(rf_rot,gz_rot+i*gf_rot, z, fplot(idx),ptype); - plot_mag(z,m_f,ptype); - title(sprintf('Spatial Profile - Freq = %5.1f', fplot(idx))); - xlabel('Position [cm]'); - end; - -end - -% Helper functions to avoid lots of "switch" statements - -function M = calc_mag(rfs, gs, z, f, ptype) - -[a,b] = abr(rfs,gs, z, f); -switch ptype - case 'ex' - M = ab2ex(a,b); - case 'inv' - M = ab2inv(a,b); - case 'sat' - M = ab2sat(a,b); - case 'se' - M = ab2se(a, b); -end - -end - -function plot_mag(x, M, ptype) - -switch ptype - case {'ex', 'se'} - plot(x,abs(M), 'r-',x,real(M),'b--', x,imag(M), 'g--'); - grid; - ylabel('M_{xy}'); - case {'inv', 'sat'} - plot(x,M, 'b-'); - grid; - ylabel('M_{z}'); -end - -end \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_response_mxy.m b/RF_pulses/spectral_spatial/ss_response_mxy.m deleted file mode 100644 index db2ed0d..0000000 --- a/RF_pulses/spectral_spatial/ss_response_mxy.m +++ /dev/null @@ -1,67 +0,0 @@ -function mxy = ss_response_mxy(g,rf,z,f,ts,gamma, isodelay) -% SS_RESPONSE_MXY - Get Mxy response at given z, f position/frequency -% -% mxy = ss_response_mxy(g,rf,z,f,ts,gamma) -% -% Input -% g - gradient, G/cm -% rf - rf G -% z - cm -% f - frequency -% ts - sampling time (s) -% gamma - gyromagnetic ratio -% [isodelay] - Unwind spectral phase shift for given isodelay - default: 0 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% $Header: /home/adam/cvsroot/src/ss/ss_response_mxy.m,v 1.6 2013/08/15 03:34:50 adam Exp $ -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - if ( (nargin < 7) || isempty(isodelay) ), - isodelay = 0; - end; - - % Convert RF to a rotation in radians - % - rf_rot = 2 * pi * gamma * rf(:) * ts; - - % Build gradient that gives rotation - % in radians when scaled by "f" (off-resonance in Hz) - % - gf_rot = 2 * pi * ts * ones(size(g(:))); - - % Convert gradient to a rotation in radians - % when scaled by "z" - % - gz_rot = 2 * pi * gamma * g(:) * ts; - - % Add single samples at end of all waveforms to account for isodelay correction - % - rf_rot = [rf_rot;0]; - gf_rot = [gf_rot;(-2 * pi * isodelay)]; - gz_rot = [gz_rot;0]; - - - % Get Mxy now - % - [a b] = abr(rf_rot, gz_rot+i*gf_rot, z, f); - mxy = ab2ex(a, b); - - - - - diff --git a/RF_pulses/spectral_spatial/ss_save.m b/RF_pulses/spectral_spatial/ss_save.m deleted file mode 100644 index 96fb404..0000000 --- a/RF_pulses/spectral_spatial/ss_save.m +++ /dev/null @@ -1,236 +0,0 @@ -function ss_save(g,rf,ang,thk, isodelay, format, fspec, a_angs) -% SS_SAVE - Save spectral-spatial pulse -% Uses Chuck Cunningham's format for GE systems, and creates associated -% .dat-file -% Pulse parameters saved in header for Varian fules -% -% ss_save(g,rf,ang,thk, isodelay, format, fspec, a_angs) -% -% g - in G/cm -% rf - in G -% ang - flip angle in radians -% thk - thickness in cm -% isodelay (optional) - delay from in-phase point to end of pulse (GE -% definition) -% format (optional) - 'GE' (default), 'Varian' -% fspec (optional) - frequency bands (Hz) to write in file -% a_angs (optional) - band amplidutes (radians) to write in file - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -ss_globals; - -if (nargin < 5) || isempty(isodelay) - isodelay = length(rf)*SS_TS/ 2; -end - -if (nargin < 6) || isempty(format) - format = 'GE'; -else - switch format, - case {'GE', 'Varian'} - otherwise - error(sprintf(['Format save type of: %s not' ... - ' recognized'], format)); - end; -end - - maxg = max(abs(g)); - if maxg ~= 0, - gn = g/maxg; - else - gn = g; - end; - - maxrf = max(abs(rf)); - rfn = rf / maxrf; - - root_fname = input('Root file name: (leave empty to not save) ', 's'); - if isempty(root_fname) - fprintf(1,'Not saving files \n'); - return; - end; - - % calculate pulse parameters - nrf = length(rf); - abswidth = sum(abs(rfn))/nrf; - effwidth = sum(abs(rfn).^2)/nrf; - area = sum(abs(rfn))/nrf; - pon = (rfn >= 0.00001); - temp_pw = 0; - max_pw = 0; - for n=1:nrf - temp_pw = temp_pw + pon(n); - if (and(pon(n) == 0, temp_pw ~= 0)) - max_pw = max(max_pw, temp_pw); - temp_pw = 0; - end; - end; - max_pw = max_pw / n; - - dty_cyc = sum(abs(rfn) > 0.2236)/nrf; - if dty_cyc < max_pw, - dty_cyc = max_pw; - end; - - max_b1 = max(abs(rf)); - int_b1_sqr = sum(abs(rf).^2 * SS_TS * 1e3); - rms_b1 = sqrt(sum(abs(rf).^2))/nrf; - thk_scale = thk * SS_GAMMA / SS_GAMMA_HYDROGEN * 10; - - - % Allow magnitude of RF to go negative, this will - % help reduce sensitivity to theta modulation since - % there is a possible delay on the system for this case - % - - % Find pi jumps in phase and remove - % Do this by doubling phase and unwrapping 2*pi jumps - % - dang_rf = 2*angle(rfn); - dang_rf = dang_rf - dang_rf(1); - dang_rf = unwrap(dang_rf, 0.98*pi); - ang_rf = mod(dang_rf/2+pi,2*pi)-pi; - - mag_rf = real(rfn .* exp(-i*ang_rf)); - - if 1, - figure; - subplot(211) - t = 1:length(rf); - plot(abs(rf)); - hold on; - plot(maxrf*mag_rf,'r--') - - subplot(212); - plot(real(rf)); - hold on; - plot(imag(rf), 'b--'); - plot(real(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); - plot(imag(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); - end; - - - - switch (format) - case 'GE' - - dat_name = sprintf('%s.dat', root_fname); - fid = fopen(dat_name, 'w'); - if fid == -1, - fprintf(1, 'Error opening %s \n', dat_name); - return; - end; - - fprintf(fid,'%10d \t\t #Spectral-Spatial\n', 1); - fprintf(fid,'%10d \t\t #res\n', length(rf)); - fprintf(fid,'%10d \t\t #pw\n',round(length(rf)*SS_TS*1e6)); - fprintf(fid,'%10.7f \t\t #nom_flip \n',ang*180/pi); - fprintf(fid,'%10.7f \t\t #abswidth \n',abswidth); - fprintf(fid,'%10.7f \t\t #effwidth \n',effwidth); - fprintf(fid,'%10.7f \t\t #area \n',area); - fprintf(fid,'%10.7f \t\t #dtycyc \n',dty_cyc); - fprintf(fid,'%10.7f \t\t #maxpw \n',max_pw); - gamscale = SS_GAMMA/SS_GAMMA_HYDROGEN; % GE assumes max B1 is for application at 1H - fprintf(fid,'%10.7f \t\t #max_b1 \n',max_b1 * gamscale); - fprintf(fid,'%10.7f \t\t #max_int_b1_sqr \n',int_b1_sqr* gamscale^2); - fprintf(fid,'%10.7f \t\t #max_rms_b1 \n',rms_b1* gamscale^2); - fprintf(fid,'%10.3f \t\t #a_gzs \n',maxg); - fprintf(fid,'%10.3f \t\t #nom_thk(mm) \n',thk * gamscale * 10); - fprintf(fid,'%10d \t\t #isodelay\n',round(isodelay*1e6)); - fprintf(fid,'%10d \t\t #g_pow \n',0); - fprintf(fid,'%10d \t\t #g_pos_pow \n',0); - fprintf(fid,'%10d \t\t #g_neg_pow \n',0); - fprintf(fid,'%10d \t\t #g_abs \n',0); - fprintf(fid,'%10d \t\t #g_dgdt \n',0); - fprintf(fid,'%10d \t\t #g_pwm \n',0); - fprintf(fid,'%10d \t\t #g_pwm_abs \n',0); - fprintf(fid,'# *************************************\n'); - if (nargin == 7) - for b = 1:length(a_angs) - fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... - b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); - end - end - - fclose(fid); - - % Now write out RF and Gradient - % - rho_fname = sprintf('%s.rho', root_fname); - signa(mag_rf,rho_fname,1); - - theta_fname = sprintf('%s.pha', root_fname); - signa(-ang_rf,theta_fname,1/pi); - - g_fname = sprintf('%s.grd', root_fname); - signa(gn,g_fname,1); - - case 'Varian' - - fid = fopen(sprintf('%s.RF', root_fname),'wt'); - fprintf(fid,'# %s\n', sprintf('%s.RF', root_fname)); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'# Spectral-spatial Matlab Package\n'); - fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); - fprintf(fid,'# Duration = %d us\n',round(length(rf)*SS_TS*1e6)); - fprintf(fid,'# Isodelay = %d us\n',round(isodelay*1e6)); - fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); - fprintf(fid,'# Flip = %.2f degrees\n',ang*180/pi); - fprintf(fid,'# Max B1 = %.4f Gauss\n',max_b1); - if (nargin == 7) - for b = 1:length(a_angs) - fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... - b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); - end - end - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'# VERSION Matlab\n'); - fprintf(fid,'# TYPE selective\n'); - fprintf(fid,'# MODULATION amplitude\n'); - fprintf(fid,'# EXCITEWIDTH -1.0000\n'); - fprintf(fid,'# INVERTWIDTH -1.0000\n'); - fprintf(fid,'# INTEGRAL %1.4f\n', sum(abs(rfn))/length(rfn)); - fprintf(fid,'# RF_FRACTION -1.0000\n'); - fprintf(fid,'# STEPS %d\n',length(rfn)); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'%3.2f %4.2f 1.0\n',[-angle(rfn(:)).'*180/pi; 1023*abs(rfn(:)).']); - fclose(fid); - - fid = fopen(sprintf('%s.GRD', root_fname),'wt'); - fprintf(fid,'# %s\n', sprintf('%s.GRD', root_fname)); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'# Spectral-spatial Matlab Package\n'); - fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); - fprintf(fid,'# Duration = %d us\n',round(length(g)*SS_TS*1e6)); - fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); - fprintf(fid,'# Points = %d\n',length(g)); - fprintf(fid,'# Max Gradient Strength = %.4f Gauss/cm\n',maxg); - fprintf(fid,'# (Max Gradient Strength Constraint = %.2f Gauss/cm)\n',SS_MXG); - fprintf(fid,'# Max Slew Rate = %.2f Gauss/cm/ms\n',SS_MXS); - fprintf(fid,'# Slice thickness = %.1f mm\n',thk*10); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'%d 1\n',round(32767*gn)); - fclose(fid); - - end - - - - - - \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_save_dyn.m b/RF_pulses/spectral_spatial/ss_save_dyn.m deleted file mode 100644 index 5396656..0000000 --- a/RF_pulses/spectral_spatial/ss_save_dyn.m +++ /dev/null @@ -1,232 +0,0 @@ -function ss_save_dyn(g,rf,ang,thk, isodelay, format, fspec, a_angs, root_fname, pulse_num) -% SS_SAVE - Save spectral-spatial pulse -% Uses Chuck Cunningham's format for GE systems, and creates associated -% .dat-file -% Pulse parameters saved in header for Varian fules -% -% ss_save_dyn(g,rf,ang,thk, format, fspec, a_angs, root_fname, pulse_num) -% -% g - in G/cm -% rf - in G -% ang - flip angle in radians -% thk - thickness in cm -% isodelay (optional) - delay from in-phase point to end of pulse (GE -% definition) -% format (optional) - 'GE' (default), 'Varian' -% fspec (optional) - frequency bands (Hz) to write in file -% a_angs (optional) - band amplidutes (radians) to write in file -% root_fname - root file name (no prompting) -% pulse_num - pulse number - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -ss_globals; - -if (nargin < 5) || isempty(isodelay) - isodelay = length(rf)*SS_TS/ 2; -end - -if (nargin < 6) || isempty(format) - format = 'GE'; -else - switch format, - case {'GE', 'Varian'} - otherwise - error(sprintf(['Format save type of: %s not' ... - ' recognized'], format)); - end; -end - - maxg = max(abs(g)); - if maxg ~= 0, - gn = g/maxg; - else - gn = g; - end; - - maxrf = max(abs(rf)); - rfn = rf / maxrf; - - - % calculate pulse parameters - nrf = length(rf); - abswidth = sum(abs(rfn))/nrf; - effwidth = sum(abs(rfn).^2)/nrf; - area = sum(abs(rfn))/nrf; - pon = (rfn >= 0.00001); - temp_pw = 0; - max_pw = 0; - for n=1:nrf - temp_pw = temp_pw + pon(n); - if (and(pon(n) == 0, temp_pw ~= 0)) - max_pw = max(max_pw, temp_pw); - temp_pw = 0; - end; - end; - max_pw = max_pw / n; - - dty_cyc = sum(abs(rfn) > 0.2236)/nrf; - if dty_cyc < max_pw, - dty_cyc = max_pw; - end; - - max_b1 = max(abs(rf)); - int_b1_sqr = sum(abs(rf).^2 * SS_TS * 1e3); - rms_b1 = sqrt(sum(abs(rf).^2))/nrf; - thk_scale = thk * SS_GAMMA / SS_GAMMA_HYDROGEN * 10; - - - % Allow magnitude of RF to go negative, this will - % help reduce sensitivity to theta modulation since - % there is a possible delay on the system for this case - % - - % Find pi jumps in phase and remove - % Do this by doubling phase and unwrapping 2*pi jumps - % - dang_rf = 2*angle(rfn); - dang_rf = dang_rf - dang_rf(1); - dang_rf = unwrap(dang_rf, 0.98*pi); - ang_rf = mod(dang_rf/2+pi,2*pi)-pi; - - mag_rf = real(rfn .* exp(-i*ang_rf)); - -% if 1, -% figure; -% subplot(211) -% t = 1:length(rf); -% plot(abs(rf)); -% hold on; -% plot(maxrf*mag_rf,'r--') -% -% subplot(212); -% plot(real(rf)); -% hold on; -% plot(imag(rf), 'b--'); -% plot(real(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); -% plot(imag(maxrf*mag_rf.*exp(i*ang_rf)), 'r:'); -% end; - - - - switch (format) - case 'GE' - - dat_name = sprintf('%s%03d.dat', root_fname, pulse_num); - fid = fopen(dat_name, 'w'); - if fid == -1, - fprintf(1, 'Error opening %s \n', dat_name); - return; - end; - - fprintf(fid,'%10d \t\t #Spectral-Spatial\n', 1); - fprintf(fid,'%10d \t\t #res\n', length(rf)); - fprintf(fid,'%10d \t\t #pw\n',round(length(rf)*SS_TS*1e6)); - fprintf(fid,'%10.7f \t\t #nom_flip \n',ang*180/pi); - fprintf(fid,'%10.7f \t\t #abswidth \n',abswidth); - fprintf(fid,'%10.7f \t\t #effwidth \n',effwidth); - fprintf(fid,'%10.7f \t\t #area \n',area); - fprintf(fid,'%10.7f \t\t #dtycyc \n',dty_cyc); - fprintf(fid,'%10.7f \t\t #maxpw \n',max_pw); - gamscale = SS_GAMMA/SS_GAMMA_HYDROGEN; % GE assumes max B1 is for application at 1H - fprintf(fid,'%10.7f \t\t #max_b1 \n',max_b1 * gamscale); - fprintf(fid,'%10.7f \t\t #max_int_b1_sqr \n',int_b1_sqr* gamscale^2); - fprintf(fid,'%10.7f \t\t #max_rms_b1 \n',rms_b1* gamscale^2); - fprintf(fid,'%10.3f \t\t #a_gzs \n',maxg); - fprintf(fid,'%10.3f \t\t #nom_thk(mm) \n',thk * gamscale * 10); - fprintf(fid,'%10d \t\t #isodelay\n',round(isodelay*1e6)); - fprintf(fid,'%10d \t\t #g_pow \n',0); - fprintf(fid,'%10d \t\t #g_pos_pow \n',0); - fprintf(fid,'%10d \t\t #g_neg_pow \n',0); - fprintf(fid,'%10d \t\t #g_abs \n',0); - fprintf(fid,'%10d \t\t #g_dgdt \n',0); - fprintf(fid,'%10d \t\t #g_pwm \n',0); - fprintf(fid,'%10d \t\t #g_pwm_abs \n',0); - fprintf(fid,'# *************************************\n'); - if (nargin == 7) - for b = 1:length(a_angs) - fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... - b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); - end - end - - fclose(fid); - - % Now write out RF and Gradient - % - rho_fname = sprintf('%s%03d.rho', root_fname, pulse_num); - signa(mag_rf,rho_fname,1); - - theta_fname = sprintf('%s%03d.pha', root_fname, pulse_num); - signa(-ang_rf,theta_fname,1/pi); - - g_fname = sprintf('%s%03d.grd', root_fname, pulse_num); - signa(gn,g_fname,1); - - case 'Varian' - - fid = fopen(sprintf('%s%03d.RF', root_fname, pulse_num),'wt'); - fprintf(fid,'# %s\n', sprintf('%s%03d.RF', root_fname, pulse_num)); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'# Spectral-spatial Matlab Package\n'); - fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); - fprintf(fid,'# Duration = %d us\n',round(length(rf)*SS_TS*1e6)); - fprintf(fid,'# Isodelay = %d us\n',round(isodelay*1e6)); - fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); - fprintf(fid,'# Flip = %.2f degrees\n',ang*180/pi); - fprintf(fid,'# Max B1 = %.4f Gauss\n',max_b1); - if (nargin == 7) - for b = 1:length(a_angs) - fprintf(fid,'# Band %d: [%.2f, %.2f] Hz, %.2f degree flip\n', ... - b, fspec(2*b-1), fspec(2*b), a_angs(b)*180/pi); - end - end - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'# VERSION Matlab\n'); - fprintf(fid,'# TYPE selective\n'); - fprintf(fid,'# MODULATION amplitude\n'); - fprintf(fid,'# EXCITEWIDTH -1.0000\n'); - fprintf(fid,'# INVERTWIDTH -1.0000\n'); - fprintf(fid,'# INTEGRAL %1.4f\n', sum(abs(rfn))/length(rfn)); - fprintf(fid,'# RF_FRACTION -1.0000\n'); - fprintf(fid,'# STEPS %d\n',length(rfn)); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'%3.2f %4.2f 1.0\n',[-angle(rfn(:)).'*180/pi; 1023*abs(rfn(:)).']); - fclose(fid); - - fid = fopen(sprintf('%s%03d.GRD', root_fname, pulse_num),'wt'); - fprintf(fid,'# %s\n', sprintf('%s.GRD', root_fname)); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'# Spectral-spatial Matlab Package\n'); - fprintf(fid,'# Nucleus = %s\n',SS_NUCLEUS); - fprintf(fid,'# Duration = %d us\n',round(length(g)*SS_TS*1e6)); - fprintf(fid,'# Resolution = %d us\n', SS_TS*1e6); - fprintf(fid,'# Points = %d\n',length(g)); - fprintf(fid,'# Max Gradient Strength = %.4f Gauss/cm\n',maxg); - fprintf(fid,'# (Max Gradient Strength Constraint = %.2f Gauss/cm)\n',SS_MXG); - fprintf(fid,'# Max Slew Rate = %.2f Gauss/cm/ms\n',SS_MXS); - fprintf(fid,'# Slice thickness = %.1f mm\n',thk*10); - fprintf(fid,'# ***************************************************\n'); - fprintf(fid,'%d 1\n',round(32767*gn)); - fclose(fid); - - end - - - - - - \ No newline at end of file diff --git a/RF_pulses/spectral_spatial/ss_spect_correct.m b/RF_pulses/spectral_spatial/ss_spect_correct.m deleted file mode 100644 index dad8961..0000000 --- a/RF_pulses/spectral_spatial/ss_spect_correct.m +++ /dev/null @@ -1,332 +0,0 @@ -function rfm = ss_spect_correct(b, bsf, Nper, Noff, f, ptype, ss_type, slr, ... - dbg) -% SS_SPECT_CORRECT - Correct spectral filter for irregular sampling -% -% function rf = ss_spect_correct(b, bsf, Nper, Noff, f, ptype, ss_type, slr, dbg) -% -% Inputs: -% b - spectral filter design, normalized so that passband has value of 1 -% bsf - beta polynomial scale factors (normally sin(ang/2)) -% Nper - period in samples between taps of b -% Noff - vector of sample offsets from reference point (may be fractional) -% f - Normalized frequency bands to try to correct - may be outside Nyquist (-1..1) -% ptype - type of pulse, 'ex', 'se', 'sat, 'inv' -% ss_type - 'Flyback' or 'EP' -% slr - SLR flag -% -% Outputs: -% rf - rf taps to give desired tip -% -% It is assumed that the first gradient lobe is a positive one, -% -% If a "Flyback" ss_type is specified, then filter taps will all -% be moving forward together by "n" units. With minimum-phase filters -% it is best to use the spectral filter reference for the first tap -% then move forward. -% -% If a "EP" ss_type is specified, then filter taps will be moving -% alternately forward/backward by "n" units. The reference should -% be the midpoint of the spectral lobes. -% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)2007-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% This method is also described in: -% (1) C.H. Cunningham, D.B. Vigneron, A.P. Chen, D. Xu, M. Lustig, D.A. Kelley, -% J.M. Pauly, Spectral?spatial excitation and refocusing for reduced volume -% mis- registration at 7 Tesla, in: Proceedings of the 14th Annual Meeting -% of ISMRM, Seattle, 2006, p. 72. -% (2) C.H. Cunningham, A.P. Chen, M. Lustig, J. Lupo, D. Xu, J. Kurhanewicz, -% R.E. Hurd, J.M. Pauly, S.J. Nelson, D.B. Vigneron, Pulse sequence for -% dynamic volumetric imaging of hyperpolarized metabolic products, J. Magn. -% Reson. 193 (1) (2008) 139?146. - - -% Error checking on inputs - % - if nargin < 7, - error('Usage: ss_spect_correct(b, bsf, N, n, f, ptype, ss_type, dbg)'); - end; - - if nargin < 8, - dbg = 0; - end; - - switch ss_type, - case {'Flyback', 'EP'} - otherwise - error('ss_type must be ''Flyback'' or ''EP'''); - end; - - if length(bsf) ~= length(Noff), - error('bsf / offset vectors not same length'); - end; - nfilt = length(bsf); - - % Calculate sampling positions of ref filter taps - % - N = length(b); - t_ref = [0:N-1]; - - % Get sampling in pass/stopbands - % ensuring that mult_factor*N samples exist - % - mult_factor = 15; - fdiff = diff(f); - fsum = sum(fdiff(1:2:end)); % frequency range that is sampled - df = fsum/(mult_factor*N); - - nband = length(f)/2; - if strcmp(ss_type, 'Flyback'), - w = linspace(-pi, pi, 2*mult_factor*N); - else - w = []; - for band = 1:nband, - nf = ceil((f(band*2)-f(band*2-1))/df) + 1; - df_act = (f(band*2)-f(band*2-1))/(nf-1); - wband = f(band*2-1) + [0:nf-1]*df_act; - w = [w pi*wband]; - end; - end; - - % Plot w sampling - % - if (dbg >= 2), % Verbose - figure; - subplot(2,1,1); - plot(w/pi,ones(length(w)),'bx'); - hold on; - for band = 1:nband, - plot(f(band*2-1)*ones(1,2), [0 1], 'r'); - plot(f(band*2)*ones(1,2), [0 1], 'r'); - end; - title('Band Sampling'); - xlabel('Normalized Frequency'); - axis([min(w/pi) max(w/pi) -0.2 1.2]); - - [h_freq,freq] = freqz(b,1,[min(w/pi):0.005:max(w/pi)],2); - - subplot(2,1,2); - plot(freq,abs(h_freq)); - title('Frequency Response'); - xlabel('Normalized Frequency'); - axis([min(w/pi) max(w/pi) -0.2 1.2]); - end; - - - % Calculate spectral filter corrections - % - if (dbg >= 2), - filt_fig = figure; - end; - - % Get reference transform - % - Wref = exp(-i*kron(w', t_ref)); - Fref = Wref * b(:); - - for idx = 1:nfilt, - % Get actual sampling positions - % - switch (ss_type), - case 'Flyback', - t_act = t_ref + Noff(idx)/Nper; - case 'EP', - t_act = t_ref + (Noff(idx)/Nper * (-1).^[0:N-1]); - end; - - if (dbg >= 2) - figure(filt_fig); - subplot(411); - stem([t_ref.' t_act.'], ones(length(t_ref),2)); - legend('Reference', 'Actual'); - title('Sampling Locations'); - end; - - switch (ss_type) - case 'Flyback' - % Get actual - % - Wact = exp(-i*kron(w', t_act)); - - % Get least-squares fit to filter - % - type = 0; - switch(type) - case 0 - % Add regularization to this problem - % - Wact_pinv = pinv(Wact); - bm(:,idx) = Wact_pinv * Fref; - %bm(:,idx) = inv(Wact'*Wact + 1e-4*eye(size(Wact,2)))*Wact'*Fref; - case 1 - % Do constrained least-squares - best option, but slow - % Could be sped up using pdco - % - bm(:,idx) = lscon(Wact, Fref(:), 0, 1.2*max(abs(b)), b(:), 0); - case 2 - % pdco option - % - c = 1; - pdco_options = pdcoSet; - d1 = 1e-6; - d2 = 1; - x0 = b(:); - y0 = zeros(size(Wact,1),1); - z0 = ones(size(Wact,2),1); - xsize = mean(abs(b)); - zsize = 1; - bm(:,idx) = pdco(c, Wact, Fref(:), -1.2*max(abs(b)), 1.2*max(abs(b)), ... - d1, d2, pdco_options, x0, y0, z0, xsize,zsize,1); - end; - - if 0 - figure; - Fref_fix = Wact * bm(:,idx); - plot(w/pi,abs(Fref_fix)); - pause; - end; - - % Since samples are still uniform, we can - % just use SLR to get rf - % - if slr, - rfm(:,idx) = b2rf(bsf(idx) * bm(:,idx)); - else - rfm(:,idx) = 2*asin(abs(bsf(idx))) * conj(bm(:,idx)); - end; - case 'EP' - % Get actual - % - Wact = exp(-i*kron(w', t_act)); - - % Get least-squares fit to filter - % - Wact_pinv = pinv(Wact); - bm(:,idx) = Wact_pinv * Fref; - - % Can't do SLR yet - % - if slr, - rfm(:,idx) = 2*asin(abs(bsf(idx)))*conj(bm(:,idx)); - else - rfm(:,idx) = 2*asin(abs(bsf(idx))) * bm(:,idx); - end; - end; - - if ( (dbg >= 2) && (rem(idx,10)==0) ), - figure(filt_fig); - show_M = 0; - plot_db = 0; - if show_M, - rf_ref = b2rf(bsf(round(end/2)) * b(:)); - subplot(412); - hold off; - plot(abs(rf_ref),'b-'); - hold on; - plot(abs(rfm(:,idx)),'r--'); - - % Fill in large time indices with RF - % - t_ref_x = Nper + t_ref*Nper; - t_act_x = Nper + round(t_act*Nper); - - % Fill in large (mostly zero) arrays with RF - % - rf_ref_x = zeros(1,(N+2)*Nper); - rf_ref_x(t_ref_x) = rf_ref; - - rf_act_x = zeros(1,(N+2)*Nper); - rf_act_x(t_act_x) = rf_ref; - - rf_actfix_x = zeros(1,(N+2)*Nper); - rf_actfix_x(t_act_x) = rfm(:,idx); - - % Now determine M - % - g = pi * ones(length(rf_ref_x)); - Mref = ab2ex(abr(rf_ref_x, g, w/pi)); - Mact = ab2ex(abr(rf_act_x, g, w/pi)); - Mactfix = ab2ex(abr(rf_actfix_x, g, w/pi)); - subplot(413); - if plot_db, - hold off; - plot(w/pi,20*log10(abs(Mref)),'b'); - hold on; - plot(w/pi,20*log10(abs(Mactfix)),'r--'); - plot(w/pi,20*log10(abs(Mact)),'g--'); - ylabel('DB Scale'); - else - hold off; - plot(w/pi,abs(Mref),'b'); - hold on; - plot(w/pi,abs(Mactfix),'r--'); - plot(w/pi,abs(Mact),'g--'); - ylabel('Linear Scale'); - end; - title('Magnitude Magnetization'); - - subplot(414); - hold off; - plot(w/pi,angle(Mref),'b'); - hold on; - plot(w/pi,angle(Mactfix),'r--'); - plot(w/pi,angle(Mact),'g--'); - title('Phase Magnetization'); - else, - Fact = Wact * b(:); - Fact_fix = Wact * bm(:,idx); - - subplot(4,1,2); - hold off; - plot(abs(b)); - hold on; - plot(abs(bm(:,idx)), 'r--'); - title('Beta Polynomials'); - - subplot(4,1,3); - if plot_db, - hold off; - plot(w/pi,20*log10(abs(Fref)),'b-'); - hold on; - plot(w/pi, 20*log10(abs(Fact)), 'g--'); - plot(w/pi, 20*log10(abs(Fact_fix)), 'r--'); - ylabel('DB Scale'); - else - hold off; - plot(w/pi,abs(Fref),'b-'); - hold on; - plot(w/pi, abs(Fact), 'g--'); - plot(w/pi, abs(Fact_fix), 'r--'); - ylabel('Linear Scale'); - end; - - title('Magnitude Response'); - - subplot(4,1,4); - hold off; - plot(w/pi,angle(Fref),'b-'); - hold on; - plot(w/pi,angle(Fact),'g--'); - plot(w/pi,angle(Fact_fix),'r--'); - title('Phase Response'); - end; - - fprintf(1,'Offset: %f -- Hit any key to continue\n', Noff(idx)); - pause; - end; - end; - diff --git a/RF_pulses/spectral_spatial/ss_verse.m b/RF_pulses/spectral_spatial/ss_verse.m deleted file mode 100644 index f8b5072..0000000 --- a/RF_pulses/spectral_spatial/ss_verse.m +++ /dev/null @@ -1,45 +0,0 @@ -% rfv = ss_verse(gv,rf) -% -% Computes the versed version of rf for a given time-vayring gradient gv - -% written by John Pauly, 1992 -% Bug fixes by Peder Larson, 2007 -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Spectral-Spatial RF Pulse Design for MRI and MRSI MATLAB Package -% -% Authors: Adam B. Kerr and Peder E. Z. Larson -% -% (c)1992-2011 Board of Trustees, Leland Stanford Junior University and -% The Regents of the University of California. -% All Rights Reserved. -% -% Please see the Copyright_Information and README files included with this -% package. All works derived from this package must be properly cited. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -function rfv = ss_verse(g,rf) - -[m n] = size(g); -if m Date: Tue, 1 Dec 2015 09:28:47 -0800 Subject: [PATCH 15/18] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cb589b0..15c8838 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # hyperpolarized-mri-toolbox -========================== The goal of this toolbox is to provide research-level and prototyping software tools for hyperpolarized MRI experiments. It is currently based on MATLAB code, and includes code for designing radiofrequency (RF) pulses, readout gradients, and data reconstruction. @@ -7,10 +6,10 @@ It is hosted on this open-source, collaborative platform in order to encourage a ## Additional Resources -More tools for hyperpolarized MRI RF pulse design are now in -(../Spectral-Spatial-RF-Pulse-Design) +More tools for hyperpolarized MRI RF pulse design are now in the +[Spectral-Spatial-RF-Pulse-Design toolbox](../Spectral-Spatial-RF-Pulse-Design) -For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/), which is also hosted on github (../../SIVICLab/sivic) +For enhanced data visualization tools, including optimized implementations of some data processing and reconstruction algorithms, see the Spectrscopic Imaging VIsualization and Computing (SIVIC) framework (https://sourceforge.net/projects/sivic/), which is also hosted on [github](../../SIVICLab/sivic) ## Support From d0bbfb6f550cc5c06a21b596166132ea5f8dafb1 Mon Sep 17 00:00:00 2001 From: agentmess Date: Tue, 17 May 2016 13:54:33 -0700 Subject: [PATCH 16/18] New kinetic model fitting function --- rf_tools/cplot.m | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rf_tools/cplot.m b/rf_tools/cplot.m index c1cf1eb..e5d55be 100644 --- a/rf_tools/cplot.m +++ b/rf_tools/cplot.m @@ -1,16 +1,23 @@ % -% cplot(x) - plot complex function; +% cplot([x,] y) - plot complex function; optional specification of x-axis % % written by John Pauly, 1989 +% modified by Peder Larson, 2006 % (c) Board of Trustees, Leland Stanford Junior University -function cplot(x) - -l = length(x); -t = [1:l]/(l+1); -plot(t,real(x),t,imag(x)); - +function cplot(x,y,s) +if nargin == 1 + y = x; + l = length(x); + x = [1:l]/(l+1); +end + +if nargin < 3 + plot(x,real(y),x,imag(y)); +elseif nargin == 3 + plot(x,real(y),s,x,imag(y),s); +end From 434c9e6f9db5084861d3d985516d2cfaacbba0b1 Mon Sep 17 00:00:00 2001 From: agentmess Date: Thu, 11 Jan 2018 22:50:02 -0800 Subject: [PATCH 17/18] Minor edit --- ss_plot.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ss_plot.m b/ss_plot.m index 29a0e65..ffff07b 100644 --- a/ss_plot.m +++ b/ss_plot.m @@ -227,7 +227,7 @@ subplot(4,nplot,3*nplot + idx); m_f = calc_mag(rf_rot,gz_rot+i*gf_rot, z, fplot(idx),ptype); plot_mag(z,m_f,ptype); - title(sprintf('Spatial Profile - Freq = %5.1f', fplot(idx))); + title(sprintf('%5.1f', fplot(idx))); xlabel('Position [cm]'); end; From 51a48a05183c71bc0245938612720948a479b2f6 Mon Sep 17 00:00:00 2001 From: agentmess Date: Tue, 16 Jan 2018 15:56:15 -0800 Subject: [PATCH 18/18] Minor edits --- create_freq_specs.m | 12 ++++++--- examples/demo_C13_singleband.m | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/create_freq_specs.m b/create_freq_specs.m index 9cf5997..088c618 100644 --- a/create_freq_specs.m +++ b/create_freq_specs.m @@ -1,8 +1,8 @@ -function [fspec, a_angs, d] = create_freq_specs(mets) +function [fspec, a_angs, d] = create_freq_specs(mets, fmid) % CREATE_FREQ_SPECS - Helper function for creating spectral-spatial % frequency specifications % -% [fspec, a_angs, d] = create_freq_specs(mets); +% [fspec, a_angs, d] = create_freq_specs(mets, fmid); % % INPUT % mets - structure containing: @@ -10,6 +10,7 @@ % mets(i).df - bandwidth of bands (Hz) % mets(i).ang - flip angle of bands (degress) % mets(i).d - ripple of bands (Mxy, default = .01) +% fmid [optional] - center frequency spec around fmid % % OUTPUT % spec, a_angs, d - inputs for ss_design() @@ -41,6 +42,9 @@ end end -% by default, center frequency specification -fmid = (mets(1).f+mets(end).f)/2; +if nargin < 2 || isempty(fmid) + % by default, center frequency specification + fmid = (min(fspec)+max(fspec))/2; +end + fspec = fspec - fmid; diff --git a/examples/demo_C13_singleband.m b/examples/demo_C13_singleband.m index 805c843..bb41ec5 100644 --- a/examples/demo_C13_singleband.m +++ b/examples/demo_C13_singleband.m @@ -105,3 +105,49 @@ ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... z_ftype, s_ftype, ss_type, fctr); set(gcf,'Name', '[1-13C]lac only for 14T animal system'); + +fprintf(1,'Hit any key to continue:\n'); +pause; + + +%% lactate-only pulse +fprintf(1, '\nFor studies including copolarized 13C-urea or a 13C-urea phantom\n'); +fprintf(1, 'Here''s a C13 single-band excitation pulse to excite only [1-13C]lactate\n'); +fprintf(1, 'while not exciting pyruvate, alanine and pyruvate-hydrate AND urea, for a 3T clinical system\n\n'); + +clear all; ss_opt([]); ss_globals; % Reset all options + +% GENERAL PULSE PARAMETERS +ss_type = 'EP Whole'; +ptype = 'ex'; % excitation pulse +opt = ss_opt({'Nucleus', 'Carbon', ... + 'Max Duration', 25e-3, ... + 'Spect Correct', 1}); + +% SPECTRAL PULSE PARAMETERS - large pass/stop bands chosen for wide +% supression regions +B0 = 3e4; % G +df = 0.5e-6 * B0 * SS_GAMMA; % 0.5 ppm = gamma_C13 * B0 * 0.5e-6 +% metabolite frequency (Hz) freq bandwidth (Hz) flip angle (deg) +mets(1).name = 'urea'; mets(1).f = -470; mets(1).df = 2*df; mets(1).ang = 0; +mets(2).name = 'pyr'; mets(2).f = -230; mets(2).df = 2*df; mets(2).ang = 0; +mets(3).name = 'ala'; mets(3).f = -45; mets(3).df = 3*df; mets(3).ang = 0; +mets(4).name = 'pyrh'; mets(4).f = 40; mets(4).df = 2*df; mets(4).ang = 0; +mets(5).name = 'lac'; mets(5).f = 165; mets(5).df = 2*df; mets(5).ang = 90; + +% create vectors of angles, ripples, and band edges for input to pulse design +[fspec, a_angs, d] = create_freq_specs(mets); +fctr = 0; % force pulse design to optimize for center of frequency specification +s_ftype = 'min'; % minimum-phase spectral filter + +% SPATIAL PULSE PARAMETERS +z_thk = 1; % thickness (cm) +z_tb = 4; % time-bandwidth, proportional to profile sharpness +z_ftype='ls'; % least-squares filter design +z_d1 = 0.01; z_d2 = 0.01; % slice profile pass and stop-band ripples, respectively + +% DESIGN THE PULSE! +[g,rf,fs,z,f,mxy] = ... + ss_design(z_thk, z_tb, [z_d1 z_d2], fspec, a_angs, d, ptype, ... + z_ftype, s_ftype, ss_type, fctr); +set(gcf,'Name', '[1-13C]lac only for 3T clinical system, avoiding urea');