我已经完成了一些测量,它应该是一个阻尼正弦波,但我找不到任何关于如何使用 Matlab 的曲线拟合工具制作(如果可能的话)良好阻尼正弦波的信息。
这是我使用“平滑样条曲线”得到的结果:
图片 http://s21.postimg.org/yznumla1h/damped.png。
编辑 1:这是我使用“自定义方程”选项得到的结果:
编辑 2:我已将数据以 csv 格式上传到pastebin,其中第一列是幅度,第二列是时间。
我已经完成了一些测量,它应该是一个阻尼正弦波,但我找不到任何关于如何使用 Matlab 的曲线拟合工具制作(如果可能的话)良好阻尼正弦波的信息。
这是我使用“平滑样条曲线”得到的结果:
图片 http://s21.postimg.org/yznumla1h/damped.png。
编辑 1:这是我使用“自定义方程”选项得到的结果:
编辑 2:我已将数据以 csv 格式上传到pastebin,其中第一列是幅度,第二列是时间。
可以使用以下代码创建阻尼 sin 函数:
f=f*2*pi;
t=0:.001:1;
y=A*sin(f*t + phi).*exp(-a*t);
plot(t,y);
axis([0 1 -2.2 2.2]);
现在您可以使用 matlab 中的“cftool”并加载您的数据,然后将方程类型设置为自定义并输入阻尼 sin 函数的公式。在这里你可以看到我到目前为止发现的......
我认为数据的分布使得拟合工具很难很好地拟合。它可能需要更多数据或更多分布式数据。此外,还有其他工具和方法,例如现在检查一下:docstoc.com/docs/74524947/Mathcad-Damped-sine-fit-mcd
对于所有这些实际尝试搜索和找到局部最优值的方法(对于每个拟合参数),最重要的是初始条件。我相信如果你选择了一个好的初始条件(初始猜测),拟合工具就会很好地工作。
祝你好运
我不会为此使用曲线拟合工具箱,我会使用曲线拟合函数,例如lsqcurvefit
. 这是我不久前做的一个例子:
% Define curve model functions
expsin = @(a, f, phi, tau, t)a * sin(omega * t + phi) .* exp(-tau * t);
lsqexpsin = @(p, t)expsin(p(1), p(2), p(3), p(4), t);
% Setup data params
a = 1; % gain
f = 10; % frequency
phi = pi/2; % phase angle
tau = 0.9252523;% time constant
fs = 100; % sample rate
N = fs; % length
SNR = 10; % signal to noise ratio
% Generate time vector
dt = 1/fs;
t = (0:N-1)*dt;
omega = 2 * pi * f; % angular freq
noiseGain = 10^(-SNR/20); % gain for given SNR
% Generate dummy data: decaying sinusoid plus noise
x = expsin(a, omega, phi, tau, t);
noise = noiseGain * rand(size(x));
noise = noise - mean(noise);
x = x + noise;
close all; figure; hold on;
plot(t, x, 'k-', 'LineWidth', 2);
% Count zero crossings to find frequency
zCross = find(x(1:end-1) .* x(2:end) < 0);
T = mean(diff(zCross) * dt) * 2;
fEstimate = 1 / T;
omegaEstimate = 2 * pi * fEstimate;
% Fit model to data
init = [0.5, omegaEstimate, 0, 0.5];
[newparams, err] = lsqcurvefit(lsqexpsin, init, t, x);
plot(t, lsqexpsin(newparams, t))
这里生成了一些参数已知的数据,并添加了一些随机噪声;绘制数据。这些参数[a, phi, tau]
是根据数据和一条曲线估计的,估计的参数绘制在顶部。