OSCR

Group-Patch Joint Compression: Compressing Dynamic B<sub>0</sub> and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI.

Code ↔ Paper

10 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 10 matches
  1. [1] § Theory › Multidimensional Compressibility and Periodic Redundancy ↔ Recon/3D_CS_Wave_9T_RAM1T/Run_B0SENSE_recon.m, lines 107–140 · score 0.78 · variable density Poisson, phase encoded steps, receiver channels, disc, aliased, FFT
  2. [2] § Methods › Pulse Sequence and Data Acquisition ↔ Pulseq_sequence/writeWaveCAIPI.m, lines 47–93 · score 0.77 · dual ACS, retrospectively undersampled, Wave CAIPI, readout oversampling, strengths, phase encoding
  3. [3] § Methods › Two Data Compression Approaches ↔ Recon/2D_CS_LocalB0Coils_9T/Run_B0SENSE_recon.m, lines 44–70 · score 0.77 · local B0 coils, oversampled readout, modulation period, receiver channels, rapid B0 modulation, phase encoded
  4. [4] § Methods › Pulse Sequence and Data Acquisition ↔ Pulseq_sequence/writeWaveCAIPI.m, lines 47–93 · score 0.76 · slice oversampling, wave gradients, slice thickness, Wave CAIPI, 230, TE
  5. [5] § Methods › Pulse Sequence and Data Acquisition ↔ Recon/2D_CS_LocalB0Coils_9T/Run_B0SENSE_recon.m, lines 44–70 · score 0.76 · local B0 coil, B0 field modulations, readout oversampling, rapid B0 modulations, strengths, FLASH
  6. [6] § Methods › Two Data Compression Approaches ↔ Recon/3D_L2_WaveCAIPI_3T/Run_B0SENSE_recon.m, lines 206–256 · score 0.73 · RF sensitivity maps, composite encoding matrix, Wave CAIPI, modulation period, compression matrices, B0 modulation
  7. [7] § Methods › Two Image Reconstruction Algorithms ↔ Recon/3D_CS_Wave_9T_RAM1T/Run_B0SENSE_recon.m, lines 50–80 · score 0.66 · wavelet regularization, undersampling factor, compressed sensing, global, B0 modulation, thresholding
  8. [8] § Results › Visualization of Compressed Spatial Encoding Functions ↔ Recon/3D_L2_WaveCAIPI_3T/Run_B0SENSE_recon.m, lines 206–256 · score 0.66 · RF sensitivity maps, composite encoding, B0 modulation period, B0 encoding, joint compression, matrix
  9. [9] § Theory › From RF Array to Joint B0 ‐RF Compression ↔ Recon/2D_CS_LocalB0Coils_9T/Run_B0SENSE_recon.m, lines 175–222 · score 0.61 · composite spatial encoding, receiver channel, compression matrices, virtual, segmented, joint compression
  10. [10] § Results › RF‐Only Versus B0 ‐RF Compression for In Vivo 3D Scans at 9.4 T ↔ Recon/3D_L2_WaveCAIPI_3T/Run_B0SENSE_recon.m, lines 109–141 · score 0.61 · L2 Wave CAIPI, rapid B0 modulations, recon, compression factors, FLASH, joint compression

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

