<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="bbPress/1.0.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>k-Wave User Forum &#187; Topic: linear array UT simulation in heterogeneous medium</title>
		<link>http://www.k-wave.org/forum/topic/linear-array-ut-simulation-in-heterogeneous-medium</link>
		<description>Support for the k-Wave MATLAB toolbox</description>
		<language>en-US</language>
		<pubDate>Wed, 13 May 2026 00:26:13 +0000</pubDate>
		<generator>http://bbpress.org/?v=1.0.2</generator>
		<textInput>
			<title><![CDATA[Search]]></title>
			<description><![CDATA[Search all topics from these forums.]]></description>
			<name>q</name>
			<link>http://www.k-wave.org/forum/search.php</link>
		</textInput>
		<atom:link href="http://www.k-wave.org/forum/rss/topic/linear-array-ut-simulation-in-heterogeneous-medium" rel="self" type="application/rss+xml" />

		<item>
			<title>Bradley Treeby on "linear array UT simulation in heterogeneous medium"</title>
			<link>http://www.k-wave.org/forum/topic/linear-array-ut-simulation-in-heterogeneous-medium#post-4136</link>
			<pubDate>Sun, 24 Nov 2013 15:20:51 +0000</pubDate>
			<dc:creator>Bradley Treeby</dc:creator>
			<guid isPermaLink="false">4136@http://www.k-wave.org/forum/</guid>
			<description>&#60;p&#62;Hi Eun,&#60;/p&#62;
&#60;p&#62;There seems to be a couple of issues. First, your perfectly matched layer (PML) is too small to be effective. This should be at least 10 grid points, otherwise you will notice the waves wrapping from one side of the domain to the other. There's some more information in Section 2.6 of the &#60;a href=&#34;http://www.k-wave.org/documentation.php&#34;&#62;k-Wave Manual&#60;/a&#62; that might be helpful (see also Fig. 2.3), as well as in the Numerical Analysis -&#38;gt; Controlling The Absorbing Boundary Layer Example in the MATLAB documentation. &#60;/p&#62;
&#60;p&#62;Second, it appears that your transducer is within the PML. You should make sure that your source is outside the PML, or set &#60;code&#62;&#38;#39;PMLInside&#38;#39;&#60;/code&#62; to &#60;code&#62;false&#60;/code&#62;. Remember, your simulations will be fastest when the total grid dimensions (including the PML) have small prime factors. You can check this using &#60;code&#62;checkFactors&#60;/code&#62;.&#60;/p&#62;
&#60;p&#62;Brad.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>sheun on "linear array UT simulation in heterogeneous medium"</title>
			<link>http://www.k-wave.org/forum/topic/linear-array-ut-simulation-in-heterogeneous-medium#post-4098</link>
			<pubDate>Fri, 22 Nov 2013 02:37:49 +0000</pubDate>
			<dc:creator>sheun</dc:creator>
			<guid isPermaLink="false">4098@http://www.k-wave.org/forum/</guid>
			<description>&#60;p&#62;first i would like to thank you for the tool, it helped a lot in understanding acoustics in general.&#60;/p&#62;
&#60;p&#62;I am trying to model linear array sensor in heterogenous medium and see how the reflected signal from the medium boundary looks like. Two mediums with different &#34;sound speed&#34;, &#34;density&#34;, &#34;att. coefficient&#34; are located top and bottom, and the sensor are located at the top surface of the upper medium.&#60;/p&#62;
&#60;p&#62;When I run the code, it looks like the waves are propagating in both direction. I was expecting for the waves to propagate in only one direction (propagating towards the bottom).&#60;br /&#62;
This doesn't happen when I switch the medium parameters between the top and bottom.&#60;/p&#62;
&#60;p&#62;Below is the code i used. I really appreciate if you could give me some direction as to how I should modify the codes.&#60;/p&#62;
&#60;p&#62;clear all;&#60;/p&#62;
&#60;p&#62;% simulation settings&#60;br /&#62;
DATA_CAST = 'single';&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% DEFINE THE K-WAVE GRID&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% set the size of the perfectly matched layer (PML)&#60;br /&#62;
PML_X_SIZE = 2;            % [grid points]&#60;br /&#62;
PML_Y_SIZE = 1;            % [grid points]&#60;br /&#62;
PML_Z_SIZE = 1;            % [grid points]&#60;/p&#62;
&#60;p&#62;% set total number of grid points not including the PML&#60;br /&#62;
Nx = 196 - 2*PML_X_SIZE;    % [grid points]&#60;br /&#62;
Ny = 126 - 2*PML_Y_SIZE;    % [grid points]&#60;br /&#62;
Nz = 62 - 2*PML_Z_SIZE;     % [grid points]&#60;/p&#62;
&#60;p&#62;% set desired grid size in the x-direction not including the PML&#60;br /&#62;
x = 0.75/1000;                  % [m]&#60;/p&#62;
&#60;p&#62;% calculate the spacing between the grid points&#60;br /&#62;
dx = x;                  % [m]&#60;br /&#62;
dy = dx;                    % [m]&#60;br /&#62;
dz = dx;                    % [m]&#60;/p&#62;
&#60;p&#62;% create the k-space grid&#60;br /&#62;
kgrid = makeGrid(Nx, dx, Ny, dy, Nz, dz);&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% DEFINE THE MEDIUM PARAMETERS&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% define the properties of the propagation medium&#60;br /&#62;
medium.sound_speed = 2000*ones(Nx,Ny,Nz)     ;      % [m/s] 2nd&#60;br /&#62;
medium.sound_speed(1:Nx/2,:,:) = 1000 ;      % [m/s] 1st 101&#60;br /&#62;
medium.density = 2000*ones(Nx,Ny,Nz);               % [kg/m^3] 2nd&#60;br /&#62;
medium.density(1:round(Nx/2),:,:) = 1134 ;          % [kg/m^3] 1st&#60;/p&#62;
&#60;p&#62;medium.alpha_coeff = 0.001*ones(Nx,Ny,Nz);            % [dB/(MHz^y cm)] 2nd&#60;br /&#62;
medium.alpha_coeff(1:round(Nx/2),:,:)=0.01   ;    % [dB/(MHz^y cm)] 1st&#60;br /&#62;
medium.alpha_power = 1.5;&#60;br /&#62;
medium.BonA = 6;&#60;/p&#62;
&#60;p&#62;% create the time array&#60;br /&#62;
t_end = 120e-6;                  % [s]&#60;br /&#62;
kgrid.t_array = makeTime(kgrid, medium.sound_speed, [], t_end);&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% DEFINE THE SOURCE&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% define properties of the input signal&#60;br /&#62;
source_strength = 10e6;          % [Pa]&#60;br /&#62;
tone_burst_freq = 2.25e6;        % [Hz]&#60;br /&#62;
tone_burst_cycles = 3;&#60;/p&#62;
&#60;p&#62;% create the input signal using toneBurst&#60;br /&#62;
input_signal = toneBurst(1/kgrid.dt, tone_burst_freq, tone_burst_cycles);&#60;/p&#62;
&#60;p&#62;% scale the source magnitude by the source_strength divided by the&#60;br /&#62;
% impedance (the source is assigned to the particle velocity)&#60;br /&#62;
input_signal = (source_strength./(1000*1134)).*input_signal;&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% DEFINE THE ULTRASOUND TRANSDUCER&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% physical properties of the transducer&#60;br /&#62;
transducer.number_elements = 16;    % total number of transducer elements&#60;br /&#62;
transducer.element_width = 1;       % width of each element [grid points/voxels]&#60;br /&#62;
transducer.element_length = 12*4/3;     % length of each element [grid points/voxels]&#60;br /&#62;
transducer.element_spacing = 0;     % spacing (kerf  width) between the elements [grid points/voxels]&#60;br /&#62;
transducer.radius = inf;            % radius of curvature of the transducer [m]&#60;/p&#62;
&#60;p&#62;% calculate the width of the transducer in grid points&#60;br /&#62;
transducer_width = transducer.number_elements*transducer.element_width ...&#60;br /&#62;
    + (transducer.number_elements - 1)*transducer.element_spacing;&#60;/p&#62;
&#60;p&#62;% use this to position the transducer in the middle of the computational grid&#60;br /&#62;
transducer.position = round([1, Ny/2 - transducer_width/2, Nz/2 - transducer.element_length/2]);&#60;/p&#62;
&#60;p&#62;% properties used to derive the beamforming delays&#60;br /&#62;
transducer.sound_speed = 1000;                 % sound speed [m/s]&#60;br /&#62;
transducer.focus_distance = 70/1000;           % focus distance [m]&#60;br /&#62;
transducer.elevation_focus_distance = 68/1000; % focus distance in the elevation plane [m]&#60;br /&#62;
transducer.steering_angle = 0;                 % steering angle [degrees]&#60;/p&#62;
&#60;p&#62;% apodization&#60;br /&#62;
transducer.transmit_apodization = 'Hanning';&#60;br /&#62;
transducer.receive_apodization = 'Rectangular';&#60;/p&#62;
&#60;p&#62;% define the transducer elements that are currently active&#60;br /&#62;
number_active_elements = 16;&#60;br /&#62;
transducer.active_elements = ones(transducer.number_elements, 1);&#60;br /&#62;
%transducer.active_elements = zeros(transducer.number_elements, 1);&#60;br /&#62;
%transducer.active_elements(21:52) = 1;&#60;/p&#62;
&#60;p&#62;% append input signal used to drive the transducer&#60;br /&#62;
transducer.input_signal = input_signal;&#60;/p&#62;
&#60;p&#62;% create the transducer using the defined settings&#60;br /&#62;
transducer = makeTransducer(kgrid, transducer);&#60;/p&#62;
&#60;p&#62;% print out transducer properties&#60;br /&#62;
transducer.properties;&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% RUN THE SIMULATION&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% set the input settings&#60;br /&#62;
input_args = {'DisplayMask', transducer.active_elements_mask, ...&#60;br /&#62;
    'PMLInside', true, 'PlotPML', true, 'PMLSize', [PML_X_SIZE, PML_Y_SIZE, PML_Z_SIZE], ...&#60;br /&#62;
    'DataCast', DATA_CAST, 'PlotScale', [-source_strength/32, source_strength/32]};&#60;/p&#62;
&#60;p&#62;% run the simulation&#60;br /&#62;
%[sensor_data] = kspaceFirstOrder3D(kgrid, medium, transducer, transducer, input_args{:});&#60;br /&#62;
[sensor_data] = kspaceFirstOrder3D(kgrid, medium, transducer, transducer, input_args{:});&#60;/p&#62;
&#60;p&#62;% extract a single scan line from the sensor data using the current&#60;br /&#62;
% beamforming settings&#60;br /&#62;
scan_line = transducer.scan_line(sensor_data);&#60;br /&#62;
save a_scan_eun scan_line;&#60;br /&#62;
% =========================================================================&#60;br /&#62;
% VISUALISATION&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% plot the recorded time series&#60;br /&#62;
figure;&#60;br /&#62;
stackedPlot(kgrid.t_array*1e6, sensor_data);&#60;br /&#62;
xlabel('Time [\mus]');&#60;br /&#62;
ylabel('Transducer Element');&#60;br /&#62;
title('Recorded Pressure');&#60;/p&#62;
&#60;p&#62;% plot the scan line&#60;br /&#62;
figure;&#60;br /&#62;
plot(kgrid.t_array*1e6, scan_line, 'k-');&#60;br /&#62;
xlabel('Time [\mus]');&#60;br /&#62;
ylabel('Pressure [au]');&#60;br /&#62;
title('Scan Line After Beamforming');
&#60;/p&#62;</description>
		</item>

	</channel>
</rss>
