我正在尝试使用比例空间实现将 n 高斯曲线拟合到噪声时间序列数字信号(测量电压)中的峰值。 为了测试它,我创建了以下三个高斯噪声的样本总和(0.2 *兰德,对不起没有图片,我是新来的)
amp = [2; 0.9; 1.3];
mu = [19; 23; 28];
sigma = [4.8; 1.3; 2.5];
x = linspace(1,50,1000);
for n=1:3, y(n,:) = A(n)*exp(-(x-B(n)).^2./(2*C(n)^2)); end
noisysignal = y(1,:) + y(2,:) + y(3,:) + 0.2*rand(1,numel(x))
我发现这篇文章http://www.engineering.wright.edu/~agoshtas/GMIP94.pdf是由user355856 answer to thread "Peak decomposition"发布的! 我相信我的代码会生成正确的结果,用于绘制零交叉作为高斯滤波器分辨率 sigma 的函数,但我有两个问题。首先,似乎还需要另一个拟合程序来识别拱截距的近似位置以近似初始峰值sigma和μ值。第二个是尺度空间图的边缘有大量的拱门,绝对不对应任何峰值。我不确定如何有效地筛选这些。最后一点是,在计算二阶导数中心有限差分时使用的是50的间距,因为太多的破坏特征,并且在过零的森林中产生的结果要少得多。有没有更好的方法来过滤它来控制高斯峰尾的随机过零点?
function [crossing] = scalespace(x, y, sigmalimit)
figure; hold on; ylim([0 sigmalimit]);
for sigma = 1:sigmalimit %
yconv = convkernel(sigma, y); %convolve with kernel
xconv = linspace(x(1), x(end), length(yconv));
yconvpp = d2centralfinite(xconv, yconv, 50); % 50 was empirically chosen
num = 0;
for i = 1 : length(yconvpp)-1
if sign(yconvpp(i)) ~= sign(yconvpp(i+1))
crossing(sigma, num+1) = xconv(i);
num = num+1;
end
end
plot(crossing(sigma, crossing(sigma, :) ~= 0),...
sigma*ones(1, numel(crossing(sigma, crossing(sigma, :) ~= 0))), '.');
end
function [yconv] = convkernel(sigma, y)
t = sigma^2;
C = 3; % for kernel truncation
M = C*round(sqrt(t))+1;
window = (-M) : (+M);
G = zeros(1, length(window));
G(:) = (1/(2*pi()*t))*exp(-(window.^2)./(2*t));
yconv = conv(G, y);
这是我的第一篇文章,我提前为任何风格问题道歉。我对编程很新,所以对这个问题中提供的编程风格或信息的任何建议都会非常感激。我还阅读了Amro关于matlab's GMM function的答案!如果有人认为这是一种更有效的方法来建模数字信号中的多个高斯。
谢谢!