在matlab中获得更精确的FFT精度

时间:2014-04-04 08:39:48

标签: matlab signal-processing fft

我正在分析一个时间信号,我想应用FFT来获取频域中的信号分量。 但是,我似乎遇到的问题是我的信号持续时间相对较短t_end。由于这个原因,我的频率仓大小dohm非常大。我想在不增加信号持续时间的情况下缩小箱尺寸。

这是我的简化代码:

Fs = 100;           %Sampling frequency
Ts = 1/Fs;          %Sample time
t_end = 50;         %End time
t = 0:Ts:t_end;

A = 5;
B = 3;
C = 4;

for ii = 1:length(t)
    x(ii) = A*cos(4*t(ii))+B*sin(3*t(ii))+C*sin(2*t(ii));       %Random signal
end

xdft = fft(x);                              % Fast Fourier Transfrom
freq = 0:Fs/length(x):Fs/2;                 % The signal is symmetric; the second half is neglected
xdft1 = xdft(1:length(x)/2+1)./length(x);   % Again second half is neglected

Ohm = 2*pi*freq;                            % x-axis transformation to rad/s
dohm = Ohm(2)-Ohm(1);                       % frequency bin size in rad/s
dft = abs(xdft1);                           % Take the absolute value, these are the heave amplitue spectrum values

似乎减少频率仓大小dohm的唯一方法是对信号进行较长时间的采样,但遗憾的是我无法在我的情况下执行此操作。还有其他选择吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

不,这是不可能的,因为frequency_resolution = 1 / window_duration。这是一个你无法解决的数学限制。例如,假设您有1秒的数据以1000 Hz采样。 FFT的作用或多或少:这个信号有多少可以用一个有274个振荡的正弦/余弦重建,一个有275个振荡多少,276个等等。这个计算的结果是分档为274,275和276 Hz,因此您的频率分辨率为1 Hz。如果您在10秒内测量相同的信号,则FFT可以尝试2740,2741和2742次振荡,这对应于274.0,274.1和274.2 Hz的信号,因此您的分辨率为0.1 Hz。

您可以尝试在FFT中使用零填充,但这只会给您“伪分辨率”,它会在您使用标准FFT获得的点之间产生某种平滑插值。

答案 1 :(得分:1)

您可以对数据进行零填充并使用更长的FFT来获得更精细的FFT结果区间距,但这不会真正为您提供更精细的分辨率,不同的频率分量,更多的插值绘图点和可能更好的峰值插值(取决于信噪比。)

频率分辨率并非真正(1 / window_duration),因为隔离的窄带频谱峰值远高于低噪声基底(远离DC和Fs / 2)可以测量到更精细的分辨率(可能是0.1 /持续时间)使用具有FFT结果的高质量插值方法,并且谱线对可能需要2.0 / window_duration或更多时间(取决于窗口形状),以解析为2个分离的峰值。