假设FFT结果有误

时间:2015-04-07 06:32:52

标签: matlab fft

我有一个调音台,我想从输出时域信号中提取频率。输出时域信号为:

Vd = (Rd/(33e3+Rd))*(Vrf*sin(Wrf*t)+Vlo*sin(Wlo*t));
y_t = 11*Vd;
func_ = y_t;

其中:

Vrf=27e-3;
Vlo=140e-3;
Frf=10e6;
Flo=9.9e6;
Wrf=Frf*2*pi;
Wlo=Flo*2*pi;
Rd = 70;

我试图通过以下循环从时域信号计算傅里叶系数:

order_max=10;
f_ = 0;
for m = -1*order_max:order_max
    for n = -1*order_max:order_max
        if (m*Wrf+n*Wlo <= 0);
        continue;
    end

    k = (m*Frf+n*Flo)*T0;

    f_ = f_ + 1;

    Func(f_) = integral(@(t)subs(func_).*exp(-1i*2*pi*k*t/T0), -T0/2, T0/2)/T0;
    f(f_) = k/T0;

end

时域信号如下: 1

,系数为: 2

从傅立叶系数可以看出,与时域信号相比,1e5的频率幅度非常低。

我认为傅里叶系数和时域信号不匹配!

请你帮我找出问题吗?

1 个答案:

答案 0 :(得分:0)

1e5频率分量的幅度非常低,因为信号在该频率下不包含大量能量, 事实上,信号由参数Flo=9.9e6Frf=10e6指定的频率下的两个频率分量组成。 请注意,这两个频率确实出现在频率图中,它们的幅度似乎也与时间信号正弦系数相对应:

> 11*(Rd/(33e3+Rd))*[Vrf Vlo]
ans =

  6.2867e-004  3.2598e-003

相应地,频率成分是:

> abs(Func(find(abs(f-10e6)<1)))  % Frf component
ans =   6.2867e-004
> abs(Func(find(abs(f-9.9e6)<1))) % Flo component
ans =   0.0032598

您可能会考虑将时间信号中的1e5分量视为来自信号的信封,该信号显示为频率为1e5的节拍。

如图所示,如果我们使用非常简单的Envelope detector来计算包络:

func y = envelopedetector(x)
  k = 0.999; % decay factor
  y(1) = x(1);
  for i=2:length(x)
    if (x(i) > y(i-1))
      y(i) = x(i);
    else
      y(i) = k*y(i-1);
    end
  end
end

我们得到的红色曲线覆盖在你的时间信号图上:

time-signal with envelope overlapped

如果我们然后计算包络信号的傅立叶系数,我们确实得到了1e5的分量(注意该图没有显示0处的另一个重要分量,它对应于DC偏差):

frequency components

现在,由于您提到了FFT,因此可以通过FFT获得傅立叶系数的近似值。 回顾傅立叶系数由下式给出:

Fourier coefficients

并且将基本周期T 0 分成N个样本,可以近似积分(随着N增加越来越准确的近似):

Fourier coefficients approximation

与离散傅立叶变换密切相关。因此,在基本周期内评估func_时,傅立叶系数近似为:

T0      = 1e-5;
t       = [0:N-1]*T0/N;
y       = func_(t);
Func    = fft(y)*2/N;
Func(1) = 0.5*Func(1); % scaling factor is 1/N (instead of 2/N) for f=0