sgolay函数在MatlabR2013A中是如何工作的?

sgolay函数在MatlabR2013A中是如何工作的?,matlab,filtering,smoothing,derivative,Matlab,Filtering,Smoothing,Derivative,我对MatlabR2013A中的函数有一个问题。我的数据库有165个光谱和2884个变量,我想取它们的一阶和二阶导数。如何定义K和F到sgolay的输入 以下是一个例子: sgolay用于平滑噪声正弦曲线,并将得到的一阶导数和二阶导数与使用diff计算的一阶导数和二阶导数进行比较。请注意使用diff如何放大噪声并生成无用的结果 K = 4; % Order of polynomial fit F = 21; % Window leng

我对MatlabR2013A中的函数有一个问题。我的数据库有165个光谱和2884个变量,我想取它们的一阶和二阶导数。如何定义
K
F
sgolay
的输入

以下是一个例子:

sgolay
用于平滑噪声正弦曲线,并将得到的一阶导数和二阶导数与使用
diff
计算的一阶导数和二阶导数进行比较。请注意使用
diff
如何放大噪声并生成无用的结果

K = 4;                 % Order of polynomial fit
F = 21;                % Window length
[b,g] = sgolay(K,F);   % Calculate S-G coefficients

dx = .2;
xLim = 200;
x = 0:dx:xLim-1;

y = 5*sin(0.4*pi*x)+randn(size(x));  % Sinusoid with noise

HalfWin  = ((F+1)/2) -1;
for n = (F+1)/2:996-(F+1)/2,
  % Zero-th derivative (smoothing only)
  SG0(n) =   dot(g(:,1), y(n - HalfWin: n + HalfWin));

  % 1st differential
  SG1(n) =   dot(g(:,2), y(n - HalfWin: n + HalfWin));

  % 2nd differential
  SG2(n) = 2*dot(g(:,3)', y(n - HalfWin: n + HalfWin))';
end

SG1 = SG1/dx;         % Turn differential into derivative
SG2 = SG2/(dx*dx);    % and into 2nd derivative

% Scale the "diff" results
DiffD1 = (diff(y(1:length(SG0)+1)))/ dx;    
DiffD2 = (diff(diff(y(1:length(SG0)+2)))) / (dx*dx);

subplot(3,1,1);
plot([y(1:length(SG0))', SG0'])
legend('Noisy Sinusoid','S-G Smoothed sinusoid')

subplot(3, 1, 2);
plot([DiffD1',SG1'])
legend('Diff-generated 1st-derivative', 'S-G Smoothed 1st-derivative')

subplot(3, 1, 3);
plot([DiffD2',SG2'])
legend('Diff-generated 2nd-derivative', 'S-G Smoothed 2nd-derivative')

在一个固有的嘈杂过程中获取导数。因此,如果你的数据中已经有一些噪声,事实上,当你取高阶导数时,它会被放大。是将平滑和微分合并为一个操作的非常有用的方法。这是一种通用方法,它计算任意阶导数。不过,也有一些取舍。对于具有特定结构的数据,还存在其他特殊方法

关于你的申请,我没有任何具体的答案。很大程度上取决于数据的性质(采样率、噪声比等)。如果使用太多平滑,则会涂抹数据或产生锯齿。如果使用高阶多项式系数对数据进行过拟合,
K
,情况也是如此。在演示代码中,还应绘制
sin
函数的分析导数。然后使用不同数量的输入噪声和平滑滤波器。如果您能够大致了解真实数据的各个方面,那么这种具有已知确切答案的工具可能会有所帮助。在实践中,我尝试使用尽可能少的平滑,以产生不太嘈杂的导数。通常这意味着一个三阶多项式(
K=3
)和一个尽可能小的窗口大小
F

是的,很多人建议你调整这些参数。然而,最近也有一些关于自动选择系数的研究:(2013年)。Savitzky-Golay还有其他替代方案,例如基于,但您可能需要自己在Matlab中实现它们

顺便说一句,不久前我为
sgolay
写了一个小替换。和你一样,我只需要第二个输出,微分过滤器,
G
,所以它只计算了这些。此功能也更快(约2-4倍):


带有输入验证功能的完整版本是。

感谢文章hockler的解释和说明,但是,作为您建议的推导的一部分,仍然有疑问。我不想结束这部分的编程,你可以向我解释这意味着什么,以及每个公式如何得到我的165个预处理光谱(一阶和二阶导数)。请原谅我的无知和写作,不能用英语写法律。谢谢霍奇勒的帮助,问题解决了。我需要多学习一些关于斯戈莱的知识。对不起。
function G=sgolayfilt(k,f)
%SGOLAYFILT  Savitzky-Golay differentiation filters
s = vander(0.5*(1-f):0.5*(f-1));
S = s(:,f:-1:f-k);
[~,R] = qr(S,0);
G = S/R/R';