2014-04-04 33 views
2

我正在分析一个时间信号,我想要应用FFT来获取频域中的信号分量。 但是,我似乎有问题的是,我的信号持续时间相对较短,为t_end。由于这个原因,我的频率仓大小dohm非常大。我希望在不增加信号持续时间的情况下缩小我的分辨率。在matlab中获得更精细的FFT

这里是我的简化代码:

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的唯一途径是品尝较长区间的信号,但我很遗憾,我没能做到这一点在我的情况。还有其他选择吗?

谢谢!

回答

4

不,这是不可能的,因为frequency_resolution = 1/window_duration。这是一个你无法解决的数学极限。举个例子,假设你有1000秒采样1秒的数据。 FFT所做的或多或少的是:这个信号有多少可以用有274次振荡的正弦/余弦来重建,多少有一次有275次振荡,276次等等。这个计算的结果是频率为274,275和276 Hz,因此您的频率分辨率为1 Hz。如果您要测量相同的信号10秒钟,FFT可以尝试2740,2741和2742振荡,这对应于274.0,274.1和274.2Hz的信号,因此您的分辨率为0.1Hz。您可以尝试在FFT中使用零填充进行播放,但这只会给您“假分辨率”,它会在您使用标准FFT获得的点之间产生某种平滑插值。

1

您可以对数据进行零填充并使用更长的FFT来获得更精细的FFT结果箱间距,但这并不能为您提供更精细的不同频率分量之间的分辨率,更多的插值绘图点以及可能更好的峰值插值(取决于信噪比)。由于孤立的窄带频谱频率远高于低噪底(远离DC和Fs/2),所以频率分辨率不是真的(1/window_duration),可以测量到更精细的分辨率(可能到0.1 /持续时间),使用FFT结果的高质量插值方法,根据窗口形状,谱线对可能需要2.0 /窗口时间或更长时间,以分解为2个峰值。