0

如何在matlab中找到给定频率的阻尼正弦波的衰减常数值?

t=0:1e-6:0.1;
f= 500000;
y=sin(2*pi*f*t).*exp(-d*t);

我想为“d”求解上述方程

4

1 回答 1

4

您首先需要找到振荡函数的包络(对正弦进行幅度调制的函数)。这可以通过例如整流信号然后低通滤波来完成,但我选择做一个快速和肮脏的运行最大值。找到包络后,有多种方法可以拟合指数函数。我再次选择了一个快速而肮脏的技巧来对信封的原木进行一阶 polyfit。下面的代码适用于您提供的简单示例,但如果您有偏移、选择n错误等,则可能无法使用。在嘈杂的测量中,它也不会给出最佳结果。

fsamp = 1e5;
tmax = 0.1;
t=0:1/fsamp:tmax;
f = 12e3; %should be smaller than fsamp/2!
tau = 0.0765;
y=sin(2 * pi * f * t) .* exp(-t / tau);

%calculate running maximum
n = 20; %number of points to take max over
nblocks = floor(length(t) / n);
trun = mean(reshape(t(1:n*nblocks), n, nblocks), 1); %n-point mean
envelope = max(reshape(y(1:n*nblocks), n, nblocks), [], 1); %n-point max

%quick and dirty exponential fit, not the proper way in case of noise
p = polyfit(trun, log(envelope), 1);
tau_fit = -1/p(1);
k_fit = exp(p(2));

plot(t, y, trun, envelope, 'or', t, k_fit * exp(-t / tau_fit), '-k')
title(sprintf('tau = %g', tau))

请注意,随着指数衰减,更常见的是定义时间常数tau = 1 / d

于 2013-08-12T17:53:57.207 回答