MATLAB · 529 lines · 19 KB · BSD-3-Clause · 3 matches

  1. %% Descriptions
  2. % This script is a basic demo of the joint compression technique
  3. % for 2D GRE data (2025-06-18, in-vivo, 9.4T human scanner with 8-channel local B0 coils)
  4. % with rapid B0 field modulation (readout oversampling),
  5. % and 32 RF receivers,
  6. % using compressed sensing reconstruction (FISTA).
  7. % For comparison, data with 4x RF array compression is also provided.
  8. % Please manually change the loaded data name to compare the speed.
  9. % In this implementation, the 2D readout encoding matrix is explicitly
  10. % written. This can be optimized by e.g., only writing readout encoding matrix
  11. % across a B0 modulation period, and reusing it for different periods, to
  12. % save memory. Nevertheless, this issue is not crucial for 2D.
  13. % Please cite the paper:
  14. % R.Tian, K.Scheffler, "Group-Patch Joint Compression: Compressing Dynamic B0 and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI," Magnetic Resonance in Medicine, (2026), https://doi.org/10.1002/mrm.70439.
  15. % See Supporting Information Figure S3 for this dataset.
  16. % For questions, please contact Rui Tian
  17. % ([email hidden]/[email hidden])
  18. %% Environment
  19. % Add ToolBox to the path, for FFT, Wavelet((c) Michael Lustig 2007), and TV((c) Michael Lustig 2007) functions
  20. addpath(genpath('./'))
  21. %% Load data and parameters
  22. load('data_param_2D_JCS.mat')
  23. % load('data_param_2D_RFcompression.mat')
  24. fprintf('\n');
  25. disp('Data Loaded.')
  26. % Fully-sampled k-space data: dat_exp[oversampled readout,phase-encoding,1,1,RF receivers]
  27. % Auto-calibrated B0 modulation maps: maps_B0Evo[oversampled readout,read pixel,phase pixel]
  28. % maps_SENSE[read pixel,phase pixel,1,1,RF receivers]
  29. % idx_z2D: slice number for multi-slice experiments
  30. % img_fg: mask
  31. % para: parameters
  32. %% Specify some local parameters
  33. % In this script, you may not need to tune these below
  34. nRO = para.nty_unOS; % readout k-space point number without oversampling
  35. nx = para.ntx; % phase encoding k-space point number
  36. nC = para.nC; % RF receiver channel number
  37. nOS = para.nyOS_flash; % readout oversampling factor
  38. idx_us_x = para.idx_usx; % undersampling factor along phase encoding
  39. nRecoPix_yx = para.nRecoPix_yx; % in-plane pixel number in recon grid
  40. nNgCh = para.nNgCh; % local B0 coil channel
  41. nMR = nRO*nOS; % readout k-space point number with oversampling
  42. nGridMR = nRecoPix_yx*nOS; % For recon grid, readout k-space point with oversampling
  43. bSENSE = para.bSENSE; % 1: using multiple RF receivers for joint sampling acceleration with SENSE
  44. bNgAcc = para.bNgAcc; % 1: rapid B0 field modulation ON
  45. bJointComp = para.bCompRF==2; % 1: Joint compression ON, 0: Joint compression OFF
  46. bNLReco = para.bNLReco; % 1: Compressed-sensing with L1 regularization is ON, as this script
  47. bWaThres = para.bWaThres; % 1: global wavelet threshold, 2: level-dependent wavelet threshold
  48. para.kperiod; % This is the sinusoidal period (45 oversampled readout points) of rapid B0 modulation for this dataset.
  49. % You might tune the following to change regularization strengths
  50. lambda_TV = para.lambda_TV; % coefficient for TV regularization term. higher->stronger
  51. lambda_walet = para.lambda_walet; % coefficient for wavelet regularization term. higher->stronger
  52. if bJointComp==1 % if joint compression is ON
  53. % This dataset has B0 modulation with period of 45 readout k-space points (including 8x oversampling)
  54. ntSeg_cs = para.ntSeg_cs; % the readout k-space point number for one compression group, in a B0 modulation period.
  55. nJointCs = para.nJointCs; % the joint compression factor
  56. end
  57. %% RF array compression
  58. if para.bCompRF ==1
  59. disp('RF-only compression starts......')
  60. maps_SENSE_cal = squeeze(permute(maps_SENSE,[1,2,3,5,4]));%[read,phase,(3Dslice),RF,2Dslice]
  61. tstRFCs = tic;
  62. [matA] = ComputeMat_CSRF(maps_SENSE_cal,img_fg,para.nCompRF);
  63. para.tRFcs_transformation = toc(tstRFCs);
  64. fprintf('\n');
  65. disp(['Time for calculating RF compression matrix: ',num2str(para.tRFcs_transformation),' s'])
  66. dat_exp = permute(dat_exp,[1,2,5,3,4]);
  67. maps_SENSE = permute(maps_SENSE,[1,2,5,3,4]);
  68. tstRFCs = tic;
  69. [dat_exp,maps_SENSE] = CompressRF(dat_exp,maps_SENSE,matA);
  70. para.tRFcs_apply = toc(tstRFCs);
  71. fprintf('\n');
  72. disp(['Time for applying RF compression matrix: ',num2str(para.tRFcs_apply),' s'])
  73. fprintf('\n')
  74. dat_exp = permute(dat_exp,[1,2,4,5,3]);
  75. maps_SENSE = permute(maps_SENSE,[1,2,4,5,3]);
  76. end
  77. %% Swap input data dimensions for further processing
  78. % dat_exp[ny_OS,nx,nz3D,nz2D->1,nC] -> [ny_OS,nPEx_intlp,nPEz_intlp,nC,nz2D->1]
  79. dat_exp = permute(dat_exp,[1,2,3,5,4]);
  80. %% Retrospective undersampling mask
  81. % Initialize the mask (interpolated size)
  82. mask_kxz = zeros(nRecoPix_yx,1);
  83. disp(['The undersampling factor: ', num2str(idx_us_x)])
  84. % Define the sampling point in the mask
  85. mask_kxz(1:idx_us_x:end) = 1;
  86. mask_kxz = single(mask_kxz);
  87. img_fg = single(img_fg);
  88. % mask index in image and k-space
  89. [ind_kx,ind_kz] = find(mask_kxz==1);
  90. ind_k = find(mask_kxz==1);
  91. [ind_y,ind_x,ind_z] = ind2sub(size(img_fg),find(img_fg));
  92. ind_fg = find(img_fg==1);
  93. sz_kmask = size(mask_kxz);
  94. sz_fg = size(img_fg);
  95. % Apply undersampling mask to fully-sampled k-space data
  96. dat_exp = dat_exp.*reshape(mask_kxz,1,nRecoPix_yx,1);
  97. % Keep the undersampling data in image domain for optional check.
  98. img_exp_us = SymFft(dat_exp,[1 2 3]);
  99. img_exp_us_sos = sqrt(sum(img_exp_us.*conj(img_exp_us),4));
  100. % Reduce memory by discarding omitted phase-encoded steps
  101. dat_exp = reshape(dat_exp,[size(dat_exp,1),size(dat_exp,2)*size(dat_exp,3),size(dat_exp,4)]);
  102. dat_exp = dat_exp(:,ind_k,:);
  103. % Reorganize the data dimension for multiple receivers
  104. if bSENSE == 1
  105. dat_exp = permute(dat_exp,[1 3 2]);
  106. end
  107. %% Prepare readout encoding matrix
  108. ERead = single(1);
  109. % If rapid B0 modulation ON, take the auto-calibrated B0 modulation matrix
  110. if bNgAcc==1
  111. ERead = ERead.*maps_B0Evo; clear maps_B0Evo;
  112. end
  113. % Encoding matrix for
  114. % Cartesian sampling by linear gradient
  115. % - > oversampled frequency-encoding
  116. EFe = dftmtx(nGridMR);
  117. EFe = circshift(conj(EFe),[floor(nGridMR/2) floor(nGridMR/2)]);
  118. cen_PE = floor(nGridMR/2)+1;
  119. min_PE = cen_PE - floor(nRecoPix_yx/2);
  120. max_PE = cen_PE + ceil(nRecoPix_yx/2)-1;
  121. EFe = EFe(:,min_PE:max_PE); % [nty_RO,nRecoPix_yx]
  122. ERead = ERead.*EFe;
  123. ERead = reshape(ERead,nMR,[]);
  124. ERead = single(ERead(:,ind_fg));
  125. % Encoding matrix for RF receive sensitivity encoding
  126. sense_maps_reshape=0;
  127. para.recnC = size(maps_SENSE,5);
  128. if bJointComp == 0 % if no joint compression, readout amtrix combined with sense matrix
  129. sense_maps_reshape = reshape(maps_SENSE,[1,nRecoPix_yx*nRecoPix_yx,para.recnC]);
  130. ERead = ERead.*sense_maps_reshape(:,ind_fg,:); clear sense_maps_reshape;
  131. ERead = permute(ERead,[1 3 2]);
  132. ERead = reshape(ERead,[],length(ind_fg));
  133. end
  134. %% Joint compression to reduce the reeadout model size
  135. if bJointComp == 1 % Joint compression ON
  136. ntnC_cs = ntSeg_cs*nC/nJointCs; % the number of virtual k-space points compressed from (a reaodut segment + all receiver channels)
  137. if mod(nGridMR,ntSeg_cs)~=0 % Here, the total readout point number = integer x readout point number in a segment, for convenience processing
  138. error('Compression in readout time domain is not divided into interger number of regions')
  139. end
  140. % Reorganize sensitivity matrix
  141. maps_SENSE = reshape(permute(maps_SENSE,[5,1,2,3,4]),[1,nC,nRecoPix_yx*nRecoPix_yx]);
  142. maps_SENSE = single(maps_SENSE(:,:,ind_fg));
  143. % Initiate compression matrix
  144. matA = single(zeros(ntnC_cs,ntSeg_cs*nC,para.kperiod/ntSeg_cs));
  145. disp('Joint compression starts......')
  146. % Calculate compression matrices from composite spatial encoding
  147. % maps.
  148. tstJointCs = tic;
  149. for idt_seg = 1:(para.kperiod/ntSeg_cs) % loop over different compression groups in a B0 modulation period
  150. % index for a readout segment, for a compression group
  151. t_st = 1+(idt_seg-1)*ntSeg_cs;
  152. t_end = t_st +(ntSeg_cs-1);
  153. % select and reshape parts of ERead, for a compression group
  154. E_seg = reshape(ERead(t_st:t_end,:),ntSeg_cs,1,[]);
  155. % construct the composite encoding matrix, for a compression
  156. % group
  157. E_joint_pix = bsxfun(@times,maps_SENSE,E_seg);
  158. E_joint_pix = reshape(E_joint_pix,ntSeg_cs*nC,length(ind_fg));
  159. E_joint_H_pix = E_joint_pix';
  160. % scaling coefficient
  161. coeff_scale = reshape(sum(conj(E_joint_pix) .* E_joint_pix, 1),1,length(ind_fg)); % [1 x p]
  162. matP = (E_joint_pix./coeff_scale)*E_joint_H_pix;
  163. [U,S,V] = svd(matP,'econ');
  164. VH = V';
  165. matA(:,:,idt_seg)= VH(1:ntnC_cs,:);
  166. % There there a few residue data points not belonging to
  167. % sets of every ntSeg_cs readout points
  168. if mod(nGridMR,ntSeg_cs)~=0
  169. % index for readout segment
  170. t_end = nGridMR;
  171. t_st = t_end - (ntSeg_cs+mod(nGridMR,ntSeg_cs)) +1;
  172. % select and reshape parts of ERead
  173. E_seg = reshape(ERead(t_st:t_end,:),ntSeg_cs,1,[]);
  174. % initialize the matrix to be decomposed
  175. matP = zeros(nC*ntSeg_cs,nC*ntSeg_cs);
  176. % update the k-space compression matrix over all pixels
  177. E_joint_pix = bsxfun(@times,maps_SENSE,E_seg);
  178. E_joint_pix = reshape(E_joint_pix,ntSeg_cs*nC,length(ind_fg));
  179. E_joint_H_pix = E_joint_pix';
  180. % scaling vector, pixel dependent
  181. coeff_scale = reshape(sum(conj(E_joint_pix) .* E_joint_pix, 1),1,length(ind_fg)); % [1 x p]
  182. % square matrix P for a compression group
  183. matP = (E_joint_pix./coeff_scale)*E_joint_H_pix;
  184. % svd decompositing the square matrix P. the
  185. % compressibility can be checked vis S
  186. [U,S,V] = svd(matP,'econ');
  187. VH = V';
  188. % select the subsets of singular vectors
  189. ntnC_cs_last = round(length(t_st:t_end)*nC/nJointCs);
  190. matA_res= VH(1:ntnC_cs_last,:);
  191. end
  192. end
  193. fprintf('\n')
  194. X = (['The (joint) compression matrices are calculated, for compression factor: ',num2str(nC*ntSeg_cs/ntnC_cs)]);
  195. disp(X)
  196. fprintf('\n')
  197. para.tcs_transformation = toc(tstJointCs);
  198. disp(['Time for calculating compression matrices: ',num2str(para.tcs_transformation),' s'])
  199. fprintf('\n')
  200. % Apply the compression matrices
  201. tstJointCs_apply = tic;
  202. % If total readout points before compression ~= integer x readout
  203. % segment points in a compression group
  204. if mod(nGridMR,ntSeg_cs)~=0 % if remained readout points do not form a compression group
  205. tres_ed = nGridMR;
  206. tres_st = tres_ed - (ntSeg_cs+mod(nGridMR,ntSeg_cs)) +1;
  207. ERead_res = ERead(tres_st:tres_ed,:);
  208. dat_exp_res = dat_exp(tres_st:tres_ed,:,:);
  209. tsegs_st = 1;
  210. tsegs_ed = tres_st-1;
  211. else % simpler case
  212. tsegs_st = 1;
  213. tsegs_ed = nGridMR;
  214. end
  215. if round(length(tsegs_st:tsegs_ed)/para.kperiod)~=(length(tsegs_st:tsegs_ed)/para.kperiod)
  216. if mod(para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod),ntSeg_cs)~=0
  217. error('Error! Requires reprogramming of compressed groups. The remained readout pts cannot be compressed by given compression matrices.')
  218. end
  219. dat_exp = padarray(dat_exp,[para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod),0,0],0,'post');
  220. ERead = padarray(ERead,[para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod),0],0,'post');
  221. tsegs_ed = tsegs_ed+para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod);
  222. end
  223. % Reorganize data to be compressed
  224. dat_exp = dat_exp(tsegs_st:tsegs_ed,:,:);
  225. dat_exp = reshape(dat_exp,...
  226. ntSeg_cs,...
  227. para.kperiod/ntSeg_cs,...
  228. length(tsegs_st:tsegs_ed)/para.kperiod,...
  229. nC,...
  230. length(ind_k));
  231. dat_exp = permute(dat_exp,[1,4,2,3,5]);
  232. dat_exp = reshape(dat_exp,...
  233. ntSeg_cs*nC,...
  234. 1,...
  235. para.kperiod/ntSeg_cs,...
  236. length(tsegs_st:tsegs_ed)/para.kperiod,...
  237. length(ind_k)); % [nToBeComps,1,sets of comp. matrix,different mod. periods,phase encoding]
  238. % data is compressed
  239. dat_exp_cs = pagemtimes(matA,dat_exp);
  240. % Reorganize readout encoding matrix
  241. ERead = reshape(ERead,ntSeg_cs,para.kperiod/ntSeg_cs,length(tsegs_st:tsegs_ed)/para.kperiod,length(ind_fg));
  242. ERead = permute(ERead,[1,3,4,2]); % ->[ntSeg_cs,length(tsegs_st:tsegs_ed)/para.kperiod,length(ind_fg),para.kperiod/ntSeg_cs]
  243. ERead_cs = single(zeros(ntnC_cs,1,length(tsegs_st:tsegs_ed)/para.kperiod,length(ind_fg),para.kperiod/ntSeg_cs)); %[compressed#,comp.seg.,yxz_mask]
  244. % compress readout encoding matrix
  245. for idx_mod = 1:(para.kperiod/ntSeg_cs)
  246. E_seg = ERead(:,:,:,idx_mod);
  247. E_seg = reshape(E_seg,...
  248. ntSeg_cs,...
  249. 1,...
  250. length(tsegs_st:tsegs_ed)/para.kperiod,...
  251. length(ind_fg));
  252. E_seg = E_seg.*reshape(maps_SENSE,[1,nC,1,length(ind_fg)]);
  253. E_seg = reshape(E_seg,ntSeg_cs*nC,...
  254. 1,...
  255. length(tsegs_st:tsegs_ed)/para.kperiod,...
  256. length(ind_fg)); % [nToBeComps,1,sets of comp. matrix,different mod. periods,phase encoding]
  257. ERead_cs(:,:,:,:,idx_mod) = pagemtimes(matA(:,:,idx_mod),E_seg);
  258. end
  259. ERead_cs = permute(ERead_cs,[1,5,3,4,2]);
  260. ERead_cs = reshape(ERead_cs,ntnC_cs/ntSeg_cs*length(tsegs_st:tsegs_ed),length(ind_fg));
  261. % manage if total readout points before compression ~= integer x readout
  262. % segment points in a compression group
  263. if nGridMR~=length(tsegs_st:tsegs_ed)
  264. nRes_temp = (length(tsegs_st:tsegs_ed)-nGridMR)*nC/nJointCs;
  265. ERead_cs = ERead_cs(1:(end-nRes_temp),:);
  266. dat_exp_cs = reshape(dat_exp_cs,[],size(dat_exp_cs,5));
  267. dat_exp_cs = dat_exp_cs(1:(end-nRes_temp),:);
  268. end
  269. para.tcs_apply = toc(tstJointCs_apply);
  270. disp(['Time for applying compression matrices: ',num2str(para.tcs_apply),' s'])
  271. fprintf('\n')
  272. X = (['The (joint) compression matrices are applied, for compression factor: ',num2str(nC*ntSeg_cs/ntnC_cs)]);
  273. disp(X)
  274. fprintf('\n')
  275. clear ERead ; % save memory
  276. clear dat_exp;
  277. clear E_seg;
  278. nMR = size(ERead_cs,1);nC=1;% para.recnC=1;
  279. else
  280. % keep using ..._cs to be compatible with the joint compressed
  281. % variables
  282. ERead_cs = ERead; clear ERead;
  283. dat_exp_cs = dat_exp; clear dat_exp;
  284. end
  285. %% Reorganize data dimensions for compressed sensing recon. The implementation may be further optimized. For 2D CS, this is fine so far.
  286. disp('Reorganizes data dimensions for CS recon......')
  287. % Map compressed encoding matrix with only sampled phase encoded steps back
  288. % to the matrix that include the zero-zilled phase encoded steps
  289. ERead_full = single(zeros(size(ERead_cs,1),size(img_fg,1)*size(img_fg,2)*size(img_fg,3)));
  290. ERead_full(:,ind_fg) = ERead_cs;
  291. ERead_full = reshape(ERead_full,size(ERead_cs,1),size(img_fg,1),size(img_fg,2),size(img_fg,3));
  292. ERead_cs = ERead_full;clear ERead_full;
  293. fprintf('\n');
  294. mem_GB = size(ERead_cs,1)*size(img_fg,1)*size(img_fg,2)*size(img_fg,3)*8*1e-9;
  295. X = ['Composite readout matrix used for recon: ',num2str(mem_GB),'GB'];
  296. disp(X)
  297. % Prepare the adjoint encoding matrix for CS recon, to avoid regenerating it during iteration.
  298. ERead_cs_H = reshape(ERead_cs,size(ERead_cs,1),[]);
  299. ERead_cs_H = ERead_cs_H';
  300. ERead_cs_H = reshape(ERead_cs_H,size(img_fg,1),size(img_fg,2),size(img_fg,3),size(ERead_cs_H,2));
  301. ERead_cs_H = permute(ERead_cs_H,[1,4,2,3]);
  302. %% FISTA recon of joint encoding of rapid B0 modulation & SENSE
  303. % reshape data into 1D
  304. dat_exp_cs = dat_exp_cs(:);
  305. % Extract the max. eigenvalue for normalization. You may need to calculate
  306. % or empirically get one value for your dataset.
  307. norm_A = para.sReco;
  308. % normalization of readout encoding matrix
  309. L=1.1;
  310. ERead_cs = ERead_cs./norm_A;
  311. ERead_cs_H = ERead_cs_H./norm_A;
  312. % initialize variable
  313. u0 = single(zeros(length(ind_y),1));
  314. z0 = single(zeros(length(ind_y),1));
  315. t0 = single(1);
  316. % iteration step 40. empirical. you can tune it.
  317. nIter = 40;
  318. % Recon starts
  319. fprintf('\n');
  320. disp('Iterative FISTA reconstruction starts......')
  321. if bNLReco==1 % nonlinear regularization is applied
  322. ct_tv = 0;
  323. t_nl = tic;
  324. for idx_tv = lambda_TV
  325. ct_tv = ct_tv +1;
  326. ct_wave = 0;
  327. for idx_wave = lambda_walet % 2e-4 for level dependent
  328. ct_wave = ct_wave+1;
  329. for idx_Iter=1:nIter
  330. % FISTA iteration
  331. if idx_Iter == 1 % Take initialized values
  332. u_this = u0;
  333. z_this = z0;
  334. t_this = t0;
  335. else % Take updated values from the last iteration
  336. u_this = u_next;
  337. z_this = z_next;
  338. t_this = t_next;
  339. end
  340. img0 = Afun_NGSENSE_fft(dat_exp_cs,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
  341. data_est = Afun_NGSENSE_fft(u_this,'notransp',ERead_cs,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
  342. img_est = Afun_NGSENSE_fft(data_est,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
  343. [deri_TV,cost_TV] = apply_TV3D(u_this,sz_fg,ind_fg,idx_tv);
  344. grad = (1/L).*(img0-img_est);
  345. z_next = u_this+grad;
  346. z_next = z_next-(1/L).*deri_TV(img_fg==1);
  347. z_next = apply_Wavelet(z_next,size(img_fg),img_fg,bWaThres,idx_wave);
  348. z_next = z_next(img_fg==1);
  349. % Update the inversion time
  350. t_next = 0.5*(1+sqrt(1+4*t_this^2));
  351. % Update the input to the next FISTA iteration
  352. u_next = z_next + (t_this-1)/t_next*(z_next-z_this);
  353. end
  354. end
  355. end
  356. tdur_nl = toc(t_nl);
  357. fprintf('\n');
  358. disp(['Nonlinear recon takes total time: ',num2str(tdur_nl), 's']);
  359. recon_temp = single(zeros([nRecoPix_yx,nRecoPix_yx]));
  360. recon_temp(ind_fg) = u_next;
  361. recon = recon_temp;
  362. else % no nonlinear regularization is applied
  363. t_nl = tic;
  364. for idx_Iter=1:nIter
  365. % FISTA iteration
  366. if idx_Iter == 1 % Take initialized values
  367. u_this = u0;
  368. z_this = z0;
  369. t_this = t0;
  370. else % Take updated values from the last iteration
  371. u_this = u_next;
  372. z_this = z_next;
  373. t_this = t_next;
  374. end
  375. img0 = Afun_NGSENSE_fft(dat_exp_cs,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
  376. data_est = Afun_NGSENSE_fft(u_this,'notransp',ERead_cs,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
  377. img_est = Afun_NGSENSE_fft(data_est,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
  378. grad = (1/L).*(img0-img_est);
  379. z_next = u_this+grad;
  380. % Update the inversion time
  381. t_next = 0.5*(1+sqrt(1+4*t_this^2));
  382. %Update the input to the next FISTA iteration
  383. u_next = z_next + (t_this-1)/t_next*(z_next-z_this);
  384. end
  385. tdur_nl = toc(t_nl);
  386. fprintf('\n');
  387. disp(['L2 recon takes total time: ',num2str(tdur_nl), 's']);
  388. recon_temp = single(zeros([nRecoPix_yx,nRecoPix_yx]));
  389. recon_temp(ind_fg) = u_next;
  390. recon = recon_temp;
  391. end
  392. % Display the recon.
  393. figure
  394. imagesc(abs(rot90(recon,1)))
  395. colormap(gray)
  396. if bJointComp==1
  397. title(['2D CS recon, joint compress ',num2str(round(para.tcs_transformation+para.tcs_apply,1)),' s, recon ',num2str(round(tdur_nl,1)), ' s'])
  398. else
  399. title(['2D CS recon, RF compress ',num2str(round(para.tRFcs_transformation+para.tRFcs_apply,1)),' s, recon ',num2str(round(tdur_nl,1)), ' s'])
  400. end
  401. fprintf('\n');
  402. disp('This script only provides you a basic demo about the benefits of the joint compression technique.')
  403. disp('The implementation can be further optimized.')

Run_B0SENSE_recon.m at commit 9a7ecb0, under BSD-3-Clause · at the source

Overview

  1. High‐Field MR Center, Max Planck Institute for Biological Cybernetics Tübingen Germany
  2. Department for Biomedical Magnetic Resonance University of Tübingen Tübingen Germany
Journal: Magnetic resonance in medicine, volume 96, issue 5, pages 2106-2126
Dates: received 13 October 2025; accepted 6 May 2026; published online 23 July 2026; in print November 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1002/mrm.70439 · PMID 42490765 · PMCID PMC13527271 · OpenAlex W7170148670
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: structural MRI / diffusion (modality), human (organism), methods / tools (subfield)
Methods: Spectral & time-frequency, fMRI & imaging
Keywords: compressed sensing reconstruction, compression, FRONSAC, local B0 coil array, parallel imaging, Wave‐CAIPI
MeSH: Brain*, Data Compression*, Image Processing, Computer-Assisted*, Magnetic Resonance Imaging*, Algorithms, Compression Algorithms, Fourier Analysis, Humans, Radio Waves (* major topic)
Journal subjects: Imaging Methodology
Topic: Advanced MRI Techniques and Applications (Radiology, Nuclear Medicine and Imaging, Medicine), according to OpenAlex
Funding: European Research Council (834940)
Citations: cited by 1 paper (Europe PMC); 92 references in the paper

Abstract

Purpose: To accelerate MRI further, rapid B0 field modulations can be applied during oversampled readout to capture additional physical information, as in Wave‐CAIPI/FRONSAC/local B0 coils modulation techniques. These methods, however, turn the Fourier readout into a non‐Fourier‐encoded dimension that cannot be reconstructed by FFT, posing significant reconstruction challenges especially in compressed‐sensing or neural‐network frameworks.

Theory and Methods: Because the rapid B0 modulations still vary slowly relative to the oversampled ADC dwell time, we exploit this encoding redundancy by compressing k‐space patch‐by‐patch across subregions, each of which is jointly encoded by a distinct subset of B0 and RF (receive) spatial encoding functions. For each subset, a compression matrix is computed once and reused to compress all patches encoded by the same B0‐RF spatial modulations. This can be implemented by feeding subsets of B0 and RF spatial encoding maps into an adapted conventional RF array compression algorithm, mimicking an expanded set of virtual receiver channels. This approach was evaluated on human brain scans at 9.4 T/3 T.

Results: The proposed group‐patch joint compression achieves substantially higher compression factors than conventional RF‐only compression, while minimally compromising encoding efficiency. Typically, joint compression factors of 11×–20× led to negligible encoding loss, dramatically reducing reconstruction time and peak memory usage. For example, compressed‐sensing reconstruction took 1.4–5.1 s/2D slice, 177 s–10.1 min/3D volume on a high‐memory CPU node.

Conclusion: Given joint encoding of dynamic B0 and static RF fields, compressing multidimensional k‐space patches in separate groups outperforms compressing RF receivers alone. This substantially mitigates a fundamental computational bottleneck when combining rapid B0 and RF‐receiver modulations.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 10 matches between paragraphs and lines of code.

Zenodo 20533698

License: BSD-3-Clause
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Data Availability Statement”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)

ruitianwater/GroupPatchJCS_v1.0

License: BSD-3-Clause
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 9a7ecb08031b5f533870af47aee6527a51fedb18, 5 June 2026
Languages: MATLAB (209), Python (2), C++ (2), C/C++ (1)
Size: 274 files, 214 scripts
Software Heritage: not archived
Found in: “Data Availability Statement”
Holds: README, license file, tests, documentation
Not found: CITATION.cff, environment file, continuous integration
Tools: Wavelet Toolbox (2 files), Image Processing Toolbox (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
216 files

harmonizedmri.github.io/projects

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: “Data Availability Statement”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 214 scripts, each with its path and the digest of its content;
  • 10 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data Availability Statement

The example code or data that support the findings of this study is openly available in Zenodo at https://zenodo.org/records/20533698, in Github at https://github.com/ruitianwater/GroupPatchJCS_v1.0, and collected at the HarmonizedMRI website at https://harmonizedmri.github.io/projects/.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 2, 28 September 2026

  • Publisher: n/a → Wiley

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 2 authors, 6 keywords, 9 MeSH terms, 1 funder, 80 references.

Cite

This paper

Tian, R., & Scheffler, K. (2026). Group-Patch Joint Compression: Compressing Dynamic B<sub>0</sub> and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI. Magnetic resonance in medicine, 96(5), 2106-2126. https://doi.org/10.1002/mrm.70439

BibTeX

@article{tian2026group,
author = {Tian, Rui and Scheffler, Klaus},
title = {{Group-Patch Joint Compression: Compressing Dynamic B\<sub\>0\</sub\> and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI}},
journal = {Magnetic resonance in medicine},
year = {2026},
month = jul,
volume = {96},
number = {5},
pages = {2106--2126},
publisher = {Wiley},
issn = {0740-3194},
doi = {10.1002/mrm.70439},
url = {https://doi.org/10.1002/mrm.70439},
pmid = {42490765},
pmcid = {PMC13527271}
}

RIS

TY - JOUR
AU - Tian, Rui
AU - Scheffler, Klaus
TI - Group-Patch Joint Compression: Compressing Dynamic B<sub>0</sub> and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI
T2 - Magnetic resonance in medicine
J2 - Magn Reson Med
PY - 2026
DA - 2026/07/23
VL - 96
IS - 5
SP - 2106
EP - 2126
SN - 0740-3194
PB - Wiley
DO - 10.1002/mrm.70439
UR - https://doi.org/10.1002/mrm.70439
LA - en
ER -

CSL-JSON

{
"id": "10.1002/mrm.70439",
"type": "article-journal",
"title": "Group-Patch Joint Compression: Compressing Dynamic B<sub>0</sub> and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI",
"container-title": "Magnetic resonance in medicine",
"author": [
{
"family": "Tian",
"given": "Rui"
},
{
"family": "Scheffler",
"given": "Klaus"
}
],
"container-title-short": "Magn Reson Med",
"volume": "96",
"issue": "5",
"page": "2106-2126",
"DOI": "10.1002/mrm.70439",
"PMID": "42490765",
"PMCID": "PMC13527271",
"ISSN": "0740-3194",
"publisher": "Wiley",
"URL": "https://doi.org/10.1002/mrm.70439",
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
23
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1002/mrm.70469 [code]
Laterally Oscillating Trajectory for Undersampling Slices: LOTUS.
Journal: Magnetic resonance in medicine
In common: Image Processing Toolbox, structural MRI / diffusion, 8 references
[2] doi:10.1002/mrm.70433 [code]
Single-Shot 2D Radial Echo Planar Imaging for Functional MRI.
Journal: Magnetic resonance in medicine
In common: 5 references
[3] doi:10.1002/mrm.70407 [code]
Time-Conditioned Zero-Shot Self-Supervised Reconstruction for Accelerated 3D Ultra-Low-Field MRI.
Journal: Magnetic resonance in medicine
In common: structural MRI / diffusion, 4 references
[4] doi:10.1002/hbm.70553 [code]
Axon Diameter Mapping in the Living Human Brain with Ultra-High-Gradient Diffusion MRI at 500 mT/m Gradient Strength.
Journal: Human brain mapping
In common: Image Processing Toolbox, structural MRI / diffusion, 3 references
[5] doi:10.1109/tmi.2026.3664328 [code]
Axon Diameter Mapping From Myelin Water Diffusion MRI.
Journal: IEEE transactions on medical imaging
In common: Image Processing Toolbox, structural MRI / diffusion, 3 references
[6] doi:10.1002/mrm.70496 [code]
A Deep Nonlinear Subspace Modeling and Reconstruction for Diffusion-Weighted Imaging Using Denoising Auto-Encoder.
Journal: Magnetic resonance in medicine
In common: methods / tools, structural MRI / diffusion, 3 references
[7] doi:10.1002/mrm.70490 [code]
Dependence of the Extra-Cellular Diffusion Coefficient on the Fractions of Neurites and Cell Bodies in Gray Matter.
Journal: Magnetic resonance in medicine
In common: structural MRI / diffusion, 3 references
[8] doi:10.1002/nbm.70305 [code]
Reducing Noise Induced by Cardiac Pulsatility in Brain Maps of R<sub>2</sub>* and Magnetic Susceptibility Using Tailored k-space Sampling.
Journal: NMR in biomedicine
In common: Image Processing Toolbox, structural MRI / diffusion, 2 references
[9] doi:10.7554/elife.92805 [code]
Brain-wide mapping of layer-specific functional connectivity in the human cortex at 3T using draining-vein-suppressed fMRI.
Journal: eLife
In common: Image Processing Toolbox, 2 references
[10] doi:10.1002/mrm.70416 [code]
Fast and Robust Diffusion Posterior Sampling for MR Image Reconstruction Using the Preconditioned Unadjusted Langevin Algorithm.
Journal: Magnetic resonance in medicine
In common: methods / tools, structural MRI / diffusion, 2 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.