Ультразвуковая визуализация

Здравствуйте, я пытаюсь сделать более быстрый код формирования луча (используя динамическую фокусировку) в Matlab, векторизовав все переменные, которые необходимо обработать. Оригинальный код ниже:

function out = BF(in, maxAprSz, Fs, Fnum)
% The following script take the pre-beamform data and creates beamformed
% image by applying parallel beamformers to the same data. 
%
% input:
%   in:             the first dimension should be scan lines and the second
%                   dimension should be the channel samples
%   maxAprSz:       maximum size of the aperture for beamforming
%   Fs              Acquisition sampling frequency 80*1e6, 40MHz, ... 10*1e6
%   Fnum            desired F number=focal depth/(2*aperture)
% output:
%   out: beamformed rf data

nl = size(in,2);   % number of lines
ns = size(in,1);   % number of samples

pitch = 0.3 * 1e-3;         % spacing between lines/channels in the lateral direction [m]
c = 1540;                   % speed of sound 1540 [m/s]
sampleSpacing = c/Fs/2;     % spacing between samples in the axial direction in milimeter for Fs

out = zeros(nl,ns);

for i = 1:nl    % for each line/channel

  for j=1:ns  % find the value for each sample

    % find the sample location
    Z =  (j ) * sampleSpacing ; %focal depth
    %place of i element in x axis

    % calculate the aperture based on the F number
    fulAprSz = Z/(2*Fnum); 
    hlfAprSz = floor(fulAprSz / pitch);
    % check to make sure we do not go beyond max apr
    if (hlfAprSz > maxAprSz/2)
        hlfAprSz = floor(maxAprSz / 2);
    end

    x = -hlfAprSz: hlfAprSz;    % aperture indices
    fulAprSz = 2*hlfAprSz + 1;

    X = i * pitch;
    X1 = (i + x) * pitch;
    % calc delays based on sample depth and receive aperture

    delays = ( Z + sqrt( Z^2 + (X-X1).^2 ) ) / c * Fs; 
    delays = round(delays); % no interpolation used in this version

    win = hanning(fulAprSz)';   % windowing used for apodization
    chnls = zeros(1,fulAprSz);  % will be filled with proper signal from each channel

    cntr = i;       % center of apreture
    apr = cntr + x; % full aperture indices

    % find the corresponding value from each channel
    for k = 1:fulAprSz  

        chlIndx = apr(k);
        if chlIndx<1, continue, end; 
        if chlIndx>nl, continue, end;

        chlSmpl = delays(k);

        if chlSmpl<1, continue, end;
        if chlSmpl>ns, continue, end;

        chnls(k) = in(chlIndx, chlSmpl); 

    end;

    % apodization : ideally has to be a function of depth
    chnls = win .* chnls;

    % beamforming

    out(i,j) = sum( chnls );
    end;
end

Я думал сделать реализацию с массивами ячеек (потому что fulAprSz изменяется в каждом Z из-за использования Fnum). Я сделал приведенную ниже реализацию, и я рассчитал задержки для одного канала (столбца) для каждого Z (глубина). Эти задержки одинаковы для каждого канала. Я застрял на том, как найти для каждого канала выборки, связанные с этими задержками, а затем суммировать их, чтобы я мог взять выходную диаграмму, сформированную на выборке. В приведенном ниже коде nl=128 (каналы) и ns=2080 (выборки) в качестве примера измерений входных данных. У кого-нибудь есть идеи?

nl=128; %channels
ns=2080; %samples

fs=40e6; %sampling frequency
Fnum=2; %f number

pitch=0.3*1e-3; %space between each channel [m]
c = 1540; %sound of speed [m/s]                 
sampleSpacing = c/fs/2; 

out=zeros(nl,ns);

z=(1:ns)*sampleSpacing; %depth

fulAprSz = z/(2*Fnum); %full aperture size according to fnum
hlfAprSz = floor(fulAprSz / pitch);
fulAprSz = 2*hlfAprSz + 1;

for i=1:ns
    sizeM=fulAprSz(i); %size of each matrix
    win{i}=hanning(sizeM); %apodization matrix for each z
    X1{i}=(-hlfAprSz(i):hlfAprSz(i)); %indices of aperture
    x{i}=X1{i}*pitch; %aperture in meters
    delays{i} = round (( z(i) + sqrt( z(i).^2 + x{i}.^2 ) ) / c * fs); %delays for a single line
end

0 ответов

Другие вопросы по тегам