<?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: Why can&#039;t I change the frequency to 40MHz</title>
		<link>http://www.k-wave.org/forum/topic/why-cant-i-change-the-frequency-to-40mhz</link>
		<description>Support for the k-Wave MATLAB toolbox</description>
		<language>en-US</language>
		<pubDate>Tue, 12 May 2026 23:07:57 +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/why-cant-i-change-the-frequency-to-40mhz" rel="self" type="application/rss+xml" />

		<item>
			<title>yuanbo on "Why can&#039;t I change the frequency to 40MHz"</title>
			<link>http://www.k-wave.org/forum/topic/why-cant-i-change-the-frequency-to-40mhz#post-8860</link>
			<pubDate>Tue, 18 Jul 2023 07:24:50 +0000</pubDate>
			<dc:creator>yuanbo</dc:creator>
			<guid isPermaLink="false">8860@http://www.k-wave.org/forum/</guid>
			<description>&#60;p&#62;% Defining An Ultrasound Transducer Example&#60;br /&#62;
%&#60;br /&#62;
% In principle, simulations using diagnostic ultrasound transducers can be&#60;br /&#62;
% run following the examples given under Time Varying Source Problems.&#60;br /&#62;
% However, assigning the grid points that belong to each transducer&#60;br /&#62;
% element, and then assigning the correctly delayed input signals to each&#60;br /&#62;
% point of each element can be a laborious task. For this purpose, a&#60;br /&#62;
% special input object created using the kWaveTransducer class can be&#60;br /&#62;
% substituted for either the source or sensor inputs (or both). This&#60;br /&#62;
% example illustrates how this object is created and can be used to&#60;br /&#62;
% simulate the field produced by an ultrasound transducer.&#60;br /&#62;
%&#60;br /&#62;
% Note, transducer inputs can only be used in 3D simulations and thus these&#60;br /&#62;
% examples are inherently memory and CPU intensive. Whilst the grid sizes&#60;br /&#62;
% and source frequencies used in the examples have been scaled down for the&#60;br /&#62;
% purpose of demonstrating the capabilities of the toolbox (the inputs do&#60;br /&#62;
% not necessarily represent realistic ultrasound settings), they still&#60;br /&#62;
% require a comparatively large amount of computational resources. To&#60;br /&#62;
% reduce this load, it is advised to run the simulations in single&#60;br /&#62;
% precision by setting the optional input 'DataCast' to 'single'.&#60;br /&#62;
% Similarly, if you have access to a recent model GPU and the MATLAB&#60;br /&#62;
% Parallel Computing Toolbox R2012a or later, the simulation times can be&#60;br /&#62;
% significantly reduced by setting 'DataCast' to 'gpuArray-single'.&#60;br /&#62;
% Alternatively, the simulations can be run using the optimised C++ code.&#60;br /&#62;
% See the k-Wave Manual for more information.&#60;br /&#62;
%&#60;br /&#62;
% The creation of a kWaveTransducer object will only work in versions of&#60;br /&#62;
% MATLAB recent enough to support user defined classes.&#60;br /&#62;
%&#60;br /&#62;
% author: Bradley Treeby&#60;br /&#62;
% date: 20th July 2011&#60;br /&#62;
% last update: 11th June 2017&#60;br /&#62;
%&#60;br /&#62;
% This function is part of the k-Wave Toolbox (&#60;a href=&#34;http://www.k-wave.org&#34; rel=&#34;nofollow&#34;&#62;http://www.k-wave.org&#60;/a&#62;)&#60;br /&#62;
% Copyright (C) 2011-2017 Bradley Treeby&#60;/p&#62;
&#60;p&#62;% This file is part of k-Wave. k-Wave is free software: you can&#60;br /&#62;
% redistribute it and/or modify it under the terms of the GNU Lesser&#60;br /&#62;
% General Public License as published by the Free Software Foundation,&#60;br /&#62;
% either version 3 of the License, or (at your option) any later version.&#60;br /&#62;
%&#60;br /&#62;
% k-Wave is distributed in the hope that it will be useful, but WITHOUT ANY&#60;br /&#62;
% WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS&#60;br /&#62;
% FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for&#60;br /&#62;
% more details.&#60;br /&#62;
%&#60;br /&#62;
% You should have received a copy of the GNU Lesser General Public License&#60;br /&#62;
% along with k-Wave. If not, see &#38;lt;http://www.gnu.org/licenses/&#38;gt;. &#60;/p&#62;
&#60;p&#62;clearvars;&#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 = 20;            % [grid points]&#60;br /&#62;
PML_Y_SIZE = 10;            % [grid points]&#60;br /&#62;
PML_Z_SIZE = 10;            % [grid points]&#60;/p&#62;
&#60;p&#62;% set total number of grid points not including the PML&#60;br /&#62;
Nx = 128 - 2*PML_X_SIZE;    % [grid points]&#60;br /&#62;
Ny = 128 - 2*PML_Y_SIZE;    % [grid points]&#60;br /&#62;
Nz = 64 - 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 = 40e-3;                  % [m]&#60;/p&#62;
&#60;p&#62;% calculate the spacing between the grid points&#60;br /&#62;
dx = x/Nx;                  % [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 = kWaveGrid(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 = 1540;      % [m/s]&#60;br /&#62;
medium.density = 1000;          % [kg/m^3]&#60;br /&#62;
medium.alpha_coeff = 0.75;      % [dB/(MHz^y cm)]&#60;br /&#62;
medium.alpha_power = 2;&#60;br /&#62;
medium.BonA = 6;&#60;/p&#62;
&#60;p&#62;% create the time array&#60;br /&#62;
t_end = 40e-6;                  % [s]&#60;br /&#62;
kgrid.makeTime(medium.sound_speed, [], t_end);&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% DEFINE THE INPUT SIGNAL&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% define properties of the input signal&#60;br /&#62;
source_strength = 1e6;          % [Pa]&#60;br /&#62;
tone_burst_freq = 40e6;        % [Hz]&#60;br /&#62;
tone_burst_cycles = 1;&#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 ./ (medium.sound_speed * medium.density)) .* 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 = 72;    % total number of transducer elements&#60;br /&#62;
transducer.element_width = 1;       % width of each element [grid points]&#60;br /&#62;
transducer.element_length = 12;     % length of each element [grid points]&#60;br /&#62;
transducer.element_spacing = 0;     % spacing (kerf width) between the elements [grid points]&#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 = 1540;                  % sound speed [m/s]&#60;br /&#62;
transducer.focus_distance = 20e-3;              % focus distance [m]&#60;br /&#62;
transducer.elevation_focus_distance = 19e-3;    % 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 = 'Rectangular';&#60;br /&#62;
transducer.receive_apodization = 'Rectangular';&#60;/p&#62;
&#60;p&#62;% define the transducer elements that are currently active&#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 = kWaveTransducer(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;
% DEFINE SENSOR MASK&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% create a binary sensor mask with four detection positions&#60;br /&#62;
sensor.mask = zeros(Nx, Ny, Nz);&#60;br /&#62;
sensor.mask([Nx/4, Nx/2, 3*Nx/4], Ny/2, Nz/2) = 1;&#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.all_elements_mask &#124; sensor.mask, ...&#60;br /&#62;
    'PMLInside', false, 'PlotPML', false, 'PMLSize', [PML_X_SIZE, PML_Y_SIZE, PML_Z_SIZE], ...&#60;br /&#62;
    'DataCast', DATA_CAST, 'PlotScale', [-1/2, 1/2] * source_strength};&#60;/p&#62;
&#60;p&#62;% run the simulation&#60;br /&#62;
[sensor_data] = kspaceFirstOrder3D(kgrid, medium, transducer, sensor, input_args{:});&#60;/p&#62;
&#60;p&#62;% calculate the amplitude spectrum of the input signal and the signal&#60;br /&#62;
% recorded each of the sensor positions&#60;br /&#62;
[f_input, as_input] = spect([input_signal, zeros(1, 2 * length(input_signal))], 1/kgrid.dt);&#60;br /&#62;
[~, as_1] = spect(sensor_data(1, :), 1/kgrid.dt);&#60;br /&#62;
[~, as_2] = spect(sensor_data(2, :), 1/kgrid.dt);&#60;br /&#62;
[f, as_3] = spect(sensor_data(3, :), 1/kgrid.dt);&#60;/p&#62;
&#60;p&#62;% =========================================================================&#60;br /&#62;
% VISUALISATION&#60;br /&#62;
% =========================================================================&#60;/p&#62;
&#60;p&#62;% plot the input signal and its frequency spectrum&#60;br /&#62;
figure;&#60;br /&#62;
subplot(2, 1, 1);&#60;br /&#62;
plot((0:kgrid.dt:(length(input_signal) - 1) * kgrid.dt) * 1e6, input_signal, 'k-');&#60;br /&#62;
xlabel('Time [\mus]');&#60;br /&#62;
ylabel('Particle Velocity [m/s]');&#60;/p&#62;
&#60;p&#62;subplot(2, 1, 2);&#60;br /&#62;
plot(f_input .* 1e-6, as_input./max(as_input(:)), 'k-');&#60;br /&#62;
hold on;&#60;br /&#62;
line([tone_burst_freq, tone_burst_freq] .* 1e-6, [0 1], 'Color', 'k', 'LineStyle', '--');&#60;br /&#62;
xlabel('Frequency [MHz]');&#60;br /&#62;
ylabel('Amplitude Spectrum [au]');&#60;br /&#62;
f_max = medium.sound_speed / (2 * dx);&#60;br /&#62;
set(gca, 'XLim', [0, f_max .* 1e-6]);&#60;/p&#62;
&#60;p&#62;% plot the recorded time series&#60;br /&#62;
figure;&#60;br /&#62;
stackedPlot(kgrid.t_array * 1e6, {'Sensor Position 1', 'Sensor Position 2', 'Sensor Position 3'}, sensor_data);&#60;br /&#62;
xlabel('Time [\mus]');&#60;/p&#62;
&#60;p&#62;% plot the corresponding amplitude spectrums&#60;br /&#62;
figure;&#60;br /&#62;
plot(f .* 1e-6, as_1 ./ max(as_1(:)), 'k-', ...&#60;br /&#62;
     f .* 1e-6, as_2 ./ max(as_1(:)), 'b-', ...&#60;br /&#62;
     f .* 1e-6, as_3 ./ max(as_1(:)), 'r-');&#60;br /&#62;
legend('Sensor Position 1', 'Sensor Position 2', 'Sensor Position 3');&#60;br /&#62;
xlabel('Frequency [MHz]');&#60;br /&#62;
ylabel('Normalised Amplitude Spectrum [au]');&#60;br /&#62;
f_max = medium.sound_speed / (2 * dx);&#60;br /&#62;
set(gca, 'XLim', [0, f_max .* 1e-6]);
&#60;/p&#62;</description>
		</item>

	</channel>
</rss>
