Matlab查找给定频率的阻尼正弦波衰减因子

时间:2013-08-12 17:02:35

标签: matlab equation sine

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

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

我想解决“d”的上述等式

1 个答案:

答案 0 :(得分:3)

首先需要找到振荡功能的包络(对正弦进行幅度调制的功能)。这可以通过例如完成。通过整流信号然后进行低通滤波,但我选择做一个快速而肮脏的运行最大值。找到信封后,有多种方法可以拟合指数函数。我再次选择了一个快速而又肮脏的技巧来对信封的日志进行第一次订购。下面的代码适用于您提供的简单示例,但如果您有偏移,如果选择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更为常见。