简介
本文总结了一部分我在科研工作中常用的一些自定义的 MATLAB 函数,每个函数均有详细的帮助文档和注释,可供大家参考。详细内容可参考右侧的目录,同时每个函数均提供源代码以及相应的 .m 文件。将该 .m 文件放到你的 MATLAB 的工作目录下即可直接调用之,而且输入 help 函数名 命令还可以查看对应函数的帮助文档。
函数列表
fft_plot —— 快速绘制信号的频谱图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 function [f, P1] = fft_plot (X, Fs, varargin) p = inputParser; addRequired(p, 'X' ); addRequired(p, 'Fs' ); addOptional(p, 'is_hamming' , 1 ); addOptional(p, 'is_padding' , 1 ); parse(p, X, Fs, varargin{:}); w = ones (size (p.Results.X)); L = length (p.Results.X); if p.Results.is_hamming w = reshape (hamming(L), size (p.Results.X)); end if p.Results.is_padding L = 2 ^ (nextpow2 (L) + 1 ); end Y = fft(w .* p.Results.X, L); P2 = abs (Y/L); P1 = P2(1 :L/2 +1 ); P1(2 :end -1 ) = P1(2 :end -1 ) * 2 ; f = p.Results.Fs * (0 :L/2 )/L; plot (f, P1); title('Single-Sided Amplitude Spectrum' ); xlabel('f (Hz)' ); ylabel('|P1(f)|' ); end
light_spot —— 提取图像的荧光点信号
点击下载 .m 文件
该函数主要通过形态学开运算来提取荧光成像图中的荧光亮点信号,同时调整参数之后也可以用来提取图像中较为明亮的前景信号以去除背景噪声。源代码参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function img_filtered = light_spot (img, disk_radius, threshold) img2 = imtophat(img, strel('disk' , disk_radius)); img3 = imadjust(img2, [0 , 0.1 ], [0 , 1 ]); img_filtered = img3 .* uint8(img3 > 255 * threshold);end
generate_plane_signal —— 产生无限大平板的光声仿真信号
点击下载 .m 文件
该函数产生 δ \delta δ 脉冲激发的无限大平板的光声信号,使用的仿真公式如下所示:
p ( z , t ) = p 0 2 [ u ( z − c t + d 2 ) u ( − z + c t + d 2 ) + u ( z + c t + d 2 ) u ( − z − c t + d 2 ) ] p(z,t)=\frac{p_0}{2}\left[u(z-ct+\frac{d}{2})u(-z+ct+\frac{d}{2})+u(z+ct+\frac{d}{2})u(-z-ct+\frac{d}{2})\right]
p ( z , t ) = 2 p 0 [ u ( z − c t + 2 d ) u ( − z + c t + 2 d ) + u ( z + c t + 2 d ) u ( − z − c t + 2 d ) ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function signal = generate_plane_signal (D, r, vs, t) u = @(x) double(x > 0 ); signal = (u(r - vs * t + D / 2 ) .* u(-r + vs * t + D / 2 ) + ... u(r + vs * t + D / 2 ) .* u(-r - vs * t + D / 2 )) / 2 ;end
generate_sphere_signal —— 产生球的光声仿真信号
点击下载 .m 文件
该函数产生 δ \delta δ 脉冲激发的球的光声信号,使用的仿真公式如下所示:
p ( r , t ) = p 0 r − c t 2 r u ( R − ∣ r − c t ∣ ) p(r,t)=p_0\frac{r-ct}{2r}u(R-|r-ct|)
p ( r , t ) = p 0 2 r r − c t u ( R − ∣ r − c t ∣ )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function signal = generate_sphere_signal (R, r, vs, t) u = @(x) double(x > 0 ); signal = (r - vs * t) / (2 * r) .* u(R- abs (r - vs * t));end
generate_sphere_signal_diff —— 产生球的光声仿真信号的时间导数
点击下载 .m 文件
该函数产生 δ \delta δ 脉冲激发的球的光声信号的时间导数。源代码参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function signal_diff = generate_sphere_signal_diff (R, r, vs, t) u = @(x) double(x > 0 ); signal_diff = -vs / (2 * r) .* u(R- abs (r - vs * t));end
generate_cylinder_signal —— 产生无限长圆柱的光声仿真信号
点击下载 .m 文件
该函数产生 δ \delta δ 脉冲激发的无限长圆柱的光声信号。源代码参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 function signal = generate_cylinder_signal (R, r, vs, t) N = length (t); signal = zeros (1 , N); for i = 1 :N ti = t(i ); d = vs * ti; if ti <= (r - R) / vs signal(i ) = 0 ; elseif ti > (r - R) / vs && ti < (r + R) / vs low = (r - R) / d; high = (r^2 + d^2 - R^2 ) / (2 * r * d); y = @(x) atan (abs (sqrt ((R^2 - (r - d * x).^2 ) ./ ... (r^2 + d^2 - 2 * r * d * x - R^2 )))); signal(i ) = 4 * d^2 * integral(y, low, high) + ... pi * d / r * (R^2 - (r - d)^2 ); elseif ti >= (r + R) / vs low = (r - R) / d; high = (r + R) / d; y = @(x) atan (abs (sqrt ((R^2 - (r - d * x).^2 ) ./ ... (r^2 + d^2 - 2 * r * d * x - R^2 )))); signal(i ) = 4 * d^2 * integral(y, low, high); end signal(i ) = signal(i ) / d; end temp = diff(signal) / (t(2 ) - t(1 )) / (4 * pi * vs^2 ); signal(1 :N - 1 ) = temp; signal(N) = signal(N - 1 );end
recon_pact_signal —— 使用 DAS 算法重建光声信号
点击下载 .m 文件
该函数使用 delay and sum(DAS)算法来重建光声信号,只要按给定的参数格式输入即可。将之微改之后即可用于 GPU 加速的 CUDA 代码的原始代码进行编写,是一个高度结构化的 DAS 算法的实现。源代码参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 function signal_recon = recon_pact_signal ( ... signal_backproj, detector_location, x_grid, y_grid, z_grid, ... vs, fs, num_detector, num_time) signal_recon = 0 * x_grid; for i = 1 :num_detector temp_signal = signal_backproj(i , :); temp_location = detector_location(i , :); temp_signal(num_time) = 0 ; dx = x_grid - temp_location(1 ); dy = y_grid - temp_location(2 ); dz = z_grid - temp_location(3 ); d = sqrt (dx.^2 + dy.^2 + dz.^2 ); idx = round (d / vs * fs); idx(idx > num_time) = num_time; if idx < num_time signal_recon = signal_recon + temp_signal(idx); end end end
To Be Continued…