From f855ae8ed93bed6b0a1f688ada539aab7b74bee3 Mon Sep 17 00:00:00 2001 From: Thomas Kuestner Date: Fri, 29 Apr 2016 18:51:55 +0200 Subject: [PATCH] initial commit --- README.md | 5 + acquisition/CS_FLASH_retro.dll | Bin 0 -> 118838 bytes acquisition/CS_FLASH_retro.i86 | Bin 0 -> 149472 bytes acquisition/CS_FLASH_retro.i87 | Bin 0 -> 150471 bytes reconstruction/fRetroGating.m | 499 ++++++++++++++++++++++++++++ reconstruction/fRetroGetNav.m | 153 +++++++++ reconstruction/fRetroGetNav2D.m | 211 ++++++++++++ reconstruction/fRetroGetNav3D.m | 241 ++++++++++++++ reconstruction/fRetroRecon4D_main.m | 200 +++++++++++ reconstruction/utils/OptimalColor.m | 37 +++ reconstruction/utils/fGaussianLP.m | 27 ++ 11 files changed, 1373 insertions(+) create mode 100644 acquisition/CS_FLASH_retro.dll create mode 100644 acquisition/CS_FLASH_retro.i86 create mode 100644 acquisition/CS_FLASH_retro.i87 create mode 100644 reconstruction/fRetroGating.m create mode 100644 reconstruction/fRetroGetNav.m create mode 100644 reconstruction/fRetroGetNav2D.m create mode 100644 reconstruction/fRetroGetNav3D.m create mode 100644 reconstruction/fRetroRecon4D_main.m create mode 100644 reconstruction/utils/OptimalColor.m create mode 100644 reconstruction/utils/fGaussianLP.m diff --git a/README.md b/README.md index da98259..06c0fd5 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,14 @@ A Cartesian 3D random Gaussian ESPReSSo subsampling is proposed which acquires a - precompiled 4D MR imaging sequence: CS_Retro (Siemens, VB20P) ## Reconstruction +retrospective motion gating and reconstruction of subsampled data - self-navigation signal extraction - gating procedure - for the CS reconstruction, please refer to https://github.com/thomaskuestner/CS_LAB +### Matlab +code included here +### Gadgetron +please refer to https://github.com/martinschwartz/CS_Gadgetron -------------------------------------------------------- Please read LICENSE file for licensing details. diff --git a/acquisition/CS_FLASH_retro.dll b/acquisition/CS_FLASH_retro.dll new file mode 100644 index 0000000000000000000000000000000000000000..286379530e9ced3765e29405afa9cd69de56a729 GIT binary patch literal 118838 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 TvX9Aj7mum&3cZrtZ07#}s#^8k literal 0 HcmV?d00001 diff --git a/acquisition/CS_FLASH_retro.i86 b/acquisition/CS_FLASH_retro.i86 new file mode 100644 index 0000000000000000000000000000000000000000..85ce9324f719d624e46b4b813bfdafdc5b1a6470 GIT binary patch literal 149472 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%0D^@^hwqX&(igl5)(S}73D^`}W)rLh7D^|9$ z-G)UFE7qmT9vc=xtXP*Rhiq5`v0~*aJvJp|nLGjzL z2x7&Ws03_S1hHaGQu1tA1hHaGRtjub1TkZMR#W-ZccuLE{PyV*^plPObXFhX=fb?_ zp1TvM)Q4t7B#B03mm#FxY4qpefkeX>`t#zKhjsvdVTVI2lSflDvFG%$Z&>DG?PC%8B`f5!aM zV4yN6-#9P4BCEK*q`o$EX-*(m@%1@X%lVDmSXX;#wj^EMDoHYa`ky(yJX3C5S`{h} zRn;DgN=~4rcExRhsuiK*-Q8MSTZ265?9ie9tohHYC|_0^4jrQi$IH^rTJ{O&5BU`; z6-#eFX7)N#aqY4S2(*^w(U0->mGTv{DsC+|yj+qd;P++xit+mzepUFb#4n291Nc3H-_P;e zjo(51euv-d`1RrU9)5%PjaVT`XWP2kLj`FTE;0_ z2C{Z>_0l$i8ZXbX7nK zWJ%d0q{{M|h6*WEAFhx{b`A4uiz~_-!u1tW9dfOr_G*HWxG%dVP{Cw4xBQN(i$Eb5 zoCEpHYrM9+Y6VH16e&nmQc~M6qrSd;6=Siq4)ujP2+XeymDdE9mamv!wY*}4R9_LQ zuLVY6+%o)^OvX(bx9lqRUlLYsk`xG3+)+`#Dx?shI^AF%wqOWA4(rI%!0J zAq0ROu2`|OBG3@7tE)u?LQYF-mqSzy4He4}y`ll2+!2ASrP;gV6|^c=1V-TB z%y3oBva157>I($)-f7YZX$Ge%!1^O1J10;H#6T+1P#+YmzXL*|I}yyUSYB6C9;#@_Rk#@lOv;-$g5*0cSXHqc z1-}j&Szmiw!?>HpU48lT8!9VF?I#rhZv;BEVAX9a%0p29tFD`RMF1^xo;)Wo>B_13 zSLWwWnK~)3IsgF7kPONx%2Zd|5V+>*04o#jr}HwMbXi!dG0Jg8-W9AIDf0WmWO%Z& zIaz$Fr{C=Uug>4EK793Mg=6AxUUBJ{2}WD0zx@#X^?ms-&+VW2#C383fBrWfUvPf` zVKukp&bYg{y}o?rq-%Y54*dEDn}0I(c+Zp$e?;e5^h7g21@~JKZY{to?lb!@4qb

|3JD24K=H&X7 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

m=h_ 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 literal 0 HcmV?d00001 diff --git a/reconstruction/fRetroGating.m b/reconstruction/fRetroGating.m new file mode 100644 index 0000000..fc79700 --- /dev/null +++ b/reconstruction/fRetroGating.m @@ -0,0 +1,499 @@ +function [dKSpace, dRespPhases] = fRetroGating(sFilename, iNPhases, dTolerance, dTime, sGatingMode, sGatingGather, sPrecision, iEcho, lDebug) +%FRETROGATING +% +% Copyright 2014-2016 Christian Wuerslin, University of Tuebingen, Germany +% christian.wuerslin@med.uni-tuebingen.de +% and Thomas Kuestner, University of Tuebingen, Germany +% thomas.kuestner@med.uni-tuebingen.de + +% inputs +% sFilename path to measurement file +% iNPhases number of respiratory gates +% dTolerance view sharing blending factor b of gates (1 (non-overlapping) <= b <= 2 (completely overlapping)) +% dTime crop scan time (0 := no cropping | scan time [s]) +% sGatingMode select gating procedure +% 'percentile' select gate centroids according to 5% and 95% percentile +% 'kmeans' perform k-means clustering to select gate centroids +% sGatingGather sample gathering mode: +% 'closest' take closest sample to gate centroid +% 'average' take all possible samples and weight them +% according to their distance to the gate centroid +% 'collect' gather all samples and let the +% reconstruction decide for the most favourable one +% 'none' no k-Space population, show simulations of the k-Space sampling density +% iEcho current to be processed echo +% lDebug debugging flag for additional plots +% +% outputs +% dKSpace gated kSpace +% dRespPhases respiratory phases (TR level) + +if nargin < 9, lDebug = false; end +if nargin < 8, iEcho = 1; end +if nargin < 7, sPrecision = 'single'; end +if nargin < 6, sGatingGather = 'closest'; end +if nargin < 5, sGatingMode = 'percentile'; end +if nargin < 4, dTime = 0; end +if nargin < 3, dTolerance = 1; end +if nargin < 2, iNPhases = 1; end + +% parse inputs +[sPath, sName, sExt] = fileparts(sFilename); +if isempty(sExt), sFilename = [sFilename, '.dat']; end +% sFilename = which(sFilename); +[sPath, sName] = fileparts(sFilename); +sFilename = [sPath, filesep, sName]; +iNPhasesLoop = 1:iNPhases; + +% ------------------------------------------------------------------------- +% Get some relevant data from the drecksMDH +drecksMDH = fMeas_mainLUTDrecks( sFilename ); +iNPartitions = drecksMDH.Geo.MatrixSize(3); +iNLines = drecksMDH.Geo.MatrixSize(2); +iBaseRes = drecksMDH.Geo.MatrixSize(1); +dTR = drecksMDH.Contrast.TR./1E6; +dNavPeriod = drecksMDH.Wip.NavPeriod; +if(isfield(drecksMDH.Geo,'EchoPosition')) + iEchoLine = drecksMDH.Geo.EchoPosition(1); + iEchoPartition = drecksMDH.Geo.EchoPosition(2); +else + iEchoLine = drecksMDH.Geo.MatrixSize(2)/2; + iEchoPartition = drecksMDH.Geo.MatrixSize(3)/2; +end +if(isfield(drecksMDH,'Wip')) + iNavPERes = drecksMDH.Wip.NavRes(1); + iNav3DRes = drecksMDH.Wip.NavRes(2); +else + iNavPERes = 8; + iNav3DRes = 1; +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get loop counters from file and reduce to first channel and first echo +load([sFilename, '.mat'], 'iLC'); +load([sFilename, '.mat'], 'iSP'); +load([sFilename, '.mat'], 'dNavInt'); +iNChannels = max(unique(double(iLC(:,2)))); + +lMask = iLC(:, 1) == 2*iBaseRes & iLC(:, 11) < 65000 & iLC(:,7) == iEcho-1; % throw out dummy measurements (which are needed to capture surrogate signals and keep steady state) +iSP = iSP(lMask); +iLCReduced = iLC(lMask, :); % only "real" readouts +iSP = iSP(1:iNChannels:end,:); +iLCReduced = iLCReduced(1:iNChannels:end, :); + +fprintf(1, 'Scantime was %f3 s\n', length(iLCReduced)*dTR); + +% ------------------------------------------------------------------------- +% check cropping parameter dTime +dPRECROP = 5.0; % Crop first 5 s +fprintf(1, 'Cropped initial %.3f s for steady-state!\n', dPRECROP); +if(isscalar(dTime)) + dTimeStart = dPRECROP; + dTimeEnd = dTime; + dTime = num2str(dTime,'%03d'); +else + dTimeStart = dTime(:,1); + dTimeEnd = dTime(:,2); + dTime = dTime.'; % for backward compatibility + dTime = strrep(num2str(dTime(:).','%03d'),' ',''); +end + +if(dTimeStart(1) < dPRECROP) + dTimeStart(1) = dPRECROP; +end +if(any(dTimeEnd == 0)) + dTimeEnd(dTimeEnd == 0) = length(iLCReduced)*dTR; +end +if(dTimeEnd(end) > length(iLCReduced)*dTR) + dTimeEnd(end) = length(iLCReduced)*dTR; +end + +iCropRange = []; +for iI = 1:length(dTimeStart) + iCropRange = [iCropRange,round([dTimeStart(iI)/dTR:dTimeEnd(iI)/dTR])]; + fprintf(1, 'Scantime cutout from %.3f s to %.3f s\n', dTimeStart(iI),dTimeEnd(iI)); +end +iCropRange = unique(iCropRange); + +iLCReduced = iLCReduced(iCropRange,:); +iSP = iSP (iCropRange,:); +dNavInt = dNavInt (iCropRange); + +iLine = iLCReduced(:,3); +iPartition = iLCReduced(:,6); + +iADCLength = 128/4 + iBaseRes*4; % MDH + ADC + +if(usejava('jvm') && ~feature('ShowFigureWindows')) + % use text-based alternative + lflagDisp = false; +else + lflagDisp = true; +end + +% ------------------------------------------------------------------------- +% respiratory gating +% ------------------------------------------------------------------------- +if(all(iNPhasesLoop > 0) && exist('dNavInt', 'var')) + % Calculate the center positions of the phases + % --------------------------------------------------------------------- + % distinguish between inhale and exhale + iNPhasesOld = iNPhases; + + % gating method + dNavInt = dNavInt(1:length(iLine)); + dNavMin = min(dNavInt); + dNavMax = max(dNavInt); + dToleranceOld = dTolerance; + if(dNavMin == dNavMax) % BH acquisition + dGatePos = dNavMin; + iNPhases = 1; + else + switch sGatingMode + case 'percentile' + % 5% and 95% percentile gating + dX = linspace(dNavMin, dNavMax, 256); + iHist = hist(dNavInt, dX); + iSum = sum(iHist); + + iLowerLim = 1; + while sum(iHist(iLowerLim:end))/iSum > 0.9 + iLowerLim = iLowerLim + 1; + end + iUpperLim = 256; + while sum(iHist(1:iUpperLim))/iSum > 0.9 + iUpperLim = iUpperLim - 1; + end + + % equally spaced gate centroids + dMin = dX(iLowerLim); + dMax = dX(iUpperLim); + dGatePos = linspace(dMax, dMin, iNPhasesOld)'; + dTolerance = abs(diff(dGatePos)).*dTolerance./2; + if(isempty(dTolerance)) % breathhold + dTolerance = dToleranceOld; + end + dTolerance = repmat(dTolerance(1),[iNPhases, 1]); + + case 'kmeans' + % kmeans clustering of gate centroids + dGrad = gradient(dNavInt); + lExhale = dGrad >= 0; + lInhale = dGrad < 0; + iInd = find(lExhale,1,'first'):find(lInhale,1,'last'); % without outliers (due to dNav extraction) + lInd = false(1,length(dNavInt)); + lInd(iInd) = true; + [iClusterEx, dGatePosEx] = kmeans(dNavInt(lInd).',iNPhases); % without outliers (due to dNav extraction) + dGatePos = sort(dGatePosEx,'descend'); + + % get tolerance window width + dMinDist = zeros(length(dGatePos),2); % 1st col: upper dist, 2nd col: lower dist + for iI = 1:length(dGatePos) + lIndCl = lInd; + lIndCl(lInd) = iClusterEx == find(dGatePos(iI) == dGatePosEx); + dMinDist(iI,1) = max(dNavInt(lIndCl)); + dMinDist(iI,2) = min(dNavInt(lIndCl)); + end + dMinDist = abs(dMinDist - repmat(dGatePos, [1 2])); + dMaxDist = abs([[dMinDist(1,1); diff(dGatePos(1:iNPhasesOld))], [diff(dGatePos(1:iNPhasesOld)); dMinDist(iNPhasesOld,2)]]); + dTolerance = dMinDist + (dTolerance-1) .* dMaxDist; + end + end + % get respiratory phase mask + dRespPhases = zeros(length(dNavInt),1); + for iPh = iNPhasesLoop + if(strcmp(sGatingMode,'kmeans')) + iTol = [1 2]; + else + iTol = [1 1]; + end + lMask = dNavInt <= dGatePos(iPh) + dTolerance(iPh,iTol(1)) & dNavInt > dGatePos(iPh) - dTolerance(iPh,iTol(2)); + dRespPhases(lMask) = iPh; + end +else % ignore respiratory gating + dNavInt = ones(length(iLCReduced), 1)'; + iNPhases = 1; % needed in for loop + iNPhasesLoop = 1; + dGatePos = 1; + dTolerance = 1; + dRespPhases = ones(length(iLCReduced),1); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Show the navigator signal, phase centers and tolerances +if lDebug + dColors = [0 1 0;0 0 1;1 0 0;0 0.965517241379310 1;1 0.482758620689655 0.862068965517241;1 0.862068965517241 0.482758620689655;0 0.551724137931035 1;0 0.413793103448276 0.0344827586206897;0.620689655172414 0.275862068965517 0.206896551724138;0.241379310344828 0 0.413793103448276;1 0.931034482758621 1]; + hfig_respSignal = figure('name',sprintf('Gating - Ph%02d, Tol%03.0f, t%s, Esp%s, InExh%s, %s, %s', iNPhases, 100*dToleranceOld, dTime, sGatingMode, sGatingGather)); + plot(dNavInt, 'Color', 'k'); + hold on; + dXMax = max(get(gca, 'XLim')); + for iI = 1:length(dGatePos) + if(strcmp(sGatingMode,'kmeans')) + line([0 dXMax], [dGatePos(iI) dGatePos(iI)], 'Color', dColors(iI,:), 'LineWidth', 1.5); + line([0 dXMax], [dGatePos(iI) + dTolerance(iI,1) dGatePos(iI) + dTolerance(iI,1)], 'Color', dColors(iI,:), 'LineStyle', '--'); + line([0 dXMax], [dGatePos(iI) - dTolerance(iI,2) dGatePos(iI) - dTolerance(iI,2)], 'Color', dColors(iI,:), 'LineStyle', '--'); + hold on; + lIndCl = lInd; + lIndCl(lInd) = iClusterEx == find(dGatePos(iI) == dGatePosEx); + if(iI < iNPhasesOld) + lIndVS = (iClusterEx == find(dGatePos(iI) == dGatePosEx) & iClusterEx == find(dGatePos(iI+1) == dGatePosEx)).'; % view sharing samples + else + lIndVS = false(1,length(lIndCl)); + end + lIndCl(lIndCl & lIndVS) = false; + + plot(find(lIndCl),dNavInt(lIndCl),'Color', dColors(iI,:), 'Marker', 'x', 'LineStyle', 'none'); + hold on; + plot(find(lIndVS),dNavInt(lIndVS),'Color', (dColors(iI,:)+dColors(iI+1,:))/2, 'Marker', 'x', 'LineStyle', 'none'); + hold on; + else % percentile + line([0 dXMax], [dGatePos(iI) dGatePos(iI)], 'Color', dColors(iI,:), 'LineWidth', 1.5); + line([0 dXMax], [dGatePos(iI) + dTolerance(iI) dGatePos(iI) + dTolerance(iI)], 'Color', dColors(iI,:), 'LineStyle', '--'); + line([0 dXMax], [dGatePos(iI) - dTolerance(iI) dGatePos(iI) - dTolerance(iI)], 'Color', dColors(iI,:), 'LineStyle', '--'); + hold on; + lIndCl = dNavInt <= dGatePos(iI) + dTolerance(iI) & dNavInt > dGatePos(iI) - dTolerance(iI); + if(iI == 1) + lIndVS = (dNavInt <= dGatePos(iI+1) + dTolerance(iI+1) & dNavInt > dGatePos(iI) - dTolerance(iI)); + elseif(iI == iNPhasesOld) + lIndVS = (dNavInt > dGatePos(iI-1) - dTolerance(iI-1) & dNavInt <= dGatePos(iI) + dTolerance(iI)); + else + lIndVS = (dNavInt <= dGatePos(iI+1) + dTolerance(iI+1) & dNavInt > dGatePos(iI) - dTolerance(iI)) | ... + (dNavInt > dGatePos(iI-1) - dTolerance(iI-1) & dNavInt <= dGatePos(iI) + dTolerance(iI)); + end + + lIndCl(lIndCl & lIndVS) = false; + + plot(find(lIndCl),dNavInt(lIndCl),'Color', dColors(iI,:), 'Marker', 'x', 'LineStyle', 'none'); + hold on; + plot(find(lIndVS),dNavInt(lIndVS),'Color', (dColors(iI,:)+dColors(iI+1,:))/2, 'Marker', 'x', 'LineStyle', 'none'); + hold on; + end + end + plot(dNavInt, 'Color', 'k'); +end +% ------------------------------------------------------------------------- + + +% ------------------------------------------------------------------------- +% Populate the k-Space +fprintf('*** k-Space statistics: ***\n'); +switch sGatingGather + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + case 'closest' + if(lflagDisp), hF = waitbar(0, 'Populating k-Space'); end; + fid = fopen([sPath, filesep, sName, '.dat'], 'r'); + + % - - - - - - - - - - - - - - - - - - - - - - + % Pre-allocate k-Space memory + dKSpace = complex(zeros(iNLines, iBaseRes.*2, iNPartitions, length(iNPhasesLoop), iNChannels,sPrecision), ... + zeros(iNLines, iBaseRes.*2, iNPartitions, length(iNPhasesLoop), iNChannels,sPrecision)); + dKSpaceImg = zeros(iNLines, iNPartitions, length(iNPhasesLoop), 'uint8'); + % - - - - - - - - - - - - - - - - - - - - - - + + % - - - - - - - - - - - - - - - - - - - - - + % RESP PHASES loop + for iPh = iNPhasesLoop + lRespMask = dRespPhases == iPh; + dWeight = abs(dNavInt - dGatePos(iPh))'; + + % - - - - - - - - - - - - - - - + % LINES loop + for iL = 1:iNLines + lLineMask = iLine == (iL - 1); + + % - - - - - - - - - - - + % PARTITIONS loop + for iP = 1:iNPartitions + lMask = lRespMask & lLineMask & iPartition == (iP - 1); + dThisDist = dWeight(lMask); + if isempty(dThisDist), continue, end; + + [dVal, iInd] = min(dThisDist); + if(strcmp(sGatingMode,'kmeans')) + if(dNavInt(iInd) >= dGatePos(iPh)) + iTol = 1; + else + iTol = 2; + end; + else + iTol = 1; + end + if(dVal > dTolerance(iPh,iTol)) + continue; % just for backup + end + + iThisSP = iSP(lMask); + fseek(fid, double(iThisSP(iInd)), 'bof'); + dData = fread(fid, iADCLength.*iNChannels, 'float'); + dData = reshape(dData, [iADCLength, iNChannels]); + dData = dData(128/4 + 1:end,:); + dData = complex(dData(1:2:end,:), dData(2:2:end,:)); + dKSpace(iL, :, iP, iPh==iNPhasesLoop, :) = permute(dData, [3 1 4 2]); + dKSpaceImg(iL, iP, iPh==iNPhasesLoop) = 1; + end + % end of PARTITIONS loop + % - - - - - - - - - - - + if(lflagDisp), waitbar((double(iPh - 1).*double(iNLines) + double(iL))./(double(iNPhases).*double(iNLines)), hF); end; + + end + % end of LINES loop + % - - - - - - - - - - - - - - - + fprintf(1, ' Phase %u acceleration is %1.3f\n', iPh, double(numel(dKSpaceImg(:,:,iPh==iNPhasesLoop)))./double(sum(sum(dKSpaceImg(:,:,iPh==iNPhasesLoop) > 0)))); + + end + % end of PHASES loop + % - - - - - - - - - - - - - - - - - - - - - + fclose(fid); + if(lflagDisp), close(hF); end; + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + case 'collect' + if(lflagDisp), hF = waitbar(0, 'Populating k-Space'); end; + fid = fopen([sPath, filesep, sName, '.dat'], 'r'); + + % - - - - - - - - - - - - - - - - - - - - - - + % find maximal amount of samples per gate + dKSpaceImg = cell(iNLines, iNPartitions, iNPhases); + + % - - - - - - - - - - - - - - - - - - - - - - + % PHASES loop + for iPh = 1:iNPhases + if(strcmp(sGatingMode,'kmeans')) + iTol = [1 2]; + else + iTol = [1 1]; + end + dWeight = dNavInt <= dGatePos(iPh) + dTolerance(iPh,iTol(1)) & dNavInt > dGatePos(iPh) - dTolerance(iPh,iTol(2)); + dDist = abs(dNavInt - dGatePos(iPh))'; + + % - - - - - - - - - - - - - - - - + % LINES loop + for iL = 1:iNLines + lLineMask = iLine == (iL - 1); + + % - - - - - - - - - - - - + % PARTITIONS loop + for iP = 1:iNPartitions + lPartitionMask = iPartition == (iP - 1); + iInd = lLineMask & lPartitionMask & dWeight.'; + + if isempty(iInd), continue, end + [~,dThisDist] = sort(dDist(iInd)); + iInd = find(iInd); + iInd = iInd(dThisDist); + + dKSpaceImg{iL, iP, iPh} = iInd; + end + if(lflagDisp), waitbar((double(iPh - 1).*double(iNLines) + double(iL))./(double(iNPhases).*double(iNLines)), hF); end; + end + fprintf(1, ' Phase %u acceleration is %1.3f\n', iPh, (iNPartitions*iNLines)./(double(nnz(cellfun(@isempty,dKSpaceImg(:,:,iPh)))))); + end + if(lflagDisp), close(hF); end; + + % decide for the most occuring gate filling situations + % if any gate has more samples (k-space center), take the iNGate + % nearest samples + iSamples = cellfun(@length, dKSpaceImg); + n_elements = hist(iSamples(:),1:max(iSamples(:))); + iNGate = 1; + while(sum(n_elements(1:iNGate)) < 0.99*sum(n_elements(:))) + iNGate = iNGate + 1; + end + + lMask = iSamples <= iNGate & iSamples > 0; + lMask(iEchoLine-round(iNavPERes/2)+1:iEchoLine+round(iNavPERes/2), iEchoPartition-round(iNav3DRes/2)+1:iEchoPartition+round(iNav3DRes/2), :) = true; % keep navigator lines + lMask = find(~lMask); + for iMask = 1:length(lMask) + [cLine,cPar,cPha] = ind2sub(size(dKSpaceImg),lMask(iMask)); + dKSpaceImg{cLine,cPar,cPha} = []; + end + + % Pre-allocate k-Space memory + dKSpace = complex(zeros(iNLines, iBaseRes.*2, iNPartitions, iNPhases, iNGate, iNChannels, sPrecision), ... + zeros(iNLines, iBaseRes.*2, iNPartitions, iNPhases, iNGate, iNChannels, sPrecision)); + + if(lflagDisp), hF = waitbar(0, 'Populating k-Space'); end; + + % - - - - - - - - - - - - - - - - - - - - - - + % PHASES loop + for iPh = 1:iNPhases + + % - - - - - - - - - - - - - - - - + % LINES loop + for iL = 1:iNLines + + % - - - - - - - - - - - - + % PARTITIONS loop + for iP = 1:iNPartitions + if(isempty(dKSpaceImg{iL,iP,iPh})), continue; end; + + % - - - - - - - - - + % GATING loop + for iG = 1:length(dKSpaceImg{iL,iP,iPh}) + if(iG > iNGate), break, end; + iThisSP = iSP(dKSpaceImg{iL,iP,iPh}(iG)); + fseek(fid, double(iThisSP), 'bof'); + dData = fread(fid, iADCLength.*iNChannels, 'float'); + dData = reshape(dData, [iADCLength, iNChannels]); + dData = dData(128/4 + 1:end,:); + dData = complex(dData(1:2:end,:), dData(2:2:end,:)); + dKSpace(iL, :, iP, iPh, iG, :) = permute(dData, [3 1 4 2]); + end + % end of GATING loop + % - - - - - - - - - + end + % end of PARTITIONS loop + % - - - - - - - - - - - - + if(lflagDisp), waitbar((double(iPh - 1).*double(iNLines) + double(iL))./(double(iNPhases).*double(iNLines)), hF); end; + end + % end of LINES loop + % - - - - - - - - - - - - - - - - + end + % end of PHASES loop + % - - - - - - - - - - - - - - - - - - - - - - + fclose(fid); + if(lflagDisp), close(hF); end; + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % No k-Space population, show simulations of the k-Space sampling + % density + case 'none' + dKSpaceImg = zeros(iNLines, iNPartitions, iNPhases, 'uint8'); + for iPh = 1:iNPhases + lMask = abs(dNavInt - dGatePos(iPh)) <= dTolerance; + + iThisLine = iLine(lMask); + iThisPartition = iPartition(lMask); + + for iI = 1:length(iThisLine) + dKSpaceImg(iThisLine(iI) + 1, iThisPartition(iI) + 1, iPh) = ... + dKSpaceImg(iThisLine(iI) + 1, iThisPartition(iI) + 1, iPh) + 1; + end + fprintf(1, ' Phase %u acceleration is %1.3f\n', iPh, double(numel(dKSpaceImg(:,:,iPh)))./double(sum(sum(dKSpaceImg(:,:,iPh) > 0)))); + end + dKSpace = dKSpaceImg; + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% show subsampling masks +if lDebug + dColMap = OptimalColor(256 + 20); + dColMap = dColMap(21:end, :); + dColMap(1,:) = [0, 0, 0]; + + for iPh = 1:iNPhases + figure, imshow(dKSpaceImg(:,:,iPh)', 'InitialMagnification', 400); + set(gcf, 'Name', sprintf('k-Space density for phase %u', iPh)); + colormap(dColMap); + set(gca, 'CLim', [0 255]); + end +end +% ------------------------------------------------------------------------- \ No newline at end of file diff --git a/reconstruction/fRetroGetNav.m b/reconstruction/fRetroGetNav.m new file mode 100644 index 0000000..ee700dd --- /dev/null +++ b/reconstruction/fRetroGetNav.m @@ -0,0 +1,153 @@ +function dNav = fRetroGetNav(sFilename, lDebug) +%FFLASHRETROGETNAV Extracts navigator data from CS_FLASH_retro sequence +% DNAV = FFLASHRETROGETNAV(SFILENAME) Extracts navigator data DNAV from +% the siemens meas-data file SFILENAME. Must have been parsed with +% FMeasCreateLUT before. +% +% See also: FMEASCREATELUT +% +% Copyright 2014-2016 Christian Wuerslin, University of Tuebingen, Germany +% christian.wuerslin@med.uni-tuebingen.de +% and Thomas Kuestner, University of Tuebingen, Germany +% thomas.kuestner@med.uni-tuebingen.de + +if(nargin < 1) + lDebug = false; +end +[sPath, sName, sExt] = fileparts(sFilename); + +% ------------------------------------------------------------------------- +% Get some relevant data from the drecksMDH +try + load(fullfile(sPath,[sName,'.mat']), 'SDrecksMDH'); + dBaseRes = SDrecksMDH.Geo.MatrixSize(1); + dTR = SDrecksMDH.Contrast.TR./1000; % in ms + if(isfield(SDrecksMDH.Geo,'EchoPosition')) + dEchoLine = SDrecksMDH.Geo.EchoPosition(1); + dEchoPartition = SDrecksMDH.Geo.EchoPosition(2); + else + dEchoLine = SDrecksMDH.Geo.MatrixSize(2)/2; + dEchoPartition = SDrecksMDH.Geo.MatrixSize(3)/2; + end + dNavPeriod = SDrecksMDH.Wip.NavPeriod; + dNavPERes = SDrecksMDH.Wip.NavRes(1); +catch + % Load the loop counters + load([sPath, filesep, sName, '.mat']); + dBaseRes = 256; + dEchoLine = 128; + dEchoPartition = 36; + dNavPeriod = 200; + dNavPERes = 1; +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get ktSpace +[dKtSpace, iLC] = fMeasRead(sFilename, 'Set', [1 7], 'Eco', 0, 'Lin', dEchoLine, 'Par', dEchoPartition); +if(length(unique(iLC(:,10))) > 1) % in the case of switched on surrogate monitoring + lMask = true(size(iLC, 1), 1); + lMask = lMask & (iLC(:,10) == 1 | iLC(:,10) == 3 | iLC(:,10) == 5 | iLC(:,10) == 7); + iLC = iLC(lMask,:); + dKtSpace = dKtSpace(lMask,:); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Determine data size +iNChannels = double(iLC(1, 2)); +iNSamples = size(dKtSpace, 2); +iNMeasurements = size(dKtSpace, 1)./(iNChannels); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Build up the kSpaces of all channels +dKtSpace = reshape(dKtSpace, [iNChannels, iNMeasurements, iNSamples]); +dKtSpace = permute(dKtSpace, [3, 2, 1]); % -> RO x t x CH +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Reconstruct the 1-D projections for all measuremetns and all channels +dImg = fftshift(ifft(ifftshift(dKtSpace(:,:,:)))); +dImg = flipdim(dImg, 1); % Invert the RO direction: 1-N -> H-F +dImg = dImg(iNSamples/4:iNSamples.*3/4 - 1, :, :, :); % RO x t x CH + +% Get x range of respiratory motion and sort out Channels with no relevant +% information in target area +dFreq = fft(dImg, [], 2); +dPower = dFreq.*conj(dFreq); +dIMGres = 1./(double(dNavPeriod)./1000.*double(iNMeasurements)); % The frequency resolution of dIMG in Hz +dPower = squeeze(sum(dPower(:, round(1./(5.*dIMGres)):round(1./(3.*dIMGres)), :), 2)); % RO x CH +dPowerInChan = dPower; % RO x CH +dPowerAcrossChannels = sum(dPowerInChan, 2); % RO x 1 +dPowerAcrossChannels(length(dPowerAcrossChannels).*3/4:end) = 0; % Prevent detection of regions in the abdomen +dPowerAcrossChannels = conv(dPowerAcrossChannels, fGaussianLP(20), 'same'); +[dMax, dX] = max(dPowerAcrossChannels); +dMax = max(dPowerInChan(dX - 20: dX + 20, :)); +lGoodChannels = dMax > 0.4.*max(dMax); + +dSOSImg = sqrt(sum(dImg(:,:,lGoodChannels).*conj(dImg(:,:,lGoodChannels)), 3)); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the navigator signal +iDisplacement = 80; % [mm] diaphragm displacement (max. +/- 80mm) +dDisplacement = round(iDisplacement/(SDrecksMDH.Geo.FOV(1)/SDrecksMDH.Geo.MatrixSize(1))); % [px] + +dRefImg = zeros(size(dSOSImg)); +dRefImg(:,end) = dSOSImg(:,end); +idx = 1:size(dRefImg,2); +dNav = zeros(1,size(dRefImg,2)); + +hF = waitbar(0, 'Getting Navigator'); +for i=size(dRefImg,2)-1:-1:2 + dRMSImg = zeros(size(dRefImg,1),2*dDisplacement+1); + tmp = dRefImg(:,idx(i+1:end)); + for iD = -dDisplacement:dDisplacement + dRMSImg(:,dDisplacement-iD+1) = sum((tmp - repmat(circshift(dSOSImg(:,idx(i)), iD),[1 size(tmp,2)])).^2,2); % RMS + waitbar((abs(i-size(dRefImg,2)-2)*(2*dDisplacement+1) + (iD + dDisplacement + 1))/((size(dRefImg,2)-2)*(2*dDisplacement+1)),hF); + end + [~, dNav(i)] = min(sum(dRMSImg(dX-round(dDisplacement/2):dX+round(dDisplacement/2),:))); % RMS + dNav(i) = dDisplacement + 1 - dNav(i); + dRefImg(:,idx(i)) = circshift(dSOSImg(:,idx(i)), dNav(i)); + waitbar(abs(i-size(dRefImg,2)-2)/(size(dRefImg,2)-2),hF); +end +close(hF); +dNav = -dNav; +dNav = conv(dNav, fGaussianLP(5), 'same'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Visualize the result +if(lDebug) + figure('Name','Navi'), imagesc(dSOSImg(:, 3:end)); + colormap gray; + hold all; + plot(dNav(3:end)-mean(dNav)+dX); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Interpolate the navigator data to TR intervals +load([sPath, filesep, sName, '.mat'], 'iLC'); +iLC = iLC(1:iNChannels:end, :); +iLC = iLC(iLC(:,7) == 0, :); % first echo +iLC = iLC(iLC(:, 1) == 2*dBaseRes, :); % only "real" readouts + +dNav = - dNav; +dNav = dNav - min(dNav); + +iNavInd = find((iLC(:,3) == dEchoLine) & (iLC(:,6) == dEchoPartition)); +if(length(iNavInd) ~= length(dNav)) % happens at the end when navi not fully acquired + iNavInd = iNavInd(1:length(dNav)); +end +dNavInt = interp1(iNavInd, dNav, 1:length(iLC), 'pchip'); +dNavInt_ms = interp1(iNavInd.*dTR, dNav, 1:length(iLC).*dTR, 'pchip'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Append the navigator data to the LUT file +save([sPath, filesep, sName, '.mat'], 'dNavInt', '-append'); +save([sPath, filesep, sName, '.mat'], 'dNavInt_ms', '-append'); +save([sPath, filesep, sName, '.mat'], 'dSOSImg', '-append'); +% ------------------------------------------------------------------------- \ No newline at end of file diff --git a/reconstruction/fRetroGetNav2D.m b/reconstruction/fRetroGetNav2D.m new file mode 100644 index 0000000..c9ee372 --- /dev/null +++ b/reconstruction/fRetroGetNav2D.m @@ -0,0 +1,211 @@ +function [dNav, dKSpace] = fRetroGetNav2D(sFilename,lDebug) +%FFLASHRETROGETNAV2D Extracts navigator data from CS_FLASH_retro sequence +% DNAV = FFLASHRETROGETNAV(SFILENAME) Extracts navigator data DNAV from +% the siemens meas-data file SFILENAME. Must have been parsed with +% FMeasCreateLUT before. +% +% See also: FMEASCREATELUT +% +% Copyright 2014-2016 Christian Wuerslin, University of Tuebingen, Germany +% christian.wuerslin@med.uni-tuebingen.de +% and Thomas Kuestner, University of Tuebingen, Germany +% thomas.kuestner@med.uni-tuebingen.de + +if(nargin < 1) + lDebug = false; +end + +[sPath, sName, sExt] = fileparts(sFilename); + +% ------------------------------------------------------------------------- +% Get some relevant data from the drecksMDH +try + load(fullfile(sPath,[sName,'.mat']), 'SDrecksMDH'); + dBaseRes = SDrecksMDH.Geo.MatrixSize(1); + dTR = SDrecksMDH.Contrast.TR./1000; % in ms + if(isfield(SDrecksMDH.Geo,'EchoPosition')) + dEchoLine = SDrecksMDH.Geo.EchoPosition(1); + dEchoPartition = SDrecksMDH.Geo.EchoPosition(2); + else + dEchoLine = SDrecksMDH.Geo.MatrixSize(2)/2; + dEchoPartition = SDrecksMDH.Geo.MatrixSize(3)/2; + end + dNavPeriod = SDrecksMDH.Wip.NavPeriod; + dNavPERes = SDrecksMDH.Wip.NavRes(1); + +catch + % Load the loop counters + load([sPath, filesep, sName, '.mat']); + dBaseRes = 256; + dEchoLine = 128; + dEchoPartition = 36; + dNavPeriod = 200; + dNavPERes = 8; +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Read all projections (partition == echoPartition) AND (line == echoLine) +% Currently only uses the first echo, but could be extended to multi-echo +[dKSpace, iLC] = fMeasRead(sFilename, 'Set', [1 7], 'Seg', [0 60000], 'Eco', 0); +if(length(unique(iLC(:,10))) > 1) % in the case of switched on surrogate monitoring + lMask = true(size(iLC, 1), 1); + lMask = lMask & (iLC(:,10) == 1 | iLC(:,10) == 3 | iLC(:,10) == 5 | iLC(:,10) == 7); % binary encoded [ECG, Belt, Navi] -> cut out all cases in which Navi is on + iLC = iLC(lMask,:); + dKSpace = dKSpace(lMask,:); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Determine data size +iNChannels = double(iLC(1, 2)); +iNSamples = size(dKSpace, 2); +dNavPERes = length(unique(iLC(:,3))); % correct number of phase-encoding lines +iNMeasurements = size(dKSpace, 1)./(iNChannels.*dNavPERes); +if(mod(iNMeasurements,1) ~= 0) % happens if a navi at the end was not completely acquired + dUniqueNavi = unique(iLC(:,3)); + iLastpos = find(iLC(:,3) == max(dUniqueNavi),1,'last'); + dKSpace = dKSpace(1:iLastpos,:); + iLC = iLC(1:iLastpos,:); + iNMeasurements = size(dKSpace, 1)./(iNChannels.*dNavPERes); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Build up the kSpaces of all channels +dKSpace = reshape(dKSpace, [iNChannels, dNavPERes, iNMeasurements, iNSamples]); +dKSpace = permute(dKSpace, [4, 3, 2, 1]); % -> RO x t x PE x CH +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Reconstruct the 1-D projections for all measurements and all channels +dImg = fftshift(ifft(ifftshift(dKSpace))); +dImg = fftshift(ifft(ifftshift(dImg, 3), [], 3), 3); +dImg = flipdim(dImg, 1); % Invert the RO direction: 1-N -> H-F +dImg = dImg(iNSamples/4:iNSamples.*3/4 - 1, :, :, :); % RO x t x PE x CH + +dPower = sum(sum(sum(abs(dImg), 1), 2), 3); +dImg = dImg./repmat(dPower, [size(dImg, 1), size(dImg, 2), size(dImg, 3), 1]); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get x range of respiratory motion +dFreq = fft(dImg, [], 2); +dPower = dFreq.*conj(dFreq); +dIMGres = 1./(double(dNavPeriod)./1000.*double(iNMeasurements)); % The frequency resolution of dIMG in Hz +dPower = squeeze(sum(dPower(:, round(1./(5.*dIMGres)):round(1./(3.*dIMGres)), :, :), 2)); % RO x PE x CH +if(ismatrix(dPower)) % happens for BH acquisition, i.e iNPHASES=1 + dPower = permute(dPower,[1 3 2]); +end +dPowerInChan = squeeze(sum(dPower, 2)); % RO x CH +dPowerAcrossChannels = sum(dPowerInChan, 2); % RO x 1 +dPowerAcrossChannels(length(dPowerAcrossChannels).*3./4:end) = 0; % Prevent detection of regions in the abdomen +dPowerAcrossChannels = conv(dPowerAcrossChannels, fGaussianLP(20), 'same'); +[dMax, dX] = max(dPowerAcrossChannels); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Sort out Channels with no relevant information in target area +dMax = max(dPowerInChan(dX - 20: dX + 20, :)); +lGoodChannels = dMax > 0.2.*max(dMax); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the best PE line +dPowerInPE = squeeze(sum(sum(dPower(dX - 20:dX + 20, :, lGoodChannels), 3))); +[dVal, dPos] = max(dPowerInPE); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% find best corresponding channels according to best phase encoding +% position +dFreq = fft(dImg(:,:,dPos,:),[],2); +dPower = dFreq.*conj(dFreq); +dIMGres = 1./(double(dNavPeriod)./1000.*double(iNMeasurements)); % The frequency resolution of dIMG in Hz +dPowerInChan = squeeze(sum(dPower(:, round(1./(5.*dIMGres)):round(1./(3.*dIMGres)), :), 2)); % RO x CH +dPowerAcrossChannels = sum(dPowerInChan, 2); % RO x 1 +dPowerAcrossChannels(length(dPowerAcrossChannels).*3./4:end) = 0; % Prevent detection of regions in the abdomen +dPowerAcrossChannels = conv(dPowerAcrossChannels, fGaussianLP(20), 'same'); +[dMax, dX] = max(dPowerAcrossChannels); +dMax = max(dPowerInChan(dX - 20: dX + 20, :)); +lGoodChannels = dMax > 0.2.*max(dMax); +if(lDebug) + [lMode, iChaSel, dPos] = fRetroNaviChoosePos( dImg, find(lGoodChannels), dPos, 1 ); + lGoodChannels = false(size(lGoodChannels)); + lGoodChannels(iChaSel) = true; +end +dRelevantImg = squeeze(dImg(:, :, dPos, lGoodChannels)); % In-plane res: 2 mm/px +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Sort out channels, which have distortions in the relevant area (bending +% artifact) +dRelevantImg = dRelevantImg.*conj(dRelevantImg); +dMax = max(max(dRelevantImg)); +dMax = repmat(dMax, [size(dRelevantImg, 1), size(dRelevantImg, 2), 1]); +dSOSImg = sqrt(sum(dRelevantImg./dMax, 3)); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the navigator signal +iDisplacement = 80; % [mm] diaphragm displacement (max. +/- 80mm) +dDisplacement = round(iDisplacement/(SDrecksMDH.Geo.FOV(1)/SDrecksMDH.Geo.MatrixSize(1))); % [px] + +dRefImg = zeros(size(dSOSImg)); +dRefImg(:,end) = dSOSImg(:,end); +idx = 1:size(dRefImg,2); +dNav = zeros(1,size(dRefImg,2)); + +hF = waitbar(0, 'Getting Navigator'); +for i=size(dRefImg,2)-1:-1:2 + dRMSImg = zeros(size(dRefImg,1),2*dDisplacement+1); + tmp = dRefImg(:,idx(i+1:end)); + for iD = -dDisplacement:dDisplacement + dRMSImg(:,dDisplacement-iD+1) = sum((tmp - repmat(circshift(dSOSImg(:,idx(i)), iD),[1 size(tmp,2)])).^2,2); % RMS + waitbar((abs(i-size(dRefImg,2)-2)*(2*dDisplacement+1) + (iD + dDisplacement + 1))/((size(dRefImg,2)-2)*(2*dDisplacement+1)),hF); + end + [~, dNav(i)] = min(sum(dRMSImg(dX-round(dDisplacement/2):dX+round(dDisplacement/2),:))); % RMS + %[~, dNav(i)] = min(sum(dRMSImg)); % RMS + dNav(i) = dDisplacement + 1 - dNav(i); + dRefImg(:,idx(i)) = circshift(dSOSImg(:,idx(i)), dNav(i)); + waitbar(abs(i-size(dRefImg,2)-2)/(size(dRefImg,2)-2),hF); +end +close(hF); +dNav = -dNav; +dNav = conv(dNav, fGaussianLP(5), 'same'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Visualize the result +if(lDebug) + figure('Name','Navi'), imagesc(dSOSImg(:, 3:end)); + colormap gray; + hold all; + plot(dNav(3:end)-mean(dNav) + dX); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Interpolate the navigator data to TR intervals +load([sPath, filesep, sName, '.mat'], 'iLC'); +iLC = iLC(1:iNChannels:end, :); +iLC = iLC(iLC(:,7) == 0, :); % first echo +iLC = iLC(iLC(:, 1) == 2*dBaseRes, :); % only "real" readouts + +dNav = -dNav; +dNav = dNav - min(dNav); + +iNavInd = find((iLC(:,3) == dEchoLine) & (iLC(:,6) == dEchoPartition)); +if(length(iNavInd) ~= length(dNav)) % happens at the end when navi not fully acquired + iNavInd = iNavInd(1:length(dNav)); +end +dNavInt = interp1(iNavInd, dNav, 1:length(iLC), 'pchip'); +dNavInt_ms = interp1(iNavInd.*dTR, dNav, 1:length(iLC).*dTR, 'pchip'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Append the navigator data to the LUT file +save([sPath, filesep, sName, '.mat'], 'dNavInt', '-append'); +save([sPath, filesep, sName, '.mat'], 'dNavInt_ms', '-append'); +save([sPath, filesep, sName, '.mat'], 'dSOSImg', '-append'); +% ------------------------------------------------------------------------- \ No newline at end of file diff --git a/reconstruction/fRetroGetNav3D.m b/reconstruction/fRetroGetNav3D.m new file mode 100644 index 0000000..f8322e4 --- /dev/null +++ b/reconstruction/fRetroGetNav3D.m @@ -0,0 +1,241 @@ +function [dNav, dKSpace] = fRetroGetNav3D(sFilename,lDebug) +%FFLASHRETROGETNAV3D Extracts navigator data from CS_FLASH_retro sequence +% DNAV = FFLASHRETROGETNAV(SFILENAME) Extracts navigator data DNAV from +% the siemens meas-data file SFILENAME. Must have been parsed with +% FMeasCreateLUT before. +% +% See also: FMEASCREATELUT +% +% Copyright 2014-2016 Christian Wuerslin, University of Tuebingen, Germany +% christian.wuerslin@med.uni-tuebingen.de +% and Thomas Kuestner, University of Tuebingen, Germany +% thomas.kuestner@med.uni-tuebingen.de + +if(nargin < 1) + lDebug = false; +end + +[sPath, sName, sExt] = fileparts(sFilename); + +% ------------------------------------------------------------------------- +% Get some relevant data from the drecksMDH +try + load(fullfile(sPath,[sName,'.mat']), 'SDrecksMDH'); + dBaseRes = SDrecksMDH.Geo.MatrixSize(1); + dTR = SDrecksMDH.Contrast.TR./1000; % in ms + if(isfield(SDrecksMDH.Geo,'EchoPosition')) + dEchoLine = SDrecksMDH.Geo.EchoPosition(1); + dEchoPartition = SDrecksMDH.Geo.EchoPosition(2); + else + dEchoLine = SDrecksMDH.Geo.MatrixSize(2)/2; + dEchoPartition = SDrecksMDH.Geo.MatrixSize(3)/2; + end + dNavPeriod = SDrecksMDH.Wip.NavPeriod; + dNavPERes = SDrecksMDH.Wip.NavRes(1); + dNavSLRes = SDrecksMDH.Wip.NavRes(2); +catch + % Load the loop counters + load([sPath, filesep, sName, '.mat']); + dBaseRes = 256; + dEchoLine = 128; + dEchoPartition = 36; + dNavPeriod = 200; + dNavPERes = 8; + dNavSLRes = 8; +end +% ------------------------------------------------------------------------- + + +% ------------------------------------------------------------------------- +% Read all projections (partition == echoPartition) AND (line == echoLine) +% Currently only uses the first echo, but could be extended to multi-echo +[dKSpace, iLC] = fMeasRead(sFilename, 'Set', [1 7], 'Eco', 0); +if(length(unique(iLC(:,10))) > 1) % in the case of switched on surrogate monitoring + lMask = true(size(iLC, 1), 1); + lMask = lMask & (iLC(:,10) == 1 | iLC(:,10) == 3 | iLC(:,10) == 5 | iLC(:,10) == 7); + iLC = iLC(lMask,:); + dKSpace = dKSpace(lMask,:); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Determine data size +iNChannels = double(iLC(1, 2)); +iNSamples = size(dKSpace, 2); +dNavPERes = length(unique(iLC(:,3))); % correct number of phase-encoding lines +dNavSLRes = length(unique(iLC(:,6))); +iNMeasurements = size(dKSpace, 1)./(iNChannels.*dNavPERes.*dNavSLRes); +if(mod(iNMeasurements,1) ~= 0) % happens if navi was acquired at the end and was not completed due to end of scan time + % crop away this remaining end + iPhaU = unique(iLC(:,3)); + iSlU = unique(iLC(:,6)); + iLastNav = find(iLC(:,3) == iPhaU(1) & iLC(:,6) == iSlU(1),1,'last'); + iLC = iLC(1:iLastNav-iNChannels,:); + dKSpace = dKSpace(1:iLastNav-iNChannels,:); + iNMeasurements = size(dKSpace, 1)./(iNChannels.*dNavPERes.*dNavSLRes); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Build up the kSpaces of all channels +dKSpace = reshape(dKSpace, [iNChannels, dNavPERes, dNavSLRes, iNMeasurements, iNSamples]); +dKSpace = permute(dKSpace, [5, 4, 3, 2, 1]); % -> RO x t x SL x PE x CH +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Reconstruct the 1-D projections for all measurements and all channels +dImg = fftshift(ifft(ifftshift(dKSpace))); +dImg = fftshift(ifft(ifftshift(dImg, 3), [], 3), 3); +dImg = fftshift(ifft(ifftshift(dImg, 4), [], 4), 4); +dImg = flipdim(dImg, 1); % Invert the RO direction: 1-N -> H-F +dImg = dImg(iNSamples/4:iNSamples.*3/4 - 1, :, :, :, :); % RO x t x SL x PE x CH + +dPower = sum(sum(sum(sum(abs(dImg), 1), 2), 3), 4); +dImg = dImg./repmat(dPower, [size(dImg, 1), size(dImg, 2), size(dImg, 3), size(dImg, 4), 1]); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get x range of respiratory motion +dFreq = fft(dImg, [], 2); +dPower = dFreq.*conj(dFreq); +dIMGres = 1./(double(dNavPeriod)./1000.*double(iNMeasurements)); % The frequency resolution of dIMG in Hz +dPower = squeeze(sum(dPower(:, round(1./(5.*dIMGres)):round(1./(3.*dIMGres)), :, :, :), 2)); % RO x SL x PE x CH +if(ismatrix(dPower)) % happens for BH acquisition, i.e iNPHASES=1 + dPower = permute(dPower,[1 3 2]); +end +dPowerInChan = squeeze(sum(sum(dPower, 2),3)); % RO x CH +dPowerAcrossChannels = sum(dPowerInChan, 2); % RO x 1 +dPowerAcrossChannels(length(dPowerAcrossChannels).*3./4:end) = 0; % Prevent detection of regions in the abdomen +dPowerAcrossChannels = conv(dPowerAcrossChannels, fGaussianLP(20), 'same'); +[dMax, dX] = max(dPowerAcrossChannels); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Sort out Channels with no relevant information in target area +dMax = max(dPowerInChan(dX - 20: dX + 20, :)); +lGoodChannels = dMax > 0.2.*max(dMax); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the best PE line +dPowerInPE = squeeze(sum(sum(sum(dPower(dX - 20:dX + 20, :, :, lGoodChannels), 2),4))); +[dVal, dPosPE] = max(dPowerInPE); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the best SL line +dPowerInSL = squeeze(sum(sum(dPower(dX - 20:dX + 20, :, dPosPE, lGoodChannels),4))); +[dVal, dPosSL] = max(dPowerInSL); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% find best corresponding channels according to best phase encoding +% position +dFreq = fft(dImg(:,:,dPosSL,dPosPE,:),[],2); +dPower = dFreq.*conj(dFreq); +dIMGres = 1./(double(dNavPeriod)./1000.*double(iNMeasurements)); % The frequency resolution of dIMG in Hz +dPowerInChan = squeeze(sum(dPower(:, round(1./(5.*dIMGres)):round(1./(3.*dIMGres)), :), 2)); % RO x CH +dPowerAcrossChannels = sum(dPowerInChan, 2); % RO x 1 +dPowerAcrossChannels(length(dPowerAcrossChannels).*3./4:end) = 0; % Prevent detection of regions in the abdomen +dPowerAcrossChannels = conv(dPowerAcrossChannels, fGaussianLP(20), 'same'); +[dMax, dX] = max(dPowerAcrossChannels); +dMax = max(dPowerInChan(dX - 20: dX + 20, :)); +lGoodChannels = dMax > 0.2.*max(dMax); +if(lDebug) + [lMode, iChaSel, dPosPE, dPosSL] = fRetroNaviChoosePos( dImg, find(lGoodChannels), dPosPE, dPosSL ); + lGoodChannels = false(size(lGoodChannels)); + lGoodChannels(iChaSel) = true; +end +dRelevantImg = squeeze(dImg(:, :, dPosSL, dPosPE, lGoodChannels)); % In-plane res: 2 mm/px +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Sort out channels, which have distortions in the relevant area (bending +% artifact) +dRelevantImg = dRelevantImg.*conj(dRelevantImg); +dMax = max(max(dRelevantImg)); +dMax = repmat(dMax, [size(dRelevantImg, 1), size(dRelevantImg, 2), 1]); +dSOSImg = sqrt(sum(dRelevantImg./dMax, 3)); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the navigator signal +% dNavImg1 = imfilter(dNavImg, [1 1]./2, 'replicate'); +% dFilter = fspecial('log', [11, 1]); +% for iI = 1:size(dNavImg, 2) +% dNavImgHP(:,iI) = conv(dSOSImg(:,iI), dFilter, 'same'); +% end +% dNavImgInt = interp1(dNavImgHP, linspace(1, size(dNavImgHP, 1), 256), 'pchip'); +% lMaxima = [zeros(1, size(dNavImgInt, 2)); diff(dNavImgInt,[], 1)] > 0 & [diff(dNavImgInt, [], 1); zeros(1, size(dNavImgInt, 2))] < 0; +% [dMax, dNav] = max(dNavImgInt); +% dMax = repmat(dMax, [size(dNavImgInt, 1), 1]); +% lMaxima(dNavImgInt < 0.5*dMax) = false; +% dNav = zeros(size(dNavImgInt, 2), 1); +% for iI = 1:length(dNav), dNav(iI) = find(lMaxima(:, iI), 1, 'first'); end +% dNav = dNav./256.*size(dNavImgHP, 1); +% dNav = conv(dNav, fGaussianLP(5), 'same'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Get the navigator signal +iDisplacement = 80; % [mm] diaphragm displacement (max. +/- 80mm) +dDisplacement = round(iDisplacement/(SDrecksMDH.Geo.FOV(1)/SDrecksMDH.Geo.MatrixSize(1))); % [px] + +dRefImg = zeros(size(dSOSImg)); +dRefImg(:,end) = dSOSImg(:,end); +idx = 1:size(dRefImg,2); +dNav = zeros(1,size(dRefImg,2)); + +hF = waitbar(0, 'Getting Navigator'); +for i=size(dRefImg,2)-1:-1:2 + dRMSImg = zeros(size(dRefImg,1),2*dDisplacement+1); + tmp = dRefImg(:,idx(i+1:end)); + for iD = -dDisplacement:dDisplacement + dRMSImg(:,dDisplacement-iD+1) = sum((tmp - repmat(circshift(dSOSImg(:,idx(i)), iD),[1 size(tmp,2)])).^2,2); % RMS + waitbar((abs(i-size(dRefImg,2)-2)*(2*dDisplacement+1) + (iD + dDisplacement + 1))/((size(dRefImg,2)-2)*(2*dDisplacement+1)),hF); + end + [~, dNav(i)] = min(sum(dRMSImg(dX-round(dDisplacement/2):dX+round(dDisplacement/2),:))); % RMS + %[~, dNav(i)] = min(sum(dRMSImg)); % RMS + dNav(i) = dDisplacement + 1 - dNav(i); + dRefImg(:,idx(i)) = circshift(dSOSImg(:,idx(i)), dNav(i)); + waitbar(abs(i-size(dRefImg,2)-2)/(size(dRefImg,2)-2),hF); +end +close(hF); +dNav = -dNav; +dNav = conv(dNav, fGaussianLP(5), 'same'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Visualize the result +if(lDebug) + figure('Name','Navi'), imagesc(dSOSImg(:, 3:end)); + colormap gray; + hold all; + plot(dNav(3:end)-mean(dNav) + dX); +end +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Interpolate the navigator data to TR intervals +load([sPath, filesep, sName, '.mat'], 'iLC'); +iLC = iLC(1:iNChannels:end, :); +iLC = iLC(iLC(:,7) == 0, :); % first echo +iLC = iLC(iLC(:, 1) == 2*dBaseRes, :); % only "real" readouts + +dNav = -dNav; +dNav = dNav - min(dNav); + +iNavInd = find((iLC(:,3) == dEchoLine) & (iLC(:,6) == dEchoPartition)); +if(length(iNavInd) ~= length(dNav)) % happens at the end when navi not fully acquired + iNavInd = iNavInd(1:length(dNav)); +end +dNavInt = interp1(iNavInd, dNav, 1:length(iLC), 'pchip'); +dNavInt_ms = interp1(iNavInd.*dTR, dNav, 1:length(iLC).*dTR, 'pchip'); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Append the navigator data to the LUT file +save([sPath, filesep, sName, '.mat'], 'dNavInt', '-append'); +save([sPath, filesep, sName, '.mat'], 'dNavInt_ms', '-append'); +save([sPath, filesep, sName, '.mat'], 'dSOSImg', '-append'); +% ------------------------------------------------------------------------- \ No newline at end of file diff --git a/reconstruction/fRetroRecon4D_main.m b/reconstruction/fRetroRecon4D_main.m new file mode 100644 index 0000000..eb6e2a5 --- /dev/null +++ b/reconstruction/fRetroRecon4D_main.m @@ -0,0 +1,200 @@ +function dImg = fRetroRecon4D_main(sFilename, iNPhases, dTolerance, dTime, sGating, sGatingGather, lDebug) +% +% main function for CS Retro reconstruction +% +% Copyright 2014-2016 Christian Wuerslin, University of Tuebingen, Germany +% christian.wuerslin@med.uni-tuebingen.de +% and Thomas Kuestner, University of Tuebingen, Germany +% thomas.kuestner@med.uni-tuebingen.de + +% inputs +% sFilename string of TWIX measurement file +% iNPhases number of gates +% dTolerance view sharing blending factor(s) b of +% respiratory gates: 1 (non-overlapping) <= b <= 2 (completely overlapping) +% dTime scalar/vector/array of crop scan time(s) (0 := no cropping | scan time [s]) +% sGating string to select gating procedure +% 'percentile' select gate centroids according to 5% and 95% percentile +% 'kmeans' perform k-means clustering to select gate centroids +% sGatingGather string of sample gathering mode: +% 'closest' take closest sample to gate centroid +% 'collect' gather all samples and let the +% reconstruction decide for the most +% favourable one; not working for cardiac +% 'none' no k-Space population, show simulations of +% the k-Space sampling density +% +% output +% dImg reconstructed image + +% ------------------------------------------------------------------------- +% parse inputs +if nargin < 7, lDebug = false; end +if nargin < 6, sGatingGather = 'closest'; end +if nargin < 5, sGating = 'percentile'; end +if nargin < 4, dTime = 0; end +if nargin < 3, dTolerance = 1; end +if nargin < 2, iNPhases = 4; end +if(nargin < 1 || isempty(sFilename)) + [sFile, sPath] = uigetfile({'*.dat', 'ADC measdata (*.dat)'} ,'Select ADC measdata file', 'MultiSelect', 'off', pwd); + if(~isempty(sFile)) + [~, sName] = fileparts(sFile); + else + return; + end + sFilename = [sPath,sFile]; +end + +if(~exist('CS_reconstruction','file')) + error('CS_reconstruction code not found! Please download it from "https://github.com/thomaskuestner/CS_LAB" or put it on Matlab path'); +end +currpath = fileparts(mfilename('fullpath')); +addpath(genpath([currpath,filesep,'utils'])); + +% calculation precision +sPrecision = 'single'; +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% load raw measurment file +[sPath, sName] = fileparts(sFilename); +[~, ~, ~, para.drecksMDH, para.iLCPositions] = fMeas_main([sPath, filesep, sName, '.dat'], false); +load([sPath, filesep, sName, '.mat'], 'iLC'); +para.iLC = iLC; +clear 'iLC'; +para.drecksMDH.Wip.NSamples = 0; +para.drecksMDH.Wip.Phases = iNPhases; +para.measPara.sequenceName = 'CS_Retro'; +para.measPara.dim = [para.drecksMDH.Geo.MatrixSize(2), 2*para.drecksMDH.Geo.MatrixSize(1), para.drecksMDH.Geo.MatrixSize(3), iNPhases, double(para.iLC(1,2))]; +para.measPara.LCall = ones(1,4); +dNavPERes = para.drecksMDH.Wip.NavRes(1); +dNavSLRes = para.drecksMDH.Wip.NavRes(2); +if(para.measPara.dim(3) == 1) + para.measPara.dimension = '2D'; +else + if(para.measPara.dim(4) == 1) + para.measPara.dimension = '3D'; + else + para.measPara.dimension = '4D'; + end +end +iNEchos = length(unique(para.iLC(:,7))); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% prepare output file +if(isscalar(dTime)) + dTShow = num2str(dTime,'%03d'); +else + dTShow = dTime.'; + dTShow = strrep(num2str(dTShow(:).','%03d'),' ',''); +end +sSaveFilename = [sPath, filesep, sName, sprintf('_Ph%1d_Tol%03.0f_t%s_%s_%s', iNPhases, 100*dTolerance, dTShow, sGating, sGatingGather)]; +% ------------------------------------------------------------------------- + +for iEcho = 1:iNEchos + if(iNEchos > 1) + sSaveFilename = [sSaveFilename,'_',num2str(iEcho,'E%02d')]; + end + [~, sFilenameShow, ~] = fileparts(sSaveFilename); + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % extract self-navigation signal + if(~any(arrayfun(@(x) strcmp(x.name,'dNavInt'), whos('-file', [sPath, filesep, sName, '.mat'])))) + if(dNavPERes == 1 && dNavSLRes == 1) % 1D navigator signal + dNav = fRetroGetNav(sFilename,lDebug); + elseif(dNavPERes > 1 && dNavSLRes == 1) % 2D navigator signal + dNav = fRetroGetNav2D(sFilename,lDebug); + else % 3D navigator signal + dNav = fRetroGetNav3D(sFilename,lDebug); + end + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % perform retrospective gating + if(~exist([sSaveFilename,'_kSpace.mat'],'file')) + kSpace = fRetroGating(sFilename, iNPhases, dTolerance, dTime, sGating, sGatingGather, sPrecision, iEcho, false); + save([sSaveFilename,'_kSpace.mat'], 'kSpace', '-v7.3'); + else + fprintf('Loading k-space: %s\n',sFilenameShow); + load([sSaveFilename,'_kSpace.mat']); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % Compressed Sensing reconstruction + if(strcmp(sGatingGather,'collect')) + kSpace = mat2cell(kSpace, size(kSpace, 1), size(kSpace, 2), size(kSpace, 3), size(kSpace, 4), size(kSpace,5), ones(1, size(kSpace, 6))); + kSpace = shiftdim(kSpace, 4); + else + kSpace = mat2cell(kSpace(:,:,:,:,:), size(kSpace, 1), size(kSpace, 2), size(kSpace, 3), size(kSpace, 4), ones(1, size(kSpace, 5))); + kSpace = shiftdim(kSpace, 3); + end + + nSize = size(kSpace{1}); + para = fPrepareRecon(para,nSize,sPath,sGatingGather); + [imgAll,imgCha] = CS_reconstruction(kSpace,para); + if(strcmp(sGatingGather,'collect') || ndims(imgAll) == 4) + dImg = imgAll; + else + dImg = zeros([size(imgAll,1), size(imgAll,2), nSize(3), nSize(4)]); + for i=1:iNPhases + dImg(:,:,:,i) = imgAll(:,:,(i-1)*nSize(3)+1:i*nSize(3)); + end + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % save results + save([sSaveFilename,'_channel.mat'], 'imgCha', '-v7.3'); + save([sSaveFilename,'_recon.mat'], 'dImg', '-v7.3'); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +end +end + + +function para = fPrepareRecon(para,nSize,sPath,sGatingGather) +% set CS reconstruction parameters + nPha = nSize(1); + nFreq = nSize(2); + nZ = nSize(3); + nTime = nSize(4); + if(length(nSize) > 4) + nSmp = nSize(5); + else + nSmp = 1; + end + + % additional length of gating dimension + % drecksMDH v2.0 + para.drecksMDH.Wip.Phases = nTime; + if(strcmp(sGatingGather,'collect')) + para.drecksMDH.Wip.NSamples = nSmp; + end + + % CS recon parameter + if(strcmp(para.measPara.dimension,'3D')) + para.trafo.trafodim = [1 2 1 0; 1 0 1 0]; % 3D + elseif(strcmp(para.measPara.dimension,'4D')) + para.trafo.trafodim = [1 2 1 0; 0 0 0 1]; % 4D + end + para.cstype = 'FOCUSS'; + para.transformation = 'pca'; + para.trafo.scrambledim = [1 1 1 0]; + para.lambda = 0.01; + para.lambdaCalib = 0; % GRAPPA off + para.lambdaTV = 0; + para.lambdaESPReSSo = 0; + para.lambdaMC = 0; + para.sScaling = 'self'; + para.flagOversampling = logical([1 0 0]); % oversampling correction + para.prop.flagPlot = false; % Imagine off + para.prop.flagOptim = false; % no FFT optimization + para.savePath = sPath; + +end \ No newline at end of file diff --git a/reconstruction/utils/OptimalColor.m b/reconstruction/utils/OptimalColor.m new file mode 100644 index 0000000..2c1e469 --- /dev/null +++ b/reconstruction/utils/OptimalColor.m @@ -0,0 +1,37 @@ +function dColormap = OptimalColor(iNBins) +%OPTIMALCOLORS Example custom colormap for use with imagine +% DCOLORMAP = OPTIMALCOLOR(INBINS) returns a double colormap array of size +% (INBINS, 3). Use this template to implement you own custom colormaps. +% Imagine will interpret all m-files in this folder as potential colormap- +% generating functions an list them using the filename. + +% ------------------------------------------------------------------------- +% Process input +if ~nargin, iNBins = 256; end +iNBins = uint16(iNBins); +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Create look-up tables (pairs of x- and y-vectors) for the three colors +dYRed = [0; 0.471; 0.471; 0.518; 0.518; 1; 1]; +dXRed = [1; 31; 88; 100; 205; 254; 256]; + +dYGrn = [0; 0; 1; 1]; +dXGrn = [1; 30; 132; 256]; + +dYBlu = [0; 0; 1; 1]; +dXBlu = [1; 79; 181; 256]; +% ------------------------------------------------------------------------- + +% ------------------------------------------------------------------------- +% Interpolate and concatenate vectors to the final colormap +dRedInt = interp1(dXRed, dYRed, linspace(1, 255, iNBins)'); +dGrnInt = interp1(dXGrn, dYGrn, linspace(1, 255, iNBins)'); +dBluInt = interp1(dXBlu, dYBlu, linspace(1, 255, iNBins)'); + +dColormap = [dRedInt, dGrnInt, dBluInt]; +% ------------------------------------------------------------------------- + +% ========================================================================= +% *** END OF FUNCTION OptimalColor +% ========================================================================= \ No newline at end of file diff --git a/reconstruction/utils/fGaussianLP.m b/reconstruction/utils/fGaussianLP.m new file mode 100644 index 0000000..b24de5e --- /dev/null +++ b/reconstruction/utils/fGaussianLP.m @@ -0,0 +1,27 @@ +function dDataOut = fGaussianLP(dData, dW) +%GAUSSIANLP performs a 1D gaussian lowpass filter. +% +% HOUT = GAUSSIANLP(HIN, L, MODE) performs a gaussian lowpass of length L +% to the array in HIN. The gaussian lowpass is defined in the range +% [-floor(L/2), floor(L/2)] and the variance sigma of the Gaussinan is +% chosen such, that the definition boundaries of the Gaussian are equal to +% 3*sigma. MODE defines the method for padding the input array HIN and can +% be either 'circular', 'replicate' or 'symmetroc'. See also the +% documentation of 'padarray' for more information on the padding methods. + +if nargin == 1, dW = dData; end + +% ------------------------------------------------------------------------- +% Create Gaussian kernel. +dX = (-floor(dW/2):floor(dW/2))'; +dX = dX.*6./dW; +dG = exp(-0.5.*dX.^2); +dG = dG./sum(dG); +if nargin == 1 + dDataOut = dG; + return +end +% ------------------------------------------------------------------------- + +dDataOut = zeros(size(dData)); +for iI = 1:size(dData, 2), dDataOut(:,iI) = conv(dData(:,iI), dG, 'same'); end \ No newline at end of file