激光雷达信号处理(1)Gm-APD信号提取
前言
最近在学习激光雷达信号处理领域相关的研究,通过文献阅读和资料搜集,Gm-APD信号通常具有特定的噪声和信号特征,而类高斯匹配滤波,极大似然估计等算法可用于增强信号或抑制噪声来进行信号提取,再通过十字邻域方法进行去噪,可以有效提高目标信号的信噪比,通过仿真实验进行测试,这里将示例分享给大家,MATLAB版本为MATLAB2018a。
一. MATLAB仿真-类高斯匹配滤波(1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:基于加权一阶类高斯匹配滤波的Gm-APD信号提取算法
%环境:Win7,Matlab2018a
%Modi: C.S
%时间:2025-3-28 16:56:27
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% I. 清空环境变量
clear all
clc
tic
% 生成模拟的Gm - APD信号
t = 0:0.01:10; % 时间向量
signal = sin(2*pi*0.5*t) + 0.5*sin(2*pi*2*t); % 模拟信号
noise = 0.2*randn(size(t)); % 高斯噪声
noisy_signal = signal + noise; % 含噪信号
% 定义加权一阶类高斯匹配滤波器参数
tau = 1; % 时间常数
t_filter = -5:0.01:5; % 滤波器时间向量
filter = (1/tau) * exp(-t_filter/tau) .* (t_filter >= 0); % 一阶类高斯匹配滤波器
weight = exp(-(t_filter.^2)/(2*(0.5^2))); % 加权函数
weighted_filter = weight .* filter; % 加权一阶类高斯匹配滤波器
% 归一化滤波器
weighted_filter = weighted_filter / sum(weighted_filter);
% 应用加权一阶类高斯匹配滤波器
extracted_signal = conv(noisy_signal, weighted_filter, 'same');
% 绘制结果
figure;
subplot(3,1,1);
plot(t, signal);
title('原始信号');
xlabel('时间 (s)');
ylabel('幅值');
subplot(3,1,2);
plot(t, noisy_signal);
title('含噪信号');
xlabel('时间 (s)');
ylabel('幅值');
subplot(3,1,3);
plot(t, extracted_signal);
title('提取的信号');
xlabel('时间 (s)');
ylabel('幅值');
toc
二. MATLAB仿真-极大似然估计(2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:基于极大似然估计算法的Gm-APD信号提取算法
%环境:Win7,Matlab2018a
%Modi: C.S
%时间:2025-3-28 17:03:42
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% I. 清空环境变量
clear all
clc
tic
% 模拟 Gm - APD 信号
t = 0:0.01:10; % 时间向量
signal = sin(2*pi*0.5*t) + 0.5*sin(2*pi*2*t); % 模拟信号
% 添加噪声
noise = 0.2*randn(size(t)); % 高斯噪声
noisy_signal = signal + noise; % 含噪信号
% 极大似然估计
% 假设信号是由正弦波组成,我们可以通过优化来估计正弦波的参数
% 定义目标函数,这里我们最小化含噪信号与估计信号之间的误差平方和
fun = @(params) sum((noisy_signal - (params(1)*sin(2*pi*params(2)*t) + params(3)*sin(2*pi*params(4)*t))).^2);
% 初始参数猜测
initial_params = [1, 0.5, 0.5, 2];
% 使用 fminsearch 进行优化
estimated_params = fminsearch(fun, initial_params);
% 根据估计的参数生成提取的信号
extracted_signal = estimated_params(1)*sin(2*pi*estimated_params(2)*t) + estimated_params(3)*sin(2*pi*estimated_params(4)*t);
% 绘制结果
figure;
subplot(3,1,1);
plot(t, signal);
title('原始信号');
xlabel('时间 (s)');
ylabel('幅值');
subplot(3,1,2);
plot(t, noisy_signal);
title('含噪信号');
xlabel('时间 (s)');
ylabel('幅值');
subplot(3,1,3);
plot(t, extracted_signal);
title('提取的信号');
xlabel('时间 (s)');
ylabel('幅值');
toc
三. MATLAB仿真-十字邻域去噪(3)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:基于十字邻域的Gm-APD信号去噪算法
%环境:Win7,Matlab2018a
%Modi: C.S
%时间:2025-3-28 18:47:27
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% I. 清空环境变量
clear all
clc
tic
% 示例使用
% 生成一些示例数据(这里简单用随机数据模拟 Gm - APD 信号数据)
data = rand(100, 100);
% 调用去噪函数
denoised_data = cross_neighborhood_denoising(data);
% 显示原始数据和去噪后的数据
figure;
subplot(1, 2, 1);
imshow(data, []);
title('原始数据');
subplot(1, 2, 2);
imshow(denoised_data, []);
title('去噪后的数据');
toc
function denoised_data = cross_neighborhood_denoising(data)
% 获取数据的大小
[rows, cols] = size(data);
% 初始化去噪后的数据
denoised_data = zeros(rows, cols);
% 遍历数据中的每个像素
for i = 1:rows
for j = 1:cols
% 处理边界像素
if i == 1
up = data(i, j);
else
up = data(i - 1, j);
end
if i == rows
down = data(i, j);
else
down = data(i + 1, j);
end
if j == 1
left = data(i, j);
else
left = data(i, j - 1);
end
if j == cols
right = data(i, j);
else
right = data(i, j + 1);
end
% 计算十字邻域的平均值
denoised_data(i, j) = (up + down + left + right + data(i, j)) / 5;
end
end
end
四. 小结
数字信号处理中,一般的带噪数据,不同的噪声背景,所呈现的噪声特性不同,需结合实际场景进行噪声特性分析建模,通过需找到一个较为拟合的去噪模型,则可以将数据中的噪声部分进行一般性去除,从而保留更多真实信号的信息。再通过不同的去噪算法,进一步将目标信号数据提纯,则可以得到可以进行下一步检测跟踪识别的数据,这里有线性滤波与非线性滤波等许多不同的算法值得检验测试,本示例仅作参考,后期可能会用到,所以这里做个笔记。每天学一个算法小知识,大家一起来学习进步阿